c – Gnu Make:如何处理子项目

ProjFolder
 \ 
  Subfolder
    sources.cpp
    makefile
makefile

子文件夹应该是一个单独的外部仓库,在签出项目时拉入.当我调用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 $@

如您所见,如果更改了子文件夹的最终产品 – 文件lib.a,则会调用Subfolder makefile以重新制作它,然后将所有产品链接到最终的Flash图像中.

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

这是一个解决方案.

.PHONY all $(NAME).elf

这只是指示make重拍$(NAME).elf无论如何.我过去曾使用过这个解决方案用于小型项目,但对于目前的解决方案,这是不可接受的.

最佳答案 正如MadScientist(以及谁更好)所指出的那样,我错过了解决这个问题的明显方法.

解决方案是永远尝试FORCE Subfolder / lib.a目标.并且只要子文件夹makefile仅在某些内容发生更改时更新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*
点赞