Gnu Make:如何处理子项目

Vor*_*rac 6 c++ makefile gnu-make

ProjFolder
 \ 
  Subfolder
    sources.cpp
    makefile
makefile
Run Code Online (Sandbox Code Playgroud)

Subfolder应该是一个单独的外部存储库,在检查项目时拉入。当我调用make all顶级 makefile 时,将执行以下配方:

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 $@
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,如果Subfolder文件的最终产品lib.a发生更改,Subfolder则会调用 makefile 来重新制作它,然后所有产品都会链接到最终的 Flash 映像中。

问题是顺序。我想总是首先调用子makefile。它知道何时以及如何重制lib.a。然后检查是否lib.a被修改以确定是否重新制作$(NAME).elf。


这是一种解决方案。

.PHONY all $(NAME).elf
Run Code Online (Sandbox Code Playgroud)

这只是指示make无论如何都要重新制作 $(NAME).elf 。我过去曾在小型项目中使用过这种解决方案,但对于当前的项目来说,这是不可接受的。

Eta*_*ner 2

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

解决方案是始终尝试的目标FORCESubfolder/lib.a只要Subfoldermakefile 仅lib.a在某些内容发生更改时更新,其余部分就会正确出现。

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

FORCE: ;

Subfolder/lib.a: FORCE
        $(MAKE) -C $(@D) target-to-build-lib.a*
Run Code Online (Sandbox Code Playgroud)