Gnu Make:如何处理子项目
Gnu Make: how to handle sub-projects
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 以重新制作它,然后所有产品链接到最终的 Flash 图像。
顺序有问题。 我想总是先调用子 makefile。 它知道何时以及如何重新制作 lib.a
。然后检查 lib.a
是否被修改以确定是否重制 $(NAME).elf.
这是一种解决方案。
.PHONY all $(NAME).elf
这只是指示 make
无论如何都要重新制作 $(NAME).elf。我过去曾将此解决方案用于小型项目,但对于当前的项目来说,这是不可接受的。
您也可以尝试将您的东西放在一个子文件夹中(例如 Mystuff),它有自己的 makefile。然后你可以按照
的方式写一个顶层的makefile
all: Mystuff
Mystuff: Subfolder
Subfolder Mystuff:
${MAKE} -C $@
正如 MadScientist(以及更好的人)所指出的,我错过了这个问题的明显解决方案。
解决方案是 FORCE
始终尝试 Subfolder/lib.a
目标。只要 Subfolder
makefile 仅在某些内容发生更改时更新 lib.a
,其余部分就会正确退出。
所以您需要以下内容作为您的 Subfolder/lib.a
目标。其余的可以保持原样。如前所述,这里的技巧是您可以强制 运行 Subfolder/lib.a
目标本身,但是如果 Subfolder/lib.a
上的时间戳 文件 如果不改变,则不需要重建将 Subfolder/lib.a
列为先决条件的内容。
FORCE: ;
Subfolder/lib.a: FORCE
$(MAKE) -C $(@D) target-to-build-lib.a*
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 以重新制作它,然后所有产品链接到最终的 Flash 图像。
顺序有问题。 我想总是先调用子 makefile。 它知道何时以及如何重新制作 lib.a
。然后检查 lib.a
是否被修改以确定是否重制 $(NAME).elf.
这是一种解决方案。
.PHONY all $(NAME).elf
这只是指示 make
无论如何都要重新制作 $(NAME).elf。我过去曾将此解决方案用于小型项目,但对于当前的项目来说,这是不可接受的。
您也可以尝试将您的东西放在一个子文件夹中(例如 Mystuff),它有自己的 makefile。然后你可以按照
的方式写一个顶层的makefileall: Mystuff
Mystuff: Subfolder
Subfolder Mystuff:
${MAKE} -C $@
正如 MadScientist(以及更好的人)所指出的,我错过了这个问题的明显解决方案。
解决方案是 FORCE
始终尝试 Subfolder/lib.a
目标。只要 Subfolder
makefile 仅在某些内容发生更改时更新 lib.a
,其余部分就会正确退出。
所以您需要以下内容作为您的 Subfolder/lib.a
目标。其余的可以保持原样。如前所述,这里的技巧是您可以强制 运行 Subfolder/lib.a
目标本身,但是如果 Subfolder/lib.a
上的时间戳 文件 如果不改变,则不需要重建将 Subfolder/lib.a
列为先决条件的内容。
FORCE: ;
Subfolder/lib.a: FORCE
$(MAKE) -C $(@D) target-to-build-lib.a*