c++ - GNU 使 : how to handle sub-projects

标签 c++ makefile gnu-make

ProjFolder
 \ 
  Subfolder
    sources.cpp
    makefile
makefile

Subfolder 应该是一个单独的外部存储库,在 checkout 项目时拉入。当我将 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 无论如何。我过去曾将此解决方案用于小型项目,但对于当前的项目来说,这是 Not Acceptable 。

最佳答案

正如 MadScientist(以及更好的人)所指出的,我错过了这个问题的明显解决方案。

解决方案是强制始终尝试Subfolder/lib.a 目标。只要 Subfolder makefile 仅在发生更改时更新 lib.a,其余部分就会正确退出。

所以您需要为您的 Subfolder/lib.a 目标添加以下内容。其余的可以保持原样。如前所述,这里的技巧是您可以强制 make 运行 Subfolder/lib.a 目标本身,但是如果 Subfolder/lib.a 上的时间戳 < strong>file 没有改变,则不需要重建将 Subfolder/lib.a 列为先决条件的内容。

FORCE: ;

Subfolder/lib.a: FORCE
        $(MAKE) -C $(@D) target-to-build-lib.a*

关于c++ - GNU 使 : how to handle sub-projects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27863286/

相关文章:

makefile - 我需要帮助减少 makefile 中的依赖项

c++ - 如何使用 qml 组件创建插件的 deb 包(无 C++)

c++ - 如何清除 C++ 应用程序中的输入缓冲区?

c - 从上层文件夹编译时,gcc 不打印这样的头文件

makefile - MinGW/GNU 品牌 - "multiple target patterns"

makefile - 使用 gnumake 和先决条件并行构建

gnu-make - GNU 制作备忘单

gnu-make - 如何根据传递给命令行变量的值有条件地构建目标及其所有依赖项?

c++ - 尝试在不使用 nanosleep/usleep 的情况下在 C 函数中创建延迟

c++ - Sonar - 无法请求服务器版本