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 。我过去曾在小型项目中使用过这种解决方案,但对于当前的项目来说,这是不可接受的。
正如 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*
Run Code Online (Sandbox Code Playgroud)