
上两篇我们讲了GCC编译器、GDB调试器,现在我们讲讲MAKE。
GNU MAKE
在软件开发中,make是一个工具程序(Utility software),经由读取叫做“makefile”的文件,自动化建构软件。
它是一种转化文件形式的工具,转换的目标称为“target”;与此同时,它也检查文件的依赖关系,如果需要的话,它会调用一些外部软件来完成任务。它的依赖关系检查系统非常简单,主要根据依赖文件的修改时间进行判断。大多数情况下,它被用来编译源代码,生成结果代码,然后把结果代码连接起来生成可执行文件或者库文件。
它使用叫做“makefile”的文件来确定一个target文件的依赖关系,然后把生成这个target的相关命令传给shell去执行。
它的作用功能和集成开发环境是一样的。
Make与Makefile的关系
就像Shell与脚本,计算机与程序之间的关系。Makefile告诉Make要去做什么,需要什么,以及怎么样做。而Make负责执行这些指令。
Makefile
规则是Makefile的重要组成部分,它规定了做什么,需要什么,以及怎么样去做这三部分的内容。规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。
一个规则结构如下:
1 2 3 |
TARGET... : DEPENDENCIES ... COMMAND ... |
目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。
依赖(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件。
命令(COMMAND)是make 执行的动作,一个可以有多个命令,每个占一行。
注意:每个命令行的起始字符必须为TAB 字符!
有依赖关系规则中的命令通常在依赖文件变化时负责产生target 文件,make 执行这些命令更新或产生target。规则可以没有依赖关系,如包含target “clean”的规则。
规则解释如何和何时重做该规则中的文件,make 根据依赖关系执行产生或更新目标;规则也说明如何和何时执行动作。有的规则看起来很复杂,但都符合上述模式。
Make执行的路线
当在shell提示符下输入“make”命令以后。make读取当前目录下的Makefile文件,并将Makefile文件中的第一个目标作为其执行的“终极目标”,开始处理第一个规则。根据其依赖文件依次寻找创建这些依赖文件的规则。首先为第一个依赖文件寻找创建规则,如果第一个依赖文件依赖于其它文件,则同样为这个依赖文件寻找创建规则,直到为所有的依赖文件找到合适的创建规则。之后make从最后一个规则回退开始执行,最终完成终极目标的第一个依赖文件的创建和更新.对于规则中的每一个依赖文件,使用同样方式去重建它,在完成对所有依赖文件的重建之后,最后一步才是重建此规则的目标。
Make命令
1 2 3 4 |
make [选项] [make描述文件] [宏定义] [目的文件] //例如 make -f Makefile hello |
make首先分析所有的宏定义参数(带嵌入等号的参数)并进行赋值,宏命令行覆盖在makefile中进行的定义,然后检验选项标志,最后递归的对每一个目的依赖文件进行检查。
1 2 3 4 5 6 7 8 9 10 11 12 |
-f file //指定file文件为描述文件,如果file参数为"-"符,那么描述文件指向标准输入。 //如果没有"-f"参数,则系统将默认当前目录下名为 makefile或者名为Makefile //的文件为描述文件。在Linux中,GNU make工具在当前工作目录中按照 //GNUmakefile、makefile、Makefile的顺序搜索 makefile文件。 -i //忽略命令执行返回的出错信息。 -s //沉默模式,在执行之前不输出相应的命令行信息。 -r //禁止使用build-in规则。 -n //非执行模式,输出所有执行命令,但并不执行。 -t //更新目标文件。 -q //make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息。 -p //输出所有宏定义和目标文件描述。 -d //Debug模式,输出有关文件和检测时间的详细信息。 |
1 2 3 4 |
-c dir //在读取 makefile 之前改变到指定的目录dir。 -I dir //当包含其他 makefile文件时,利用该选项指定搜索目录。 -h //help文挡,显示所有的make选项。 -w //在处理 makefile 之前和之后,都显示工作目录。 |
make命令其实不多,因为make的核心在于makefile的写法。
这又涉及到很多的内容,为了不给看这篇文章的访客太大压力,我们决定在接下来的文章再详解makefile文件的写法。
本文链接地址: Linux Programming, Language C 3 – MAKE
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
如果您愿意为文章的内容或想法提供支持,欢迎点击下边的捐赠按钮,资助作者创作更多高价值高品质的内容。