什么是makefile?
简单的理解为一个工程文件的编译规则,指定了哪些文件先编译,哪些文件后编译,哪些不需要编译等等。
makefile 规则
简单的makefile 文件
test:hello.c
gcc -o hello hello.c
clean:
rm -f hello
特别主意:每个命令前必须是一个TAB符,不可以用空格。
1. 命令格式
target:required
<TAB>commond
target
就是要生成文件的名称,可以是OBJ文件或可执行文件,
或者一个命令 例如: clean。
required
就是需要依赖的文件,源码,可以有多个。
commond
就是生成目标文件时执行的命令,过程中可以有多个命令,
每个命令占据一行。
2. makefile文件中变量的定义
变量定义的语法形式
immediate = deffered (递归赋值)
immediate ?=deffered (条件赋值)
immediate :=immediate(简单赋值)
immediate +=deffered or immediate (追加赋值)
define immediate
deffered
endef
在GNU make 对变量的赋值两种方式,立即变量,延时变量。
延时变量:真正使用的时候才确定值,使用 = ,?= define 定义的是延时变量。
立即变量::= 赋值是立即变量
3. makefile 常用函数
函数调用格式如下:
$(function arguments)
这里的function 是函数名,arguments 是参数。 函数名和参数之间用空格隔开,后者用tab隔开,多个参数用 ,隔开。
-
$(subst from,to, text)
在text 文本中 from 替换每一个to 例如:$(subst EE ,ee, free fresh) 运行结果为 "frEE fresh " -
$(patsubst pattern ,replacement ,text )
在 text 中符合pattern 规则的 用 replacement 来替换。 例如:$(patsubstr %.c,%.o , test.c a.c b.c) 把所有.c 文件替换为.o 文件。 运行结果为:"test.o a.o c.o" -
$(strip string)
去掉前导和尾端的空格,并且中间的多个空格变为一个空格。 -
$(findstring target, in )
在 in 中查找 target ,如果找到返回target,否则返回空 例如:(findstring a, c,b) 那么返回 " "。 -
$(filter pattern... , text )
过滤 text 中 不符合pattern 的内容。 -
$(filtere-out pattern..., text)
filter 的反函数 保留text符合中符合 pattern的内容。 -
$(sort list)
list 中的字按字母排序,并且去掉重复的,单个空格隔开。 -
$(dir names...)