makefile - make 中的高级自动依赖项

标签 makefile dependency-management

我一直在阅读 this web page 中的 make 手册第 4.14 节“自动生成先决条件”和“高级自动依赖项” .

我想我理解了制作手册中的这一部分,但有一件事我无法理解我链接的网页:

If you think about it, this re-invocation is really unneeded. Since we know some prerequisite of the target changed, we don't really need the updated prerequisite list in this build. We already know that we're going to rebuild the target, and having a more up-to-date list won't affect that decision.

所以不要这样做:

  %.P : %.c
          $(MAKEDEPEND)
          @sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $*.d > $@; \
             rm -f $*.d; [ -s $@ ] || rm -f $@

  include $(SRCS:.c=.P)

他们这样做:

  %.o : %.c
          @$(MAKEDEPEND)
          $(COMPILE.c) -o $@ $<

  -include $(SRCS:.c=.P)

但是,如果我们知道目标先决条件已更改,我们是否必须更新该目标的去依赖项列表?这不正是第一次调用 make 时所做的事情吗?我的理解是包含语句中包含的文件看起来像:

list.o list.P : list.cc list.h debug.h

我在这里没有得到什么?

最佳答案

重点是,不存在或过时的对象不需要依赖项列表。无论如何它都会被重建。

由于 .P.c 文件的依赖关系由于其相同的先决条件而始终相同,因此我们不必将它们分开保存,只需构建每当构建对象时都会生成依赖文件。

当目标先决条件发生更改时,将重新构建对象,并更新依赖项列表作为副作用。我们在本次 make 运行中不需要该列表,只在下一次运行中需要,因为无论如何我们都会在本次运行中重新构建对象。

第一次调用 make 不需要依赖项列表,并且纯粹基于每个对象进行操作。作为生成对象的副作用,会生成依赖项列表,并且下一个 make 运行会找到它们。

依赖文件如下所示:

list.o : list.cc list.h debug.h

由于上述原因,根本不需要提及其中的依赖文件。

关于makefile - make 中的高级自动依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14853841/

相关文章:

c++ - 在 CMake 中链接 MySQL 库

c++ - 如何在 Windows 上使用 g++ 编译器和 Eigen 库进行编译

makefile - GNU 制作空配方与无配方

android - 多个项目的Gradle依赖关系

spring-boot - 当项目没有自己的类时,Gradle 'Implementation' 依赖项是运行时范围的

docker - Makefile无法执行sudo docker kill

makefile - QMake:构建后执行脚本

java - Gradle 忽略从工件 pom.xml 检索时提供的配置的传递依赖性

eclipse - Grails Assets 管道在Eclipse中显示错误的构建路径

java - 如何在不同项目之间共享公共(public)代码?