【问题标题】:Make target-specific assignment order制定目标特定的分配顺序
【发布时间】:2016-08-21 19:52:36
【问题描述】:

考虑这个带有 GNU Make 的 Makefile(用制表符替换 @echo 之前的空格):

BAR := outside

foo:
    @echo $(FOO)

foo: BAR := inside
foo: FOO := $(BAR)

.PHONY: foo

输出为inside。如果我交换两个特定于目标的分配的顺序,我会得到outside。这让我相信特定于目标的变量是按照它们写入的顺序分配的。

这真的有记录吗?换句话说,我可以依赖它吗?这种行为是有道理的,但我在文档中找不到任何提及。

我能找到的最接近的是:

与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)。 1

它承认特定于目标的变量可以用于特定于目标的赋值,但没有说明是否像正常赋值一样处理赋值顺序。

发布的代码只是一个最小的示例,实际代码大约 800 行拆分为多个文件,基于我编写的元编程模板系统,为各种设备动态生成 lots 目标(这是一个裸机 SDK)在不同的构建配置中。出现这种情况的一个示例是将链接器映射添加到LDFLAGS 以用于调试目标,映射路径取决于设备风味元组,该元组是链接阶段的目标特定变量。现在我使用我的模板系统来解决它,但是能够依赖特定于目标的变量的赋值顺序会使一些事情变得不那么冗长。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    手册并没有明确保证这种行为,但是当您认为特定于目标的变量仅确定变量名称的范围,而不是如何以及何时设置时,这是不言而喻的,否则它们就像常规变量一样.

    即这没什么区别

    foo: BAR := inside
    foo: FOO := $(BAR)
    

    还有这个

    BAR := inside
    FOO := $(BAR)
    

    除了第一个示例将首先在foo 的范围内查找BAR 的定义,然后再向上移动,结果定义将仅在foo 的范围内可用。

    【讨论】:

    • “特定于目标的变量只决定范围”:现在更清楚了。谢谢。
    • 另外,在第 10 次阅读文档后,我发现 something 我错过了:“出现在变量赋值中的所有变量都在目标的上下文中进行评估:因此,任何先前定义的特定于目标的变量值将生效”。
    【解决方案2】:

    我认为这并不奇怪 - 两个赋值都是立即的,所以顺序就像全局变量一样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多