一. 背景
Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建
的项目,都可以用Make构建。
make只是一个根据指定的Shell命令进行构建的工具。它的规则很简单,你规定要构建哪个文件、它依赖哪些源文件,当那些
文件有变动时,如何重新构建它。
二. Make
Make是一个很简单命令.
make . //构建当前目录
但先编译哪个文件,哪个文件为哪个文件的依赖,都在一个名为Makefile的文件中描述,接下来看一下Makefile文件.
三. Makefile
3.1组成
<target> : <prerequisites>
[tab] <commands>
<目标> : <前置条件>
[tab] <命令>
上面第一行冒号前面的部分,叫做"目标"(target),冒号后面的部分叫做"前置条件"(prerequisites);第二行必须
由一个tab键起首,后面跟着"命令"(commands)。
下面是每个组成的详细讲解:
1. 目标(target)
一个目标(target)就构成一条规则。目标通常是文件名,指明Make命令所要构建的对象. 目标可以是一个文件名,也可以
是多个文件名,之间用空格分隔。
除了文件名,目标还可以是某个操作的名字,这称为"伪目标"(phony target)。
clean:
rm *.o
.PHONY: clean//声明为伪目标
clean:
rm *.o temp
2. 前置条件(prerequisites)
前置条件通常是一组文件名,之间用空格分隔。它指定了"目标"是否重新构建的判断标准:只要有一个前置文件不存在,或者
有过更新(前置文件的last-modification时间戳比目标的时间戳新),"目标"就需要重新构建。
简单描述就是说,在编译当前文件之前要确定某些文件已经存在,不存在就报错.
result.txt: source.txt
cp source.txt result.txt
//在生成result.txt时,要确保sourcs.txt文件存在
小技巧
source: file1 file2 file3
$ make source
//可以一下子生成三个文件
3. 命令(commands)
命令(commands)表示如何更新目标文件,由一行或多行的Shell命令组成。它是构建"目标"的具体指令,它的运行结果通常就是生成目标文件。
.RECIPEPREFIX = >
all:
> echo Hello, world
四. Makefile语法
1 注释
其注释形式和一些脚本语言很像
# 注释
result.txt: source.txt
# 这是注释
cp source.txt result.txt # 这也是注释
2 回声
正常情况下,make会打印每条命令,然后再执行,这就叫做回声(echoing)。
关闭回声的方法
test:
@# 测试回声
3. 通配符
通配符(wildcard)用来指定一组符合条件的文件名。Makefile 的通配符与 Bash 一致,主要有星号(*)、问号(?)和 [...] 。比如, *.o 表示所有后缀名为o的文件。
clean:
rm -f *.c //删除所有的.c文件
4. 模式匹配
Make命令允许对文件名,进行类似正则运算的匹配,主要用到的匹配符是%。比如,假定当前目录下有 f1.c 和 f2.c 两个源码文件,需要将它们编译为对应的对象文件。
%.o: %.c
//两者等价
f1.o: f1.c
f2.o: f2.c
使用匹配符%,可以将大量同类型的文件,只用一条规则就完成构建。
5. 变量和赋值符
Makefile 允许使用等号自定义变量。
txt = Hello World//直接用等号定义变量
test:
@echo $(txt) //使用变量时要把变量放入$()内
test:
@echo $$HOME
参考资料:Make教程