Gnu Make:如何处理子项目

Gnu Make: how to handle sub-projects

本文关键字:处理 子项目 何处理 Make Gnu      更新时间:2023-10-16
ProjFolder
  
  Subfolder
    sources.cpp
    makefile
makefile

Subfolder应该是一个单独的外部存储库,在签出项目时拉入。当我调用make all到顶级生成文件时,将执行以下配方:

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以重新制作它,然后所有产品都将链接到最终的Flash映像中。

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


这是一个解决方案。

.PHONY all $(NAME).elf

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

正如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*

你可以尝试把你的东西放在一个子文件夹中(例如Mystuff),它有自己的makefile。然后,您可以按照以下行编写顶级生成文件

all: Mystuff
Mystuff: Subfolder
Subfolder Mystuff:
    ${MAKE} -C $@

但是,递归使被认为是有害的:)