曲径通幽论坛

标题: 目标指定变量(Target-specific Variable) [打印本页]

作者: beyes    时间: 2011-7-6 11:18
标题: 目标指定变量(Target-specific Variable)
在 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





欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2