ProjFolder
\
Subfolder
sources.cpp
makefile
makefile
Subfolder
应该是一个单独的外部回购,在检出项目时拉入。当我打电话make all
到顶层Makefile,下面的食谱得到执行:Gnu Make:如何处理子项目
all: $(NAME).elf $(NAME).s19 $(NAME).hex
$(NAME).elf: $(OBJECTS) $(LDSCRIPT) Subfolder/lib.a
make -C CppAudioPeriphs all
@ echo "...linking"
$(CC) $(OBJECTS) Subfolder/lib.a $(LDFLAGS) $(LIBS) -o [email protected]
正如你可以看到,如果Subfolder
最终产品 - 文件lib.a
改变时,Subfolder
makefile文件被调用,以重制它,然后所有产品都链接到最终的Flash映像中。
问题是订单。 我想总是先调用子makefile。它知道何时以及如何重拍lib.a
。然后检查是否修改了lib.a
以确定是否重制$(NAME).elf。
这是一个解决方案。
.PHONY all $(NAME).elf
这只是指示make
重拍$(NAME)。无论如何。过去我已经使用这个解决方案来处理小型项目,但对于当前的解决方案,这是不可接受的。
为什么要打扰“if .. -q ...”?如果问题的答案是“运行真正的品牌”,那么您应该始终运行它......结果将是相同的,只运行一次而不是两次就会快很多。 – MadScientist
@MadScientist获取“做它更新”的信息。它可以通过手动时间戳检查或通过在“Subfolder/lib.a”上保留先决条件来避免,并相信make会正确检测到它(但我不知道这实际上是一个有效的计数在检查时间戳时进行比赛等)。但是事实并非如此,我并没有想到子制造变得缓慢。如果速度不是很快,那么手动时间戳检查每次都会赢得一英里。 –
其实我不明白这个问题。为什么不直接让最上面的makefile依赖Subfolder/lib.a,并使用FORCE规则来确保它已被尝试?如果库是最新的,则子库不会更改库的时间戳,所以顶级库不会重新生成。 – MadScientist