Gnu Make:如何处理子项目

时间:2015-01-09 14:55:18

标签: c++ makefile gnu-make

ProjFolder
 \ 
  Subfolder
    sources.cpp
    makefile
makefile

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 $@

正如您所看到的,如果更改了Subfolder的最终产品 - 文件lib.a,则会调用Subfolder生成文件以重新生成它,然后所有产品都会被链接进入最终的闪光图像。

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


这是一个解决方案。

.PHONY all $(NAME).elf

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

2 个答案:

答案 0 :(得分:2)

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

解决方案是始终尝试FORCE Subfolder/lib.a目标。只要Subfolder 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*

答案 1 :(得分:0)

你也可以尝试将你的东西放在一个子文件夹中(例如Mystuff)和它自己的makefile。然后你可以按照

的方式编写一个顶级的makefile
all: Mystuff
Mystuff: Subfolder

Subfolder Mystuff:
    ${MAKE} -C $@

但是,Recursive Make Considered Harmful:)