Makefile学习笔记
该文是阅读陈皓老师的《跟我一起写Makefile》的读书笔记,仅用于个人回顾复习。
基本操作
目标文件:依赖文件
tab+command
超简单的有没有,秒学会,然后你就可以开始写简单的Makefile了
像是这种:
//没用任何变量和隐含规则的Makefile
hello:hello.o
gcc -o hello hello.o
hello.o:
gcc -o hello.o -c hello.c
clean:
rm -rf hello.o #delete file hello.o
进阶学习
变量定义
OBJECT = main.o hello.o whatever.o
这样增加依赖关系时就不需要修改太多东西
clean
clean 一般放在makefile的最后,常见的写法为
.PHONY:clean
clean:
-rm -rf edit $(objects) //写要删除的文件
据说rm前的减号可以再某些文件出现问题时,自动跳过错误,继续进行指令。
简单的隐式规则
1.自动推导命令
只要 make 看到一个 .o 文件,它就会自动的把 .c 文件加在依赖关系中,如果 make 找到一个 whatever.o ,那么 whatever.c 就会是 whatever.o 的依赖文件。并且 cc -c whatever.c 也会被推 导出来,于是,我们的 makefile 再也不用写得这么复杂。因此有
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects)
cc -o edit $(objects)
main.o : defs.h
kbd.o : defs.h command.h
command.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h
//可以看到,这里.c的依赖跟命令都可以省略了
.PHONY : clean
clean :
rm edit $(objects)
2.收拢
因为依赖文件就三个,上述代码还可以简化为
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit : $(objects) cc -o edit $(objects)
$(objects) : defs.h kbd.o command.o files.o : command.h display.o insert.o search.o files.o : buffer.h
.PHONY : clean
clean :
rm edit $(objects)
Makefile细节
按照书中的顺序,通过以上对Makefile有一个基本认识后,需要进一步了解细节。
Makefile构成
- 显示规则
- 隐晦规则:包括但不限于上述的自动推导
- 变量定义
- 文件指示:可以在一个Makefile include进别的Makefile
- 注释:要用#开头,跟python一样
Makefile文件名
一般采用“Makefile”,这样make可以自动寻找。
如果采用别的名称,那就得用-f或–file参数
make -f 文件名
引用其他file
include"file name"
make会在当前目录下寻找文件
- 如果 make 执行时,有 -I 或 --include-dir 参数,那么 make 就会在这个参数所指定的目录下 去寻找。
- 如果目录 /include (一般是:/usr/local/bin 或 /usr/include )存在的话,make 也会去找。
- 如果定义了环境变量MAKEFILE,则相当于进行了一个include操作
make的工作方式
- 读入所有的 Makefile。
- 读入被 include 的其它 Makefile。
- 初始化文件中的变量。
- 推导隐晦规则,并分析所有规则。
- 为所有的目标文件创建依赖关系链。
- 根据依赖关系,决定哪些目标要重新生成。
- 执行生成命令。
参考书籍是陈皓老师的《跟我一起写Makefile》第一二章内容