makefile的常用函数及特殊字符
makfile的常用函数
下面的常用函数掌握以下,也不用记得住,用时候过来取就行,基本就没问题了
$(wildcard *.c) #同一类型的文件 *.h *.cpp等
$(wildcard $(SRC)/*.c) #同一类型的文件 *.h *.cpp等
$(patsubst *.c, *.o, $(SRC)) #SRC 变量中的所有.c替换为.o
$(patsubst %, -I %, $(INC)) #INC 变量中的所有值前加I
$(foreach dir, $(SRC), $(wildcard $(dir)/*.c)) #提取SRC目录(包含子目录)下的所有c文件
$(notdir $(CFILES)) #去掉CFILES变量的目录信息 /test/hello.c => hello.c
OBJS := $(addprefix $(OBJ_DIR)/,$(OBJS)) #给 OBJS 加路径前缀,使其变成完整路径的形式
OBJS = $(SRCS:.c=.o) #根据.c推导出.o
OBJS = $(filter %.o %.c, $(OBJS)) # 返回OBJS中的.o和.c文件 ,过滤函数: $(filter <pattern...>,<text>),保留符合模式 <pattern> 的字符串
makefile的常用特殊字符
$< #第一个依赖文件
$^ #所有依赖文件
$@ #目标文件
$? #代表当前目标所依赖的文件列表中比当前目标文件还要新的文件
makfile的“等号区别”
= #是最基本的赋值
:= #是覆盖之前的值
?= #是如果没有被赋值过就赋予等号后面的值
+= #是添加等号后面的值
#make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
#在上例中,y的值将会是 xyz bar ,而不是 foo bar
x := foo
y := $(x) bar
x := xyz
#y的值将会是 foo bar ,而不是 xyz bar 了