文章目录

Makefile 中的变量

变量的概念比较容易理解,毕竟任何语言都存在。在 Makefile 中,变量的意义也是一样的。不过不同 语言的变量表现形式可能不大一样,比如在 Makefile 中,变量的意义和 C 语言的宏定义一样, 在引用它的地方展开。总的来说,Makefile 中的变量有以下特征:

  1. 展开是在 make 读取 Makefile 文件
  2. 变量可以用来表示任意事物的列表,如文件名、编译选项
  3. 变量名不包括 ‘:’, “#”,"=",以及前后的空格
  4. 变量名大小敏感
  5. 另外有一些变量名只包含了一个或者很少的几个特殊的字符,称为自动变量

变量的引用

Makefile 中变量的引用有两种:

  1. $(VAR_NAME)
  2. ${VAR_NAME}

变量的定义

Makefile 中主要有两种风格的定义 ,分别为递归和非递归的。

递归定义

= 或者指示符 define 定义的变量。

优点:可以引用它之前没有定义的变量

缺点:

  1. 递归导致无限展开
  2. 包含函数总会被执行

直接展开定义

使用 := 定义的变量,在定义是就完成了变量的引用 ,因此不能引用之后定义的变量。

特殊的定义

?= 表示该变量若未定义,则定义,否则使用之前的定义。

高级用法

替换引用

格式: $(VAR:A=B), 表示将 VAR 中以 “A” 结尾的替换为以 “B” 结束的字。

嵌套引用

变量名可以包含其它变量的引用。

变量取值

  1. make 命令行选项定义
  2. Makefile 中变量赋值
  3. 系统环境变量
  4. 自动化变量
  5. 一些变量的固定值

追加变量值

Makefile 中使用 “+=” 追加变量值。有几点需要注意:

  1. 变量之前定义,则按之前定义的风格追加
  2. 若未定义,那么使用 = 定义变量
  3. 若中间有使用 =, 那么之前的风格不变,之后的使用 ==

override 指示符

通常命令行的变量会取代 Makefile 中定义的变量,因此使用 override 可以防止替换。

多行定义

使用 define 指示符和 endef 之间可以定义多行变量。

系统环境变量

  1. Makefile 定义的变量和命令行定义的变量会取代环境变量
  2. 只有环境变量和命令行变量可以传递给子 make 进程
  3. 特殊的环境变量 SHELL 定义为 /bin/sh

目标指定变量

和局部变量的意思一样,只在本目标范围内有效。

模式指定变量

将变量的定义在某个具体目标和由它所引发的规则上。

总结

总的来说,与其它语言的变量相差不大,只是形式上可能有些区别。