模式规则类似于普通规则。只是在模式规则中,目标名中需要包含有模式字符“%”(一个),包含有模式字符“%”的目标被用来匹配一个文件名,“%”可以匹配任何非空字符串。规则的依赖文件中同样可以使用“%”,依赖文件中模式字符“%”的取值情况由目标中的“%”来决定。例如:对于模式规则“%.o : %.c”,它表示的含义是:所有的.o文件依赖于对应的.c文件。
自动化变量 说明
$@ 表示规则的目标文件名。如果目标是一个文档文件(Linux 中,一般成 .a 文件为文档文件,也成为静态的库文件),那么它代表这个文档的文件名。在多目标模式规则中,它代表的是触发规则被执行的文件名。
$% 当目标文件是一个静态库文件时,代表静态库的一个成员名。
$< 规则的第一个依赖的文件名。如果是一个目标文件使用隐含的规则来重建,则它代表由隐含规则加入的第一个依赖文件。
$? 所有比目标文件更新的依赖文件列表,空格分隔。如果目标文件时静态库文件,代表的是库文件(.o 文件)。
$^ 代表的是所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有的库成员(.o 文件)名。
一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的第一次引用的情况。就是说变量“$^”会去掉重复的依赖文件。
$+ 类似“$^”,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。
$* 在模式规则和静态模式规则中,代表“茎”。“茎”是目标模式中“%”所代表的部分(当文件名中存在目录时,“茎”也包含目录部分)。
test:test.o test1.o test2.o
gcc -o $@ $^
test.o:test.c test.h
gcc -o $@ $<
test1.o:test1.c test1.h
gcc -o $@ $<
test2.o:test2.c test2.h
gcc -o $@ $<
赋值操作:
赋值的符号“=”
使用的‘‘’=’在给表量赋值的时候不一定要用的已经定义好的值,也可以使用的后面的进行定义的值:
name = zzk
curname = $(name)
name = zuozhongkai
print:
@echo curname:$(curname)
输出的值为:curname: zuozhongkai
赋值的符号“:=”
赋值运算符:=只会使用的前面定义的变量,不会使用后边定义的变量
赋值的符号“?=”
name ?= zuozhongkai
如果变量的没有被赋值,那么使用的当前的变量,如果的赋值了使用的之前的变量
赋值的符号“+=”
object = main.o input.o
object += calcu.o
追击赋值的时候object为: main.o input.o calcu.o
Makefile 函数的使用
Makefile函数,类似的C语言一样,Makefile的函数的定义格式为
$(函数名,参数集合) 或者为${函数名,参数集合}
- 函数subst
$(subst <from>,<to>,<text>)
将的字符串text中的<from>内容替换为<to>
$(subst zzk,ZZK,name is zzk)
输出的结果的为name is ZZK
- 函数patsubst
$(patsubst <pattern>,<replacement>,<text>)
此函数查找字符text中的字符中的单词是否符合的pattern的模式,如果符合这些模式的用replacement进行
替换,如果的<pattern>可以使用的通配符%,表示任意长度的字符串,如果的<replacement>中也包含的“%”
$(patsubst %.c,%.o,a.c,b.c.c.c)
替换的结果为
a.o b.o c.o
- 函数dir
$(dir <name...>)
此函数用来的获取的目录
$(dir </src/a.c>)
输出结果为/src
- 函数notdir
$(notdir <name...>)
此函数用来去除name中的文件名
$(dir </src/a.c>)
输出结果为a.c
- 函数foreach
$(foreach <var>,<list>,<text>)
此函数用来吧参数的list椎间盘每个的大妈参加哦逐一的提取出来,放在的<var>中,之后可以执行对应的<text>
- 函数wildcard
$(wildcard PATTERN...)
%只在用在规则的中,
$(wildcard *.c)
获得的当前目录下所有的的.c文件