2024年3月24日发(作者:)
第六章:Makefile中的变量
在Makefile中,变量是一个名字(像是C语言中的宏),代表一个文本字符串(变量的
值)。在Makefile的目标、依赖、命令中引用变量的地方,变量会被它的值所取代(与C语
言中宏引用的方式相同,因此其他版本的make也把变量称之为“宏”)。在Makefile中变
量有以下几个特征:
1. Makefile中变量和函数的展开(除规则命令行中的变量和函数以外),是在
make读取makefile文件时进行的,这里的变量包括了使用“=”定义和使用指示符“define”
定义的。
2. 变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、
搜索源文件的目录列表、编译输出的目录列表和所有我们能够想到的事物。
3. 变量名是不包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。需要注意
的是,尽管在GNU make中没有对变量的命名有其它的限制,但定义一个包含除字母、数
字和下划线以外的变量的做法也是不可取的,因为除字母、数字和下划线以外的其它字符
可能会在make的后续版本中被赋予特殊含义,并且这样命名的变量对于一些shell来说是
不能被作为环境变量来使用的。
4. 变量名是大小写敏感的。变量“foo”、“Foo”和“FOO”指的是三个不同的
变量。Makefile传统做法是变量名是全采用大写的方式。推荐的做法是在对于内部定义定
义的一般变量(例如:目标文件列表objects)使用小写方式,而对于一些参数列表(例如:
编译选项CFLAGS)采用大写方式,但这并不是要求的。但需要强调一点:对于一个工程,
所有Makefile中的变量命名应保持一种风格,否则会显得你是一个蹩脚的程序员(就像代
码的变量命名风格一样)。
5. 另外有一些变量名只包含了一个或者很少的几个特殊的字符(符号)。称它们
为自动化变量。像“$<”、“$@”、“$?”、“$*”等。
6.1 变量的引用
当我们定义了一个变量之后,就可以在Makefile的很多地方使用这个变量。变量的引
用方式是:“$(VARIABLE_NAME)”或者“${ VARIABLE_NAME }”来引用一个变量的
定义。例如:“$(foo) ”或者“${foo}”就是取变量“foo”的值。美元符号“$”在Makefile
中有特殊的含义,所有在命令或者文件名中使用“$”时需要用两个美元符号“$$”来表
示。对一个变量的引用可以在Makefile的任何上下文中,目标、依赖、命令、绝大多数指
示符和新变量的赋值中。这里有一个例子,其中变量保存了所有.o文件的列表:
objects = program.o foo.o utils.o
program : $(objects)
cc -o program $(objects)
$(objects) : defs.h
变量引用的展开过程是严格的文本替换过程,就是说变量值的字符串被精确的展开在
变量被引用的地方。因此规则:


发布评论