四、Makefile 的实例
(1)执行多个目标
.PHONY: cleanall cleanobj cleandiff cleanall : cleanobj cleandiff rm program cleanobj : rm *.o cleandiff : rm *.diff
上面代码可以调用不同目标,删除不同后缀名的文件,也可以调用一个目标(cleanall),删除所有指定类型的文件。
(2)编译C语言项目
edit : main.o kbd.o command.o display.o cc -o edit main.o kbd.o command.o display.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h cc -c display.c clean : rm edit main.o kbd.o command.o display.o .PHONY: edit clean
五、Makefile的特殊字符
在 Makefile 文件中,存在一些特殊字符,它们的含义不同于普通字符。下面列举了一些常见的特殊字符及其含义:
1.# 注释符号:用于在规则中添加注释,以提高可读性。
2.= 等号:用于定义变量,并将值赋给变量。
3.:= 冒号等于号:与等号类似,也用于定义变量。
不同之处在于,当变量被声明时,其值会立即求解并保存。
这意味着变量的值在 Makefile 的执行过程中只计算一次。
4.+= 加等号:用于向现有变量添加内容而不是覆盖它的值。
此操作相当于将旧值和新值连接成一个字符串。
5.?= 问号等于号:类似于等号和冒号等于号,也用于定义变量。
与两者不同的是,如果变量已经被定义,则该操作不会覆盖它的值。
6.$ 特殊字符:用于引用变量。可以使用 $(…) 或 ${…} 表示变量的值,也可以使用$$表示一个普通的$字符。
7.@ 特殊符号:在命令行前加上@符号可以阻止其被显示出来。这在运行一些特别长或者复杂的命令时非常有用。
8.- 特殊符号:可以将命令的返回结果忽略,并继续执行 Makefile 中的其他规则。
9.% 特殊字符:用于表示模式匹配,在规则中可以使用 % 来通配符代替文件名中的一部分。
例如,%.c 表示任意以 .c 结尾的文件名。
10.| 管道符号:用于定义目标的依赖关系,并指定要在所有依赖项都更新后才运行的命令。与普通的依赖关系不同,使用管道符号定义的依赖项不会被视为Makefile 中的真正目标。
11.:: 特殊符号:如果两个冒号(::)出现在规则的目标后面,则表示该规则具有“双冒号”语义。这种语义下,执行命令时不会涉及到时间戳和依赖项的判断,而只会执行规则中的命令。这种类型的规则被称为 “标签语句”(label statement),通常用于在 Makefile 文件中添加注释或执行一些额外的操作。
12.· 特殊字符:和 % 类似,用于表示通配符,可以匹配任意长度的字符串。用法类似于 Shell 中的通配符,例如 *.c 表示以 .c 结尾的任意文件名。
13.[] 特殊字符:用于表示字符集匹配,可以指定匹配一组字符中的任意一个。例如,[abcd].c 表示 a.c、b.c、c.c 或 d.c 这几个文件中的任意一个。
14.^ 特殊字符:用于否定整个字符集,表示不匹配其中的任何一个字符。例如,[^abc].c 表示不匹配所有以 a、b、c 中任意一个字符开头,并以 .c 结尾的文件名。
15.() 特殊符号:用于分组,在规则中限定一个或多个表达式的作用范围。这对于在匹配模式时使用多个通配符非常有用,可以确保正确匹配所需的部分。
这些特殊字符在 Makefile 文件中都是有特殊含义的,熟练掌握它们的用法和含义,有助于编写更清晰和可维护的 Makefile 规则。