【发布时间】:2012-06-05 04:44:49
【问题描述】:
我正在为一个项目编写一个 makefile 框架。比如说,我在顶层目录中有一个 main.c,还有许多子目录,每个子目录都包含一个 C 文件。为了将所有目标文件链接到goter,我在顶部的makefile中分配了一个初始值:
export TARGET_LIST := main.o
在每个子目录中,我将它们附加到列表中:
# sub1/Makefile
TARGET := a.o
TARGET_LIST += $(TARGET)
返回顶层目录时,TARGET_LIST 仍然在 main.o 中。我确定所有子目录都已输入。有什么好办法吗?
顶级makefile:
all: main
export TOP_DIR = $(shell pwd)
export TARGET_LIST := main.o
SUBDIRS := a b c d
CFLAGS := -Iinc
all:main
main:main.o subdirs
cc $(TARGET_LIST) -o $@ $(CFLAGS)
subdirs: $(patsubst %, _dir_%, $(SUBDIRS))
$(patsubst %, _dir_%, $(SUBDIRS)) :
$(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)
Rules.make:
all:$(TARGET)
%.o:%.c
@echo $(TARGET_LIST)
$(CC) -c $^ -o $@ $(CFLAGS) $(LDFLAGS)
子目录makefile:
TARGET := a.o
TARGET_LIST += $(TARGET)
CFLAGS :=
LDFLAGS :=
include $(TOP_DIR)/Rules.make
【问题讨论】:
-
export不是makefile的正常部分。如果顶级 makefile 读取每个子目录 makefile,您也许可以做一些事情,但如果顶级 makefile 运行make的新副本,则新的make没有简单的方法来提供信息回到原来的makefile。 -
不同子目录下的源文件是否可以同名,例如
sub1/a.c和sub2/a.c? -
感谢乔纳森·莱弗勒!我正在考虑现在使用 include。
-
对于不同目录下的同名文件,这确实是个问题……也许我们要为每个目标文件添加路径。
标签: makefile