C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了makefile – “如何读取文件”的示例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在GNU-Make手册中,如何制作读取Makefile https://www.gnu.org/software/make/manual/make.html#Reading-Makefiles部分说

GNU make在两个不同的阶段完成它的工作.在第一阶段,它读取所有makefile,@L_97_1@makefile等,并内化所有变量及其值,隐式和显式规则,并构建所有目标及其先决条件的依赖关系图.在第二阶段,make使用这些内部结构来确定需要重建的目标,并调用执行此操作所需的规则.

我无法清楚地了解这两个阶段的差异.可能正在寻找一个有助于理解的例子.是否有任何链接或教程阐明了第一阶段和第二阶段到底发生了什么.

解决方法

拿这个琐碎的makefile:

var := some_other_file

some_file: $(var)
  some_command $^ $@

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

var := some_other_file

some_file: some_other_file
  some_command $^ $@

请注意,$^和$@尚未展开,配方仅作为第2阶段的一部分进行扩展和调用.

在阶段2中,make将使用阶段1产生的规则并确定需要重新制作哪些目标,您可以通过使用-d标志运行make来查看make如何“思”(警告:大量输出).

在上述情况的第2阶段,在检查了所有some_other_file的依赖关系并在必要时重新创建它之后,它会虑some_other_file是否比some_file更新.

如果是这种情况那么(并且只有那时)扩展了配方的变量,并且每行的内容被传递给sHell,这里将是some_command some_other_file some_file.

因此,除了作为配方的一部分之外,您不能在任何地方使用$@等,因为自动变量仅在阶段2期间设置.

foo: $@bar
  some_command $^

这将在第1阶段扩展到:

foo: bar
  some_command $^

在第2阶段将导致:

foo: bar
  some_command bar

可能不是你想要的.

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

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

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

.SECONDEXPANSION:
foo: $@bar
  some_command $^

和阶段2:

.SECONDEXPANSION:
foo: foobar
  some_command foobar

大佬总结

以上是大佬教程为你收集整理的makefile – “如何读取文件”的示例全部内容,希望文章能够帮你解决makefile – “如何读取文件”的示例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。