“如何读取文件”的示例

在GNU-Make手册中, 如何使读取Makefile成为 https://www.gnu.org/software/make/manual/make.html#Reading-Makefiles部分

GNU make的工作分两个阶段进行。 在第一阶段,它读取所有makefile,包括makefile等,并内化所有变量及其值,隐式和显式规则,并构造所有目标及其先决条件的依赖关系图。 在第二阶段,使用这些内部结构来确定需要重建的目标以及调用必要的规则。

我无法清楚地理解两个阶段之间的差异。 可能会看一个例子有助于理解。 是否有任何链接或教程阐明了第一阶段和第二阶段发生的情况。


以这个微不足道的makefile:

var := some_other_file

some_file: $(var)
  some_command $^ $@

第一阶段之后,文件将如下所示

var := some_other_file

some_file: some_other_file
  some_command $^ $@

注意$^$@还没有被扩展,配方只是作为阶段2的一部分被扩展和调用。

在阶段2中,make将使用第一阶段生成的规则并确定需要重新映射哪些目标,通过使用-d标志运行make(警告:大量输出),您可以看到如何使“思考”。

在上述情况下的阶段2中,在已经检查了所有的some_other_file的依赖关系,并在必要时重拍,然后将其考虑是否some_other_file是较新然后some_file

如果是这种情况,那么(并且只有这样)才会扩展配方的变量,并将每行的内容传递给shell,这里将是some_command some_other_file some_file

由于自动变量只在阶段2中设置,所以除了作为配方的一部分之外,不能在任何地方使用$@等。

foo: $@bar
  some_command $^

这将在第一阶段扩展到:

foo: bar
  some_command $^

在阶段2中将导致:

foo: bar
  some_command bar

可能不是你想要的。

有些方法可以解决这个限制。 例如GNU make有.SECONDEXPANSION ,以下内容将按预期工作:

.SECONDEXPANSION:
foo: $$@bar
  some_command $^

.SECONDEXPANSION之后的任何内容.SECONDEXPANSION将在第一阶段扩展:

.SECONDEXPANSION:
foo: $@bar
  some_command $^

和阶段2:

.SECONDEXPANSION:
foo: foobar
  some_command foobar
链接地址: http://www.djcxy.com/p/64121.html

上一篇: Examples for "How make file is read"

下一篇: Makefile: get prerequisites of target prerequisites