makefile规则会自动展开通配符。 但是,对于变量定义和函数引用,通配符无效。 在这种情况下,如果通配符必须有效,则必须使用函数" wildcard "。 其使用方法为$(wildcard PATTERN…)。 makefile将在以空格分隔的与此模式匹配的所有现有文件的列表中展开。 如果没有与此模式匹配的文件,函数将忽略模式字符并返回空。 需要注意的是,这种情况下规则中通配符的展开和上一小节中通配符的不同。
通常,您可以使用“(wILDCARD.C )”来获取工作目录中记录的所有. c文件的列表。 使用复杂的用法,可以使用(wildcard *.c )来获取工作目录中所有. c文件的列表。 复杂的使用方法; 您可以使用(wildcard.c )来取得工作目录中所有. c档案的清单。 复杂的使用方法; 您可以先使用「(patsubst %.c,%.o,$ ) wildcard*.c」函数来取得工作目录中. c档案的清单。 然后,用. o替换列表中所有文件名的后缀. c。 这样就得到了可以在当前目录中生成的. o文件的列表。 因此,可以在单个目录中使用以下makefile来编译工作目录中的所有. c文件,最后将其连接到可执行文件:
# samplemakefileobjects :=$ (patsubst %.c,%.o,$(wildcard*.c ) ) foo:$ ) objects (cc-ofoo $ ) objects
1、通配符:扩展通配符
2、notdir :去除路径
3、patsubst :替换通配符
示例:
创建测试目录,然后在测试目录下创建名为sub的子目录
在$mkdirtest$CDtest$mkdirsubtest下,创建a.c和b.c两个文件,并在sub目录下,创建sa.c和sb.c两个文件
制作简单的makefile
src=$(wildcard*.c./sub/*.c ) dir=$ ) notdir$(src ) ) obj=$(Patsubst%.c,%.o,$ () dir ) ) aaaaad
第一行输出:
a.CB.c./sub/sa.c./sub/sb.cwildcard将解压缩指定目录.//和./sub/下所有后缀为c的文件。
第二行输出:
a.c b.c sa.c sb.c notdir从路径信息中删除解压缩的文件
第三行输出:
a.ob.osa.osb.o(Patsubst ) patsubst%.c,%.o,) Patsubst(dir ) )中,patsubst使) d i r )中的变化量一致,然后可以使用obj=(dir )变量进行任何输出。 或者,也可以将obj=(dir )变量与后缀. c匹配的所有内容替换为. o。 任何输出。 或者,可以使用obj=(dir:%.c=%.o )
效果也一样。
在此使用makefile的替换引用规则。 也就是说,用指定的变量替换其他变量。
标准的格式是
${var:a=b}或${var:a=b}
这意味着将变量var中每个值的末尾a替换为b