“如何读取文件”的示例
在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