曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6028|回复: 0
打印 上一主题 下一主题

目标指定变量(Target-specific Variable)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-7-6 11:18:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-17 14:44 , Processed in 0.080589 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表