Makefile:执行makefile的顺序

标签 makefile

生成文件:

foo: 
    @echo hello

%: force
    @echo foo

force:
    @echo force

如果我输入“make foo”,输出是:

force
foo
hello

那为什么不 hello

但是,如果我改成这样:

foo: 
    @echo hello

%:
    @echo foo

force:
    @echo force

它只输出hello

最佳答案

原因是因为 make 必须通过依赖项进行回溯才能使您成为 foo

当您输入make foo 时,make 认为您要求它创建一个名为foo 的文件。因此,由于 foo 不存在(假设),它会尝试找出如何制作 foo。你制定了一个通配符规则 % 可以是任何东西,因为没有更好的选择 make 将尝试使用这个规则来制作一个 foo。要制作 foo 现在有一个依赖项 force,它需要在我们开始制作 foo 之前执行。由于文件 force 不存在,因此 make 确定它需要执行目标以生成 force

因此,就输出而言,我们已经到了事情开始发生的地步。 force 执行,回显 force,然后执行通配符规则,回显 foo 最后 make 相信它已准备好创建 foo,命令只是为了echo 你好

所以它实际上是倒序的,从最外层的依赖到最后的最终目标。

当您将 force 作为通配符规则的依赖项移除时,通配符规则将确定无需执行任何操作来创建力,因此不会执行其主体(回显 foo),但由于 hello 不存在,它将执行您的 foo 目标的主体。

如果您在强制目标中包含一些内容来创建文件强制(例如 touch force),您现在将看到 foohello打印,但不是force

如果您在命令行上将标志 --debug=a (all) 传递给 make,您可以看到 make 执行的步骤。

关于Makefile:执行makefile的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41373392/

相关文章:

javascript - 在 Debian 机器上构建 V8 时出现奇怪的错误

c - 如何在 makefile 中编写通用命令?

makefile - 将 Autotooled 项目编译为 LLVM 位代码时出现链接器错误

bash - 在我的 Ubuntu 安装中,VERBOSE 环境变量在哪里以及为什么设置为 "no"?

c++ - 如何在制定目标后设置变量?

c++ - CMake add_subdirectory 不调用子 CMakeLists.txt

c++ - 使用 Bash 在 Windows 10 上使用 Visual Studio 2015 构建 libvpx

c - 具有多个目标文件的动态库在加载过程中失败

c - Makefile 产生错误但构建正常?

makefile - makefile 中处理组件的顺序