1.Makefile中的内部参数
$@ 表示目标文件
$^ 表示所有的依赖文件
$< 表示第一个依赖文件
$? 表示比目标还要新的依赖文件列表
$+ 同样表示所有依赖目标的集合(不去除重复的依赖目标)
2.调用变量
Makefile变量使用 ()或者 ( ) 或 者 {}来调用,如果是shell变量,则需要使用$$来引用。
一种变量替换方法:
src := a.c b.c
obj := $(src:%.o=%.c)
变量赋值方法:
= 基本的赋值
:= 覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值(一般可用来设置默认值)
+= 追加变量
这里需要注意=和:=的区别,:=赋值是从它在Makefile中的位置处开始生效的,在它之前的变量还保持原有值,而=会以最后一个赋值为准,并且之前的引用也会被更新。所以如果定义的变量是在Makfile中会变化的,一定要使用:=。
3.通配符
需要注意:Makefile 中通配符%表示所有的字符,不要和shell语法告混淆,shell 中通配符*表示所有的字符
4.调用shell命令
使用$(shell …)格式来调用shell命令
多个命令连续执行需要以\连接,因为Makefile执行shell是按行执行
SUBDIR=src example
all:
@for subdir in $(SUBDIR); \
do\
echo "building "; \
done
这里在shell命令前加@符号,主要目的是不让该条命令显示在makefile中的编译log中,当然该条指令依然会执行,只不过是“默默”的执行。
- 以`符号来执行,比如:PATH=`pwd`
5.函数
函数调用方式:
例如:$(wildcard *.c),常用函数如下:
wildcard : 扩展通配符
notdir : 去除路径
patsubst :替换通配符
strip: 去空格
filter: 过滤
filter_out:反过滤
addprefix:加前缀
addsuffix:加后缀