1 patsubst: 替换通配符
格式:
$(patsubst <pattern>,<replacement>,<text> )
名称:模式字符串替换函数——patsubst。
功能:查找text中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式pattern,如果匹配的话,则以替换。
这里,pattern可以包括通配符“%”,表示任意长度的字串。如果replacement中也包含“%”,那么,replacement中的这个“%”将是pattern中的那个“%”所代表的字串。
(可以用“\”来转义,以“%”来表示真实含义的“%”字符)
返回:函数返回被替换过后的字符串。
示例:
$(patsubst %.c,%.o, 1.c 2.c)
把字串“1.c,2.c”符合模式[%.c]的单词替换成[%.o],返回结果是“1.o 2.o”
2 wildcard: 扩展通配符
wildcard得到指定目录下所有的C语言源程序文件名
SRC = $(wildcard *.c)
编译当前目录下所有.c文件,如果还有子目录,比如子目录为inc,则:
SRC = $(wildcard *.c) $(wildcard inc/*.c)
3 notdir: 去除路径
notdir把展开的文件去除掉路径信息
4 综合应用
首先创建如下的目录结构
src = $(wildcard *.c ./sub/*.c)
dir = $(notdir $(src))
obj = $(patsubst %.c,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
wildcard把 指定目录 ./ 和 ./sub/ 下的所有后缀是c的文件全部展开。
notdir把展开的文件去除掉路径信息
patsubst把$(dir)中的变量符合后缀是.c的全部替换成.o
第三句相当于obj=$(dir:%.c=%.o)
5 扩展
Makefile有三个非常有用的变量。分别是@ , @,@,^,$<代表的意义分别是:
$@---------------------------目标文件
$^----------------------------所有的依赖文件
$<----------------------------第一个依赖文件下面给出傻瓜的makefile
main:main.o 1.o 2.o
gcc -o main main.o 1.o 2.o
main.o:main.c 1.h 2.h
gcc -c main.c
1.o:1.c 1.h
gcc -c 1.c
2.o:2.c 2.h
gcc -c 2.c
简化后变成了
main:main.o 1.o 2.o
gcc -o $@ $^
main.o:main.c 1.h 2.h
gcc -c $<
1.o:1.c 1.h
gcc -c $<
2.o:2.c 2.h
gcc -c $<
在此简化
main:main.o 1.o 2.o
gcc -o $@ $^
.c.o:
gcc -c $<
表示所有的 .o文件都是依赖与相应的.c文件的