制定目标特定的分配顺序

Make target-specific assignment order

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

BAR := outside

foo:
    @echo $(FOO)

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

.PHONY: foo

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

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

我能找到的最接近的是:

As with automatic variables, these values are only available within the context of a target’s recipe (and in other target-specific assignments). 1

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

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

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

手册没有明确保证这种行为,但是当您认为特定于目标的变量仅确定变量名称的范围而不是设置变量名称的方式和时间时,这是不言而喻的,否则它们的行为就像常规变量。

即这个没有区别

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

还有这个

BAR := inside
FOO := $(BAR)

除了第一个示例在向上移动链之前首先在 foo 的范围内查找 BAR 的定义,并且生成的定义将仅在该范围内可用共 foo.