|
在 Makefile 中定义的变量对当前 Makefile 中所有的规则都是有效的,它们就如同是一个“全局变量” ,如果希望在别的 Makefile 文件中也能有效,那么需要用 "export" 将它们导出(像 $@, @< 这些自动化变量除外)。
在 Makefile 中还有一种特殊的,并称之为 "目标制定变量(Target-specific Variable)“ 的变量。这种变量支持同一个变量名在不同的目标中被指定不同的值,而且这些值只在它的目标的上下文中有效,对于其它目标以及全局中的变量不会产生影响。相较于 C 语言,它的作用如同局部变量,不同的函数里可以有相同的局部变量。
目标指定变量的语法格式为:
TARGET... : VARIABLE-ASSIGNMENT
或
TARGET... : override VARIABLE-ASSIGNMENT
测试代码:
[code=Makefile]var := 1
target2: var:=2
target2:
@echo $(var)
target1:
@echo $(var)[/mw_shl_code]
运行输出:$ make target2 target1
2
1 由输出可见,target2 里的 var 变量和 target1 里的 var 变量显然不是同一个变量。
注意上面 target2 的写法,不能只是写成:target2: var := 2
@echo $(var) 这样会出现语法错误:*** commands commence before first target. Stop.
在 VARIABLE-ASSIGNMENT 部分,可以使用任何一个有效的赋值符号,如 "=",":=",”+=“ 或者 "?=" 。
目标定义变量和普通变量具有相同的优先级。也就是说,当我们使用 make 命令行的方式定义变量时,命令行中的定义将替代目标指定的同名变量的定义(普通变量一样会被覆盖)。另外当使用 make 的 -e 选项时,同名的环境变量也会覆盖目标指定的变量定义。如上面的例子,可以看到以下的输出:$ make var=10 target1 target2
10
10
$ make -e var=18 target1 target2
18
18 因此,为了让目标指定的变量被覆盖,可以使用上面语法中的第 2 种格式,即使用 "override" 对目标指定的变量进行声明,如:
[code=Makefile]target2: override var:=2
target2:
@echo $(var)
[/mw_shl_code]
这样就可以看到:$ make -e var=18 target1 target2
18
2
$ make var=18 target1 target2
18
2 |
|