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

时间:2016-08-21 19:52:37

标签: makefile gnu-make

使用GNU Make考虑这个Makefile(用{1}替换@echo之前的空格):

BAR := outside

foo:
    @echo $(FOO)

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

.PHONY: foo

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

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

我能找到的最接近的是:

  

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

其中确认特定于目标的变量可用于特定于目标的分配,但不会说分配顺序是否像正常分配一样处理。

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

2 个答案:

答案 0 :(得分:1)

我认为这里并不奇怪 - 两项任务都是即时的,所以秩序就像全局变量一样

答案 1 :(得分:1)

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

即。这个

之间没有区别
foo: BAR := inside
foo: FOO := $(BAR)

和这个

BAR := inside
FOO := $(BAR)

,除了第一个示例在向上移动链之前首先在BAR范围内查找foo的定义,结果定义仅在foo的范围内可用{1}}。