目录
make--自动化构建工具
引入
介绍
包含
显式规则
隐晦规则
变量定义
文件指示
注释
使用
test:test.c
.PHONY
介绍
作用
示例
原理
示例
介绍
make--自动化构建工具
引入
- 在软件开发过程中,通常需要编译、链接和构建大量的源代码文件
- 如果全部由开发人员手动执行的话,太太太麻烦了
- make可以自动化这些构建过程
- 除了这个用处,make还有很多非常好的优点
介绍
- make是一条命令,makefifile是一个文件,两个搭配使用,完成项目自动化构建
- makefifile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 -- 也就是可以管理源代码文件之间的依赖关系
- make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出 -- 也就是可以自动化构建过程
- 支持模块化的构建,可以将复杂的项目分解为多个独立的模块,每个模块有自己的构建规则
- 可以执行增量构建,只编译那些已更改的文件,而不是每次都重新编译整个项目
一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefifile都成为了一种在工程方面的编译方法
包含
makefile文件中,保存了编译器和链接器的参数选项,并且描述了所有源文件之间的关系
makefile里主要包含了五个东西:显式规则、隐晦规则、变量定义、文件指示和注释
显式规则
- 显式规则定义了目标(target)文件如何由依赖文件(prerequisites)生成
- 目标是要生成的文件
- 依赖文件是生成目标所需的输入文件列表
- 而配方(recipe)是执行生成目标所需的命令
隐晦规则
- make有自动推导的功能
- 所以隐晦的规则可以让我们不需要明确列出生成规则
- 比如源文件与目标文件之间的时间关系判断之类(eg: .c文件生成.o文件)
变量定义
- 在makefile中可以定义变量
- 当makefile被执行时,其中的变量都会被扩展到相应的引用位置上
- 通常使用 $(var) 表示引用变量
文件指示
- 包括一些特殊的指令,配置make的行为
- eg:.PHNOY指令用于声明伪目标
注释
- 可以使用 # 在行首表示行注释
- 用于提供有关规则、变量和文件的描述性信息
使用
默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件
例如,这是一个makefile文件
test:test.c
- 表示我们需要生成的 test可执行文件 依赖于 test.c(也就是test的依赖关系)
- 下一行紧跟着的就是他俩的依赖方法 -- test是由test.c使用gcc编译而来
.PHONY
介绍
- .PHONY是一个特殊的目标名称,用于在Makefile中声明一个伪目标
- 它不代表一个实际的文件名,而是用于定义一组命令或动作
作用
告诉make工具该目标"不依赖于文件的存在与否",每次执行都需要执行相应的命令
- 通常,make工具会检查目标文件和依赖文件的时间戳来判断是否需要重新构建目标,,如果不需要它会提示你
- 但是,有时候我们希望在没有实际文件依赖的情况下,也能执行一些操作或命令
示例
- 当我们输入make clean时,它会直接执行我们写的clean依赖方法(由于clean不需要依赖什么文件,因此没有依赖对象)
构建好makefile文件以及内容后,直接输入make命令即可执行从上到下的第一个依赖关系
原理
示例
实际上:简单的一句依赖方法,是需要生成多个依赖文件的
介绍
- 它会不断寻找目标文件所需要的依赖文件,并且不断往前推进,直到找到源文件为止
- 这样按照这个顺序,从源文件开始不断生成中间文件,最终就能得到我们的目标文件