2015-01-09 54 views
4
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)。无论如何。过去我已经使用这个解决方案来处理小型项目,但对于当前的解决方案,这是不可接受的。

回答

2

正如MadScientist指出(谁更好)我错过了明显的解决这个问题。

解决的办法是对FORCESubfolder/lib.a的目标总是尝试。并且只要Subfolder生成文件只在更新lib.a时发生了某些更改,其余部分将会正确退出。

所以你想为你的Subfolder/lib.a目标以下。其余的可以保持原样。如前所述,这里的技巧是,您可以强制make运行Subfolder/lib.a目标本身,但如果Subfolder/lib.a,文件的时间戳未更改,那么将Subfolder/lib.a作为先决条件列出的内容不需要重新构建。

FORCE: ; 

Subfolder/lib.a: FORCE 
     $(MAKE) -C $(@D) target-to-build-lib.a* 
+0

为什么要打扰“if .. -q ...”?如果问题的答案是“运行真正的品牌”,那么您应该始终运行它......结果将是相同的,只运行一次而不是两次就会快很多。 – MadScientist

+0

@MadScientist获取“做它更新”的信息。它可以通过手动时间戳检查或通过在“Subfolder/lib.a”上保留先决条件来避免,并相信make会正确检测到它(但我不知道这实际上是一个有效的计数在检查时间戳时进行比赛等)。但是事实并非如此,我并没有想到子制造变得缓慢。如果速度不是很快,那么手动时间戳检查每次都会赢得一英里。 –

+1

其实我不明白这个问题。为什么不直接让最上面的makefile依赖Subfolder/lib.a,并使用FORCE规则来确保它已被尝试?如果库是最新的,则子库不会更改库的时间戳,所以顶级库不会重新生成。 – MadScientist