1.1 通配符
% 代表一个或多个字符,%.o 就是代表所有以.o为结尾的文件
makefile 自动规则
1.2 makefile 定义和使用变量
直接定义使用,
引用变量$var
1.3 伪目标(.PHONY)
(1)伪目标是这个目标不是得到一个文件,执行这个目标不是为了得到某个某个文件或东西,而是单纯为了执行这个目标下面的命令:
(2)为目标一般都没有依赖,因为不加依赖就是无条件执行
(3)伪目标可以直接写,不影响使用,但有时候为了能看清可以前在面添加(.PHONY)
1.4 Makefile 中引用其他的Makefile (include)指令
1.5.1 补充学习1
1)# 表示注释
2)Makefile在默认执行一句命令的时候,默认会打印出该命令
3) @表示静默执行(不想看到命令本身就用静默执行)
1
2
3
4 all:
5 echo "hello world"(前面没有TAB)
~
会发生Makefile:5: *** missing separator. Stop. 错误
TAB前缀意味着它是一个shell命令
1
2
3
4 all:
5 echo "hello world"
~
~
make之后的结果为
echo “hello world”
hello world
1
2
3
4 all:
5 @echo "hello world"
make之后结果为
- hello world
1.5.1.2几种变量赋值运算符
- =
简单赋值,在被解析时,取决于最后一次执行的。
2):= 1)和2)大多数情况下一样
:=就地取值
# = 和 :=的区别
A=ABC
B=$(A)BCD
A=XYZ
C:=ABC
D:=$(C)BCD
C:=XYZ
all:
@echo "B:" $(B)
@echo "D:"$(D)
结果为:
B: XYZBCD
D:ABCBCD
:= 按命令当前最后一个执行的结果拿来使用(只需要往前看)
= 按所有命令最后一个执行的结果拿来使用(需要看前后)\
# = 和 :=的区别
A=ABC
B=$(A)BCD
A=XYZ
C:=ABC
D=$(C)BCD
C:=XYZ
all:
@echo "B:" $(B)
@echo "D:"$(D)
结果为
B: XYZBCD
D:XYZBCD
当前D使用的时等于号使用等于号的规则
3)?=
如果前面没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略
4)+=
用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面。
(续借的内容和原来的内容用空格隔开)
1.5.1.3 环境变量和全局变量
1)makefile 用export 导出的就是环境变量,一般使用大写
2)环境变量和普通变量不同,环境变量类似整个工程中所有Makefile的全局变量,所以要小心使用
3)Makefile中的一些环境变量时makefile中定义的一些内部环境变量或则时当前执行环境的环境变量(make CC=arm 其实就是给Makefile传了一个环境变量CC值为arm,make时给Makefile传的环境变量的值的优先级时最高的)
1.5.2.1 通配符
1)* 任意个字符
2)? 1个任意字符
3) [ ] 查找【】中的文件
%也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫规则通配符
Makefile 还有一些wildcard等复杂的通配符 用法具体参考<<跟我一起学Makefile>
1.5.2.2 自动变量
1)文件非常多的时候
3)常见自动变量
- $* 不包含扩展名的目标文件名称
- $+ 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
- $< 第一个依赖文件的名称
- $? 所有时间戳比目标文件晚的依赖文件,并以空格分开
- $@ 目标文件的完整名称
- $^ 所有不重复的依赖文件,以空格分开
- $% 如果目标是归档成员,则该变量表示目标的归档成员名称