=、:=、?=、+=
参数赋值
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
$@ 、$^、$< 、$?
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
@、-、+
@:使命令被执行前不回显
-:使任何命令行的任何非零退出状态都被忽略,忽略错误
+:使命令行可以通过指定 -n、-q 或 -t 选项来执行
wildcard、patsubst 、foreach、nodir
wildcard 扩展通配符
$(wildcard PATTERN...)
例如:$(wildcard *.c) 获取本目录下所有的.c文件列表,这个一般和patsubst配合使用
patsubst 替换通配符
OBJ = $(patsubst %.c %.o $(wildcard *.c))
首先使用wildcard获取当前目录所有.c文件列表,然后使用patsubst将所有后缀.c替换为.o
foreach 循环语句
$(foreach <var>,<list>,<text>)
<list>列表中逐一取出参数放到<var>中,然后执行<text>包含的表达式
例如:names := a b c d
files := $(foreach n,$(names),$(n).o) //name中挨个取出放到n中,执行$(n).o,所以files返回值为:a.o b.o c.o d.o
nodir 去除路径名,只保留文件名
src := $(wildcard arch/arm/configs/*.c
$(nodir $(src)) 为1.c 2.c
find
查询匹配
srcs := $(shell find $(src_dir) -name *.c -o -name *.cpp)
找到所有src_dir目录下的.c或者.cpp文件,保存在srcs中
-o 是或者的意思
-a 是而且的意思
-not 是相反的意思
filter / filter-out
过滤、反过滤
$(filter PATTERN…,TEXT)
过滤掉字串“TEXT”中所有不符合模式“PATTERN”的单词
srcs = a1.c a2.c b1.h b2.c
srcs = $(filter %.c, $(srcs))
返回值a1.c a2.c
$(filter-out PATTERN...,TEXT)
过滤掉字串“TEXT”中所有符合模式“PATTERN”的单词
srcs = a1.c a2.c b1.h b2.h
srcs = $(filter-out %.c, $(srcs))
返回值为b1.h b2.h
.PHONY
伪目标,防止Makefile中执行目标和时间文件名发生冲突
clean:
rm -f*.o
如果本目录存在clean文件,make clean会冲突报错
修改如下:
.PHONY clean
clean:
rm -f *.o
addprefix / addsuffix
addprefix :为每一项NAME添加前缀PREFIX
$(addprefix src/,foo bar)
返回为:src/foo src/bar
addsuffix:为每一项NAME添加后缀PREFIX
$(addprefix .o,foo bar)
返回为:foo.o bar.o