如何处理递归Makefile调用的依赖?

时间:2014-09-09 06:12:08

标签: makefile

我有一个由相当多的源文件组成的C项目,为了理解它们,我将它们放入子目录(带子目录)。但是,整个项目只产生一个可执行文件。

为了构建这个项目,我使用递归Makefile,其中每个非顶层目录中的Makefile将该目录中生成的所有目标文件链接到一个连接的lib.o文件中(使用{{1 }}, 那是)。我确实有一个可以构建它的Makefile系统并且它的功能相当好,但是它不能支持并行ld -r,我想修复它。

问题在于我无法找到一种强制方法同时强制make下降到每个目录的子目录中,但是本地make目标依赖于该目标而不会被强制重建,即使一切都没有改变。

这是它的工作原理,略有缩写(省略lib.o和诸如此类的东西):

CFLAGS

这是来自所有其他Makefile包含的default: build SUBOBJECTS = $(patsubst %,%/lib.o,$(SUBDIRS)) .PHONY: $(SUBDIRS) $(SUBDIRS): @$(MAKE) -C $@ build: $(SUBDIRS) lib.o lib.o: $(OBJECTS) $(SUBOBJECTS) $(LD) $(LDFLAGS) -r -o $@ $^ 。每个其他Makefile也会定义自己的Makefile.commonSUBDIRS。它可能看起来像这样,例如:

OBJECTS

从中可以看出,主要目标实际上是SUBDIRS = dir1 dir2 OBJECTS = object1.o object2.o include ../Makefile.common # Or ../../Makefile.common, &c. 目标,它取决于子目录和build。如果我在此上调用并行lib.o,它将不知道makelib.o已经在子目录上递归运行之前无法构建,并且有时会尝试,导致错误。但是,如果我使make依赖于子目录,则在每个目录中的每次调用时都会不必要地重建lib.o

有没有办法解决这个问题?我已经在这方面破坏了我的大脑很长一段时间而没有找到出路。我只使用GNU lib.o,所以不要太担心POSIX兼容。

0 个答案:

没有答案