1.何时扩展变量
当make在处理递归变量或define指令的时候,会将变量里的每一行或宏的主体存储起来,包括换行符号,但不会予以扩展。
宏定义里的最后一个换行符号并不会被存储称宏的一部分,否则,宏被扩展时make会读进一个额外的换行符号。
当宏被扩展时,make会立即扫描被扩展的文本中是否存在宏或变量的引用,如果存在就予以扩展,如此递归进行下去。如果
宏是在命令脚本的语境中被扩展的,则宏主体的每一行都会被插入一个前导的跳格符。
下面是用来处理makefile中元素何时被扩展的准则:
1.对于变量的赋值,make会在第一阶段读进该行时,立即扩展赋值运算符左边的部分。
2.=和?=的右边部分会被延后到它们被使用的时候扩展,并且在第二阶段进行。
3.:=的右边部分会被立即扩展。
4.如果+=的左边部分原来被定义成一个简单变量,+=的右边部分就会被立即扩展,否则,它的求值动作会被延后。
5.对于宏定义,宏的变量名称会被立即扩展,宏的主体会被延后到使用的时候扩展。
6.对于规则,工作目标的必要条件总是被立即扩展,然而命令总是会延后扩展。
2.工作目标与模式的专属变量
在makefile运行期间,变量通常只有一个值,对需要经过两个处理阶段的makefile来说是这样没错。第一个阶段,make读取
makefile之后,会对变量进行赋值的扩展的动作并建立依存图。第二阶段,make会分析以及遍历依存图。所以等到make执行
命令脚本的时候,所有变量都已经处