$(foreach val,list,text)#在text中取出符合patten格式的值 $(filter patten…,text)#在text中取出符合patten格式的值 $(filter-out patten…,text )#在text中取出不符合patten格式的值 $(wildcard patten) #patten定义了文件名的格式 #wildcard取出其中真实存在的文件 $(patsubst patten,replacement,text)#从列表中取出每一个值,若符合patten格式,则替换为replacement格式 eg:
A = a b c B = $(foreach f,$(A),$(f).o) C = a b c d/ D = $(filter %/,$(C)) E = $(filter-out %/,$(C)) files = $(wildcard *.c) files2 = d.c A.c B.c c.c e.c files3 = $(wildcard $(files2)) dep_files = $(patsubst %.c,%d,$(files2)) all: @echo B = $(B) @echo D = $(D) @echo E = $(E) @echo files = $(files) @echo files2 = $(files3) @echo dep_files = $(dep_files)gcc -M c.c//打印出c的依赖文件 gcc -M -MF c.d c.c //把依赖文件写入文件场c.d gcc -c -o c.o c.c -MD -MF c.d//编译c.o,把依赖文件写入c.d
eg:
objs = A.o B.o C.o dep_files := $(patsubst %,.%.d,$(objs)) dep_files := $(wildcard $(dep_files)) CFLAGS = -Werror -Iinclude#把所有警告当错误处理,-I(头文件夹名),让gcc去-I指定的文件夹搜索.h文件 test:$(objs) gcc -o test $^ ifneq ($(dep_files),) include $(dep_files) endif %.o : %.c gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d #.$@.d的最开始.代表隐藏文件 clean: rm *.o test distclean: rm $(dep_files) .PHONY:clean