Makefile官方中文手册(二)怎样编写Makefile

Makefile系列文章第一篇 Makefile官方中文手册(一)什么是Makefile

2.1 什么是“规则”以及怎样编写“规则”

一个简单的Makefile包含若干个“规则”,每一个都有如下形式:

target ... : prerequisites ...	
	recipe
	...
	...

target通常是一个文件名,这个文件是通过某些过程生成的,比如说通过编译生成的可执行文件或者目标文件,都可以作为targettarget也可以是一个特定操作的名字,比如说“clean”,可以在“clean”下实现清除工程的命令。

prerequisite是用来产生target的文件,一个target通常需要依赖若干个文件。

recipe是make将要执行的命令行,recipe中可能会有一个或者多个命令。需要注意: 每一行recipe命令最前面必须要有一个tab制表符,这一点常常让粗心大意的人掉到坑里。如果你习惯于用其他的符号(比如说空格)来缩进代码,你可以通过.RECIPEPREFIX变量来改变这一设置。(参见6.14节 [特殊变量])。

recipe命令行中通常会含有prerequisite,如果prerequisite中的文件被修改了,将用prerequisite来生成目标文件target。但是有一些规则中没有prerequisite,比如说用来执行删除命令的target就不需要prerequisite.

Makefile中的“规则”解释了怎样以及什么时候来重新编译特定的文件,从而生成指定的目标。make命令执行recipe中的命令行来操作prerequisite中的文件,从而生成或更新目标target。“规则”也可以用于解释怎样以及什么时候执行一些特定的动作。

一个Makefile文件可能会包含一些其他的文本,但是一个简单的Makefile仅仅需要包含“规则”。下面所举的例子中的规则可能看上去很复杂,但是它们基本上都符合上述的模板。

2.2 一个简单的Makefile

下面这个Makefile直接描述了一个可执行文件“edit”是如何依赖于其他的文件。可执行文件“edit”依赖于8个目标文件(*.o),而这8个目标文件又依赖于8个相应的C语言源文件和3个头文件。
在这里插入图片描述
我们将每一行用反斜杠分割成两行,这样的效果和一行是一样的,但是这样可读性更强

使用该Makefile文件生成可执行文件edit,应该在终端中输入:

make

使用该Makefile文件删除当前目录中的可执行文件和所有的目标文件,应该在终端输入:

make clean

在上面这个Makefile示例中,target包括可执行文件“edit”以及“main.o”、“kbd.o”等目标文件(object file),而prerequisite是指“main.c”、“defs.h”等文件。实际上每一个*.o文件都既是target又是prerequisiterecipe包括“cc -c main.c”、“cc -c kbd.c”等命令。

target为一个文件时,当它的prerequisite依赖文件被修改时,他就需要被重新编译和重新链接。在这个例子中edit依赖于8个目标文件;目标文件object.o依赖于源文件main.c以及defs.h头文件

recipe可以跟在targetprerequisite所在行的下一行,recipe告诉make命令怎样更新target文件。为了在Makefile中区分recipe和其它行,recipe的最前面必须有一个制表符。(记住,make命令不知道recipe中的命令是怎么样工作的,当target需要被更新时,它只是简单的执行你所编写的recipe)。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【推荐】GNU make中文手册,详细介绍了makefile的用法和规则等。目录如下:<br>第一章:概述<br>1.1 概述<br>1.2 准备知识<br>第章:GNU make 介绍<br>2.1 Makefile简介<br>2.2 Makefile规则介绍<br>2.3 简单的示例<br>2.4 make如何工作<br>2.5 指定变量<br>2.6 自动推导规则<br>2.7 另类风格的makefile<br>2.8 清除工作目录过程文件<br>第三章:Makefile 总述<br>3.1 Makefile的内容<br>3.2 makefile文件的命名<br>3.3 包含其它makefile文件<br>3.4 变量 MAKEFILES<br>3.5 变量 MAKEFILE_LIST<br>3.6 其他特殊变量<br>3.7 makefile文件的重建<br>3.8 重载另外一个makefile<br>3.9 make如何解析makefile文件<br>3.9.1 变量取值<br>3.9.2 条件语句<br>3.9.3 规则的定义<br>3.10 总结<br>第四章:Makefile的规则<br>4.1 一个例子<br>4.2 规则语法<br>4.3 依赖的类型<br>4.4 文件名使用通配符<br>4.4.1 统配符使用举例<br>4.4.2 通配符存在的缺陷<br>4.4.3 函数wildcard<br>4.5 目录搜寻<br>4.5.1 一般搜索(变量VPATH)<br>4.5.2 选择性搜索(关键字vpath)<br>4.5.3 目录搜索的机制<br>4.5.4 命令行和搜索目录<br>4.5.5 隐含规则和搜索目录<br>4.5.6 库文件和搜索目录<br>4.6 Makefile伪目标<br>4.7 强制目标(没有命令或依赖的规则)<br>4.8 空目标文件<br>4.9 Makefile的特殊目标<br>4.10 多目标<br>4.11 多规则目标<br>4.12 静态模式<br>4.12.1 静态模式规则的语法<br>4.12.2 静态模式和隐含规则<br>4.13 双冒号规则<br>4.14 自动产生依赖<br>第五章:规则的命令<br>5.1 命令回显<br>5.2 命令的执行<br>5.3 并发执行命令<br>5.4 命令执行的错误<br>5.5 中断make的执行<br>5.6 make的递归执行<br>5.6.1 变量MAKE<br>5.6.2 变量和递归<br>5.6.3 命令行选项和递归<br>5.6.4 -w选项<br>5.7 定义命令包<br>5.8 空命令<br>第六章:Makefile中的变量<br>6.1 变量的引用<br>6.2 两种变量定义(赋值 )<br>6.2.1 递归展开式变量<br>6.2.2 直接展开式变量<br>6.2.3 如何定义一个空格<br>6.2.4 “?=”操作符<br>6.3 变量的高级用法<br>6.3.1 变量的替换引用<br>6.3.2 变量的套嵌引用<br>6.4 变量取值<br>6.5 如何设置变量<br>6.6 追加变量值<br>6.7 override 指示符<br>6.8 多行定义<br>6.9 系统环境变量<br>6.10 目标指定变量<br>6.11 模式指定变量<br>第七章:Makefile的条件执行<br>7.1 一个例子<br>7.2 条件判断的基本语法<br>7.2.1 关键字“ifeq”<br>7.2.2 关键字“ifneq”<br>7.2.3 关键字“ifdef” <br>7.2.4 关键字“ifndef”<br>7.3 标记测试的条件语句<br>第八章:make的内嵌函数<br>8.1 函数的调用语法<br>8.2 文本处理函数<br>8.2.1 $(subst FROM,TO,TEXT)<br>8.2.2 $(patsubst PATTERN,REPLACEMENT,TEXT)<br>8.2.3 $(strip STRINT)<br>8.2.4 $(findstring FIND,IN)<br>8.2.5 $(filter PATTERN…,TEXT)<br>8.2.6 $(filter-out PATTERN...,TEXT)<br>8.2.7 $(sort LIST)<br>8.2.8 $(word N,TEXT)<br>8.2.9 $(wordlist S,E,TEXT)<br>8.2.10 $(words TEXT)<br>8.2.11 $(firstword NAMES…)<br>8.3 文件名处理函数<br>8.3.1 $(dir NAMES…)<br>8.3.2 $(notdir NAMES…)<br>8.3.3 $(suffix NAMES…)<br>8.3.4 $(basename NAMES…)<br>8.3.5 $(addsuffix SUFFIX,NAMES…)<br>8.3.6 $(addprefix PREFIX,NAMES…)<br>8.3.7 $(join LIST1,LIST2)<br>8.3.8 $(wildcard PATTERN)<br>8.4 foreach 函数<br>8.5 if 函数<br>8.6 call函数<br>8.7 value函数<br>8.8 eval函数<br>8.9 origin函数<br>8.10 shell函数<br>8.11 make的控制函数<br>8.11.1 $(error TEXT…)<br>8.11.2 $(warning TEXT…)<br>第九章:执行make<br>9.1 指定makefile文件<br>9.2 指定终极目标<br>9.3 替代命令的执行<br>9.4 防止特定文件重建<br>9.5 替换变量定义<br>9.6 使用make进行编译测试<br>9.7 make的命令行选项<br>第十章:make的隐含规则<br>10.1 隐含规则的使用<br>10.2 make的隐含规则一览<br>10.3 隐含变量<br>10.3.1 代表命令的变量<br>10.3.2 命令参数的变量<br>10.4 make隐含规则链<br>10.5 模式规则<br>10.5.1 模式规则介绍<br>10.5.2 模式规则示例<br>10.5.3 自动化变量<br>10.5.4 模式的匹配<br>10.5.5 万用规则<br>10.5.6 重建内嵌隐含规则<br>10.6 缺省规则<br>10.7 后缀规则<br>10.8 隐含规则搜索算法<br>第十一章:使用make更新静态库文件<br>11.1 库成员作为目标<br>11.2 静态库的更新<br>11.2.1 更新静态库的符号索引表<br>11.3 make静态库的注意事项<br>11.4 静态库的后缀规则<br>第十章 : GNU make的特点<br>12.1 源自System v的特点<br>12.2 源自其他版本的特点<br>12.3 GNU make自身的特点<br>第十三章 和其它版本的兼容<br>第十四章 Makefile的约定<br>14.1 基本的约定<br>14.2 规则命令行的约定<br>14.3 代表命令变量<br>14.4 安装目录变量<br>14.5 Makefile的标准目标名<br>14.6 安装命令分类<br>第十五章 make的常见错误信息<br> <br>附录:关键字索引<br>1. GNU make可识别的指示 符<br>2. GNU make函数<br>3. GNU make的自动化变量<br>4. GNU make环境变量<br>后序<br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值