我有一个由相当多的源文件组成的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.common
和SUBDIRS
。它可能看起来像这样,例如:
OBJECTS
从中可以看出,主要目标实际上是SUBDIRS = dir1 dir2
OBJECTS = object1.o object2.o
include ../Makefile.common # Or ../../Makefile.common, &c.
目标,它取决于子目录和build
。如果我在此上调用并行lib.o
,它将不知道make
在lib.o
已经在子目录上递归运行之前无法构建,并且有时会尝试,导致错误。但是,如果我使make
依赖于子目录,则在每个目录中的每次调用时都会不必要地重建lib.o
。
有没有办法解决这个问题?我已经在这方面破坏了我的大脑很长一段时间而没有找到出路。我只使用GNU lib.o
,所以不要太担心POSIX兼容。