前言
学习如何使用自定义或者系统变量进行Makefile操作
一.变量详解
顾名思义就是用户自己定义的变量
跟Shell脚本非常类似,在Makefile中也会使用“弱类型”变量(相对于C语言这种强
类型语言而言),在Makefile中变量就是一个名字(像是C语言中的宏),代表一个文本字
符串(变量的值)。在Makefile的目标、依赖、命令中引用一个变量的地方,变量会被它
的值所取代(与C语言中宏引用的方式相同,因此其他版本的make也把变量称之为“宏”)。1. 变量和函数的展开(除规则的命令行以外),是在make读取Makefile文件时进行
的,这里的变量包括了使用“=”定义和使用指示符“define”定义的变量。
2. 变量可以用来代表一个文件名列表、编译选项列表、程序运行的选项参数列表、搜
索源文件的目录列表、编译输出的目录列表和所有我们能够想到的事物。
3. 变量名不能包括“:”、“#”、“=”、前置空白和尾空白的任何字符串。需要注意的是,
尽管在GNU make中没有对变量的命名有其它的限制,但定义一个包含除字母、数字和下
划线以外的变量的做法也是不可取的,因为除字母、数字和下划线以外的其它字符可能会在
以后的make版本中被赋予特殊含义,并且这样命名的变量对于一些Shell来说不能作为环
境变量使用。
4. 变量名是大小写敏感的。变量“foo”、“Foo”和“FOO”指的是三个不同的变量。
Makefile传统做法是变量名是全采用大写的方式。5. 另外有一些变量名只包含了一个或者很少的几个特殊的字符(符号)。称它们为自
动化变量。像“<”、“@”、“?”、“*”、“@D”、“%F”、“^D”等等,后面会详述之。
6. 变量的引用跟Shell脚本类似,使用美元符号和圆括号,比如有个变量叫A,那么对
他的引用则是$(A),有个自动化变量叫@,则对他的引用是$(@),有个系统变量是CC则
对其引用的格式是$(CC)。对于前面两个变量而言,他们都是单字符变量,因此对他们引用
的括号可以省略,写成$A和$@。
二.自定义变量
自定义变量
顾名思义就是用户自己定义的变量
A = apple # 定义并赋值变量 B = I love China C = $(A) tree # $() 则是对某一个变量进行引用 Even: @echo $(A) @echo $(B) @echo $(C)
三.系统预定义变量
Makefile预定义变量
四.自动化变量
<、@、?、#等等,这些特殊的变量之所以称为自动化变量,是因为他们的值会“自动地”发生变化。自动化变量的值是不固定的,你不能说@的值等于几,但是他的含义的固定的:@代表了其所在规则的目标的完整名称。
上述列出的自动量变量中。其中有四个在规则中代表一个文件名(@、<、%和*)。
而其它三个的在规则中代表一个文件名的列表。
GUN make中,还可以通过这七个自动化变量来获取一个完整文件名中的目录部分或
者具体文件名,需要在这些变量中加入“D”或者“F”字符。这样就形成了一系列变种的自动
化变量:
五.定义变量方式
5.1 递归定义
递归定义方式:
A = I LOVE $(B) B = China Even : echo $(A);
5.2 直接定义方式
直接定义
5.3 条件定义方式
条件定义方式
A = apple A ?= I love China Even : echo $(A);
5.4 多命令行定义方式
多命令行定义方式
5.5 追加变量
追加
5.6 修改变量
修改变量
六.函数
函数$(subst FROM,TO,TEXT)
$(subst FROM,TO,TEXT)
功能: 将字符串 TEXT 中的字符 FROM 替换为 TO。 返回: 替换之后的新字符串。 范例:
A = $(subst pp,PP,apple tree)
替换之后变量 A 的值是”aPPle tree”
函数:
函数A = $(wildcard *.c);
A = $(wildcard *.c)
函数override
添加+号后
.PHONY
七.程序链接运行
原函数格式
TAG=./bin/main SRC=./src/Input.c ./src/main.c ./src/Oper.c ./src/Output.c OBJ=$(SRC:%.c=%.o) CC=gcc O=-o CONFIG=-I./inc $(TAG):$(OBJ) $(CC) $(^) $(O) $(@) $(CONFIG) %.o:%.c $(CC) $< -o $(@) $(CONFIG) -c clean: $(RM) ./bin/* ./src/*.o