如何编写一个Makefile
Makefile是什么?
首先,我们使用make命令来自动检测程序的哪部分需要重新编译,并发出命令进行重编译。
那么make依据什么规则去检测和执行呢?这个规则就是makefile了。
一个标准的makefile如下:
target(目标) : prerequisites(先决条件)
recipe(方法)
target:文件或动作
prerequisites:条件或依赖,当发生改变时执行recipe生成target,该项可为空
recipe:具体操作
Makefile的编写规则
GNU Make Manual描述了makefile的功能和编写规则,本文自然也是参考官方文档。
1. 实例
# 依赖于main.o data.o screen.o生成myapp执行文件
myapp : main.o data.o screen.o
# main.o,data.o和screen.o的编译生成条件和方法
main.o : main.c defs.h
cc -c main.c
data.o : data.c defs.h
cc -c data.c
screen.o : screen.c command.h
cc -c screen.c
# clean target需要执行的操作,无依赖条件
clean :
rm myapp main.o data.o screen.o
- 当执行make时,defs.h和command.h一旦有变化,则所有依赖于它的target将被执行更新,因此将生成myapp执行文件。
- 当执行make clean时,clean作为操作的target,将会执行移除 myapp main.o data.o screen.o的操作。
2. 进阶
- 变量
# 定义变量
objects = main.o data.o screen.o
#使用变量
myapp : $(objects)
clean :
rm $(objects)
- 隐含规则
# implicit rule: updating a ‘.o’ file from a correspondingly named ‘.c’ file using a ‘cc -c’ command
# 银行规则:使用cc -c 命令从对应名字的.c文件来更新.o文件
main.o : defs.h
data.o : defs.h
screen.o : command.h
- 伪目标(Phony Target)
# 按以上的理解,正常的目标是需要生成一个文件名为clean,
# 但clean仅作为一个标签,执行特定功能,所以称为伪目标
clean :
rm $(objects)
# 使用伪目标,运行make clean会执行删除操作,而不管是否有文件名为clean的文件
.PHONY: clean
clean:
rm $(objects)
参考
总结
makefile的编写规则不难掌握,难的是如何静下心来读一读文档。了解了makefile的基本组成,那么更进一步的学习还是需要阅读官方文档的,文档描述了很多的变量规则,隐含规则等等,在使用的过程中学习,makefile将会变得简单明了。