Makefile 制定特定于目标的分配顺序

Makefile 制定特定于目标的分配顺序,makefile,gnu-make,Makefile,Gnu Make,考虑使用GNU Make创建此Makefile(用选项卡替换@echo之前的空格): 输出为内部。如果我交换两个特定于目标的分配的顺序,我会得到外部的。这让我相信,特定于目标的变量是按照它们被写入的顺序分配的 这是否有文档记录?换句话说,我能依靠它吗?这种行为是有道理的,但我在文档中找不到任何提及 我能找到的最接近的东西是: 与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中) 它承认特定于目标的变量可以在特定于目标的赋值中使用,但没有说明赋值顺序是否像正常赋值那样处

考虑使用GNU Make创建此Makefile(用选项卡替换
@echo
之前的空格):

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

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

我能找到的最接近的东西是:

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

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


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

我认为这并不奇怪-两种赋值都是即时的,因此顺序与全局变量的顺序完全相同。

手册没有明确保证这种行为,但是,当你认为目标特定变量只确定变量名的范围,而不是如何设置和设置变量时,这是不言而喻的。 也就是说,这两者之间没有区别

foo: BAR := inside
foo: FOO := $(BAR)
还有这个

BAR := inside
FOO := $(BAR)

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

范围内可用,“目标特定变量仅确定范围”:现在更清楚了。谢谢。另外,在第十次阅读文档后,我发现我遗漏了:“变量分配中出现的所有变量都是在目标上下文中进行评估的:因此,任何先前定义的特定于目标的变量值都将生效。”。
BAR := inside
FOO := $(BAR)