Makefile 中的变量
文章目录
Makefile 中的变量
变量的概念比较容易理解,毕竟任何语言都存在。在 Makefile 中,变量的意义也是一样的。不过不同 语言的变量表现形式可能不大一样,比如在 Makefile 中,变量的意义和 C 语言的宏定义一样, 在引用它的地方展开。总的来说,Makefile 中的变量有以下特征:
- 展开是在 make 读取 Makefile 文件
- 变量可以用来表示任意事物的列表,如文件名、编译选项
- 变量名不包括 ‘:’, “#”,"=",以及前后的空格
- 变量名大小敏感
- 另外有一些变量名只包含了一个或者很少的几个特殊的字符,称为自动变量
变量的引用
Makefile 中变量的引用有两种:
- $(VAR_NAME)
- ${VAR_NAME}
变量的定义
Makefile 中主要有两种风格的定义 ,分别为递归和非递归的。
递归定义
以 =
或者指示符 define
定义的变量。
优点:可以引用它之前没有定义的变量
缺点:
- 递归导致无限展开
- 包含函数总会被执行
直接展开定义
使用 :=
定义的变量,在定义是就完成了变量的引用 ,因此不能引用之后定义的变量。
特殊的定义
?=
表示该变量若未定义,则定义,否则使用之前的定义。
高级用法
替换引用
格式: $(VAR:A=B), 表示将 VAR
中以 “A” 结尾的替换为以 “B” 结束的字。
嵌套引用
变量名可以包含其它变量的引用。
变量取值
- make 命令行选项定义
- Makefile 中变量赋值
- 系统环境变量
- 自动化变量
- 一些变量的固定值
追加变量值
Makefile 中使用 “+=” 追加变量值。有几点需要注意:
- 变量之前定义,则按之前定义的风格追加
- 若未定义,那么使用
=
定义变量 - 若中间有使用
=
, 那么之前的风格不变,之后的使用==
override 指示符
通常命令行的变量会取代 Makefile 中定义的变量,因此使用 override
可以防止替换。
多行定义
使用 define
指示符和 endef
之间可以定义多行变量。
系统环境变量
- Makefile 定义的变量和命令行定义的变量会取代环境变量
- 只有环境变量和命令行变量可以传递给子 make 进程
- 特殊的环境变量
SHELL
定义为/bin/sh
目标指定变量
和局部变量的意思一样,只在本目标范围内有效。
模式指定变量
将变量的定义在某个具体目标和由它所引发的规则上。
总结
总的来说,与其它语言的变量相差不大,只是形式上可能有些区别。