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函数之类的,可以参考博客

posted on 2017-07-23 16:02  Seven_noon  阅读(146)  评论(0编辑  收藏  举报