首页 > 代码库 > Makefile 初探
Makefile 初探
- Makefile简介
Makefile是一些编译规则(规定了各种依赖关系)和一些命令的集合,可以说是大型工程必须可少的一部分。之前从未接触过Makefile,直到下载点云库自己编译时以及编译一些开源代码时才发现Makefile。Makefile可以说命令的集合,make则是命令的解释工具。那么如何编写Makefile呢?下面是我参考陈皓大神和网上其他一些博客的简单总结。
- Makefile组成
可以把Makefile看成由以下5个部分组成:
1、显示规则,即目标是为什么,依赖文件是什么,命令是什么都清晰的写出来
2、隐晦规则,比如a.o : a.h则可由make自动展开为a.o : a.c a.h g++ -c a.o a.c
3、变量定义
4、文件指示(Makefile包含其他Makefile),使用include
5、注释,使用‘#’
- Makefile初级用法
- 简单规则
1、最终目标文件一般放在最开始的位置,然后根据依赖关系递归地添加其他目标文件和依赖关系
2、命令以Tab键开始
3、换行符‘\’
4、在规则中可以直接使用通配符,如
clean :
rm -f *
5、变量替换用 $()
- 路径搜索
我们组织工程时,一般.h文件放在head文件夹,.c文件放在source文件夹,那么在当前文件夹可以就搜索不到文件,那么必须指定搜索路径
我们可以用VPATH指定附加的搜索路径,如
# 示例1 - 当前目录中找不到文件时, 按顺序从 src目录 ../parent-dir目录中查找文件,文件之间以:为分隔符VPATH src:../parent-dir
当然我们还可以使用make的关键字vpath
# 示例2 - .h结尾的文件都从 ./header 目录中查找vpath %.h ./header# 示例3 - 清除示例2中设置的规则vpath %.h# 示例4 - 清除所有VPATH的设置vpath
- Makefile命令前缀
Makefile 中书写shell命令时可以加2种前缀 @ 和 -, 或者不用前缀.
3种格式的shell命令区别如下:
1、不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行
2、前缀 @ :: 只输出命令执行的结果, 出错的话停止执行
3、前缀 - :: 命令执行有错的话, 忽略错误, 继续执行
- 伪目标
如我们常用的make clean中的clean就是一个伪目标,伪目标不会自动执行。
伪目标的一般格式为:
.PHONY: clean <-- 这句没有也行, 但是最好加上clean: -rm -f *.o
- 查看文件依赖关系
写 Makefile 的时候, 需要确定每个目标的依赖关系.
GNU提供一个机制可以查看C代码文件依赖那些文件, 这样我们在写 Makefile 目标的时候就不用打开C源码来看其依赖那些文件了.
比如, 下面命令显示内核源码中 virt/kvm/kvm_main.c 中的依赖关系
$ cd virt/kvm/$ gcc -MM kvm_main.c kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h <-- 这句就可以加到 Makefile 中作为编译 kvm_main.o 的依赖关系
高级语法无非是一些宏定义和Makefile函数之类的,可以参考博客
Makefile 初探