本文是基于韦东山视频的学习笔记
函数
函数就多咯,只说几个常用的吧。
- $(foreach var,list,text) //把list中的每个元素逐个循环地赋值给var
- $(filter patten…, text) //过滤函数
- $(filter-out patten…, text) //反过滤函数…?反正和过滤函数是反的
- $(wildcard patten) //用来找当前目录的文件的,patten是关键字
- $(patsubst patten, replacement, $(var)) //替代函数
A = a b c
B = $(foreach f, $(A), $(f).o)
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out $/, $(C))
# 当前目录下有a.c b.c c.c
files = $(wildcard *.c)
files2 = a.c b.c c.c d.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 files3 = $(files3)
@echo dep_files = $(dep_files )
执行结果为:
B = a.o b.o c.o
D = d/
E = a b c
files = a.c c.c b.c
files3 = a.c b.c c.c
dep_files = a.d b.d c.d d.d e.d
实例
其实之前的Makefile文件是有个致命缺陷的,在Make file里面并没有包含.h文件。缺陷是,万一修改了.h文件,Make file文件是不会重新生成目标文件的,所以呀
hello: A.o B.o C.o D.o E.o
gcc -o hello $^
# 需要把.h也加入为c.o的依赖文件,这样一来.h文件更新时Make file就会重新生成
c.o: c.c c.h
%.o: %.c
gcc -c -o $@ $<
clean:
rm *.o hello
.PHONY: clean
问题来了,难道所有头文件都要我自己手动添加吗,早就有人想到了:自动生成依赖。
gcc -M hello.c
//打印hello.c的依赖文件gcc -M -MF hello.d hello.c
//把依赖写进hello.dgcc -c -o hello.c -MD -MF hello.d
//编译,并把依赖写进hello.d
对于选项,这里比较详细的说明:Linux Makefile 生成 *.d 依赖文件以及 gcc -M -MF -MP 等相关选项说明——Jerry.yl
同样地,每个目标文件生成依赖我都要这样写!?
函数的作用就来了。
objs = A.o B.o C.o D.o E.o
dep_file := $(patsubst %.o, .%.d, $(objs)) #所有依赖文件名字变量存储在dep_files
hello:
gcc -o hello $^
include $(dep_file) #把包含所有依赖文件包含起来
%.o: %.c
gcc -c -o $@ $< -MD -MF .$@.d #文件前面的点“.”是指在当前目录隐藏
clean:
rm *.o hello
disclean:
rm $(dep_files) #删除所有依赖文件
.PHONY: clean