基础语法
目标:依赖1 依赖2 依赖3…
如果依赖比目标新,那么执行命令
例如
test :a.o b.o
gcc -o test a.o b.o
a.o : a.c
gcc -c -o a.o a.c
b.o : b.c
gcc -c -o b.o b.c
执行规则
执行规则就是,当某个依赖文件不存在,或者依赖比目标新,就会产生对应的编译动作
写makefile时还有更简单的方法,利用通配符%
%.o:表示所用的.o文件
%.c:表示所有的.c文件
\$\@:表示目标
\$\<:表示第1个依赖文件
\$\^:表示所有依赖文件
相当于C语言里面的冒号一样,就省了写那么多规则了
makefile调用语法为make 目标,如果没有制定目标,就像我们常用的make,它就默认执行第一个目标
变量
对于makefile的变量大概分为即时变量和延时变量:
即时变量创建立刻确定值
延时变量使用时才会赋值
:= 即时变量
= 延时变量
?= 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
\+= 附加, 它是即时变量还是延时变量取决于前面的定义
函数
foreach
$(foreach a,b,c)
把b赋给a,然后按c的格式改写,如:
A = a b c
B = $(foreach f, &(A), $(f).o)
all:
@echo B = $(B)
就会输出B = a.o b.o c.o
filter/filter-out
$(filter aaa...,text)
从text中取出符合aaa形式的值
$(filter-out aaa...,text)
从text中取出不符合aaa形式的值
Wildcard
$(wildcard aaa)
在当前目录下取出复合aaa形式的文件,如$(wildcard *.c)
就取出所有.c文件
$(wildcard $(files2))
还可以这样取出files2中真实存在的文件
Patsubst
$(patsubst 格式1,格式2,$(文件/变量))
从文件或变量中取出符合格式1的,将其替换为格式2,
实际应用如:$(patsubst %.c,%.d,$(files))
将files中的.c文件替换成.d文件
依赖的查询与添加
gcc -M 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