没有合适的资源?快使用搜索试试~ 我知道了~
Make使用手册,中文,很全面!
需积分: 17 1 下载量 161 浏览量
2009-05-20
12:35:22
上传
评论
收藏 638KB DOC 举报
温馨提示
试读
64页
Make的使用手册,中文的,非常全面,值得学习或者参考,兄弟们可以参考一下!
资源详情
资源评论
资源推荐
1 Make 概述
可自动决定一个大程序中哪些文件需要重新编译,并发布重新编译它们的命令。本版
本 使用手册由 编著,是从
撰写的 版本发展过来的。
符合 IEEE Standard 1003.2-1992 !"! 章节的规定。
因为 # 语言程序更具有代表性,所以我们的例子基于 # 语言程序,但 并不是仅仅能
够处理 # 语言程序,它可以处理那些编译器能够在 命令下运行的的各种语言的程序。
事实上, 不仅仅限于程序,它可以适用于任何如果一些文件变化导致另外一些
文件必须更新的任务。
如果要使用 ,必须先写一个称为 $ 的文件,该文件描述程序中各个文件之间的
相互关系,并且提供每一个文件的更新命令。在一个程序中,可执行程序文件的更新依靠
%& 文件,而 %& 文件是由源文件编译得来的。
一旦合适的 $ 文件存在,每次更改一些源文件,在 ' 命令下简单的键入:
就能执行所有的必要的重新编译任务。 程序根据 $ 文件中的数据和每个文件更
改的时间戳决定哪些文件需要更新。对于这些需要更新的文件, 基于 $ 文件发
布命令进行更新,进行更新的方式由提供的命令行参数控制。具体操作请看
运行
Make 章
节。
1.1 怎样阅读本手册
如果您现在对 一无所知或者您仅需要了解对 的普通性介绍,请查阅前几章内容,
略过后面的章节。前几章节是普通介绍性内容,后面的章节是具体的专业、技术内容。
如果您对其它 程序十分熟悉,请参阅 GNU Make
的特点
和
不兼容性和失去的特点
部
分,GNU Make
的特点
这一章列出了 对 程序的扩展,
不兼容和失去的特
点
一章解释了其它 程序有的特征而 缺乏的原因。
对于快速浏览者,请参阅
选项概要、快速参考
和
内建的特殊目标名
部分。
1.2 问题和 BUG
如果您有关于 的问题或者您认为您发现了一个 %,请向开发者报告;我们不
能许诺我们能干什么,但我们会尽力修正它。在报告 % 之前,请确定您是否真正发现
了 %,仔细研究文档后确认它是否真的按您的指令运行。如果文档不能清楚的告诉您怎
么做,也要报告它,这是文档的一个 %。
在您报告或者自己亲自修正 % 之前,请把它分离出来,即在使问题暴露的前提下尽可能
的缩小 $ 文件。然后把这个 $ 文件和 给出的精确结果发给我们。同时
请说明您希望得到什么,这可以帮助我们确定问题是否出在文档上。
一旦您找到一个精确的问题,请给我们发 (),我们的 () 地址是:
*+),++
在邮件中请包含您使用的 的版本号。您可以利用命令‘))-'’得到版本号。
同时希望您提供您的机器型号和操作系统类型,如有可能的话,希望同时提供 $+ 文
件(该文件有配置过程产生)。
2 Makefile 文件介绍
程序需要一个所谓的 $ 文件来告诉它干什么。在大多数情况下,$ 文件
告诉 怎样编译和连接成一个程序。
本章我们将讨论一个简单的 $ 文件,该文件描述怎样将 . 个 # 源程序文件和 个头
文件编译和连接成为一个文本编辑器。$ 文件可以同时告诉 怎样运行所需要的
杂乱无章的命令(例如,清除操作时删除特定的文件)。如果要看更详细、复杂的
$ 文件例子,请参阅
复杂的
Makefile
文件例子
一章。
当 重新编译这个编辑器时,所有改动的 # 语言源文件必须重新编译。如果一个头文
件改变,每一个包含该头文件的 # 语言源文件必须重新编译,这样才能保证生成的编辑器
是所有源文件更新后的编辑器。每一个 # 语言源文件编译后产生一个对应的 %& 文件,如
果一个源文件重新编译,所有的 %& 文件无论是刚刚编译得到的或原来编译得到的必须从
新连接,形成一个新的可执行文件。
2.1 规则的格式
一个简单的 $ 文件包含一系列的“规则”,其样式如下:
目标+"…/依赖01'"…
2*3命令"
4444444…
4444444…
目标+"通常是要产生的文件的名称,目标的例子是可执行文件或 %& 文件。目标也可
是一个执行的动作名称,诸如‘’(详细内容请参阅
假想目标
一节)。
依赖是用来输入从而产生目标的文件,一个目标经常有几个依赖。
命令是 执行的动作,一个规则可以含有几个命令,每个命令占一行。注意:每个命
令行前面必须是一个 Tab 字符,即命令行第一个字符是 Tab。这是不小心容易出错的地方。
通常,如果一个依赖发生变化,则需要规则调用命令对相应依赖和服务进行处理从而更新
或创建目标。但是,指定命令更新目标的规则并不都需要依赖,例如,包含和目标‘’相
联系的删除命令的规则就没有依赖。
规则一般是用于解释怎样和何时重建特定文件的,这些特定文件是这个详尽规则的目标 。
需首先调用命令对依赖进行处理,进而才能创建或更新目标。当然,一个规则也可以
是用于解释怎样和何时执行一个动作,详见
编写规则
一章。
一个 $ 文件可以包含规则以外的其它文本,但一个简单的 $ 文件仅仅需要包
含规则。虽然真正的规则比这里展示的例子复杂,但格式却是完全一样。
2.2 一个简单的 Makefile 文件
一个简单的 $ 文件,该文件描述了一个称为文本编辑器()的可执行文件生成方
法,该文件依靠 . 个 %& 文件( 文件),它们又依靠 . 个 # 源程序文件和 个头文件。
在这个例子中,所有的 # 语言源文件都包含‘$'’头文件,但仅仅定义编辑命令的源文件
包含‘’头文件,仅仅改变编辑器缓冲区的低层文件包含‘*$$’头文件。
/*'056
444444''$''
4444444)*'056
444444444444444444''$''
/$'
4444444)
*/*$'
4444444)*
/$'
4444444)
'05/'05$'*$$
4444444)'05
'/'$'*$$
4444444)'
'/'$'*$$
4444444)'
$'/$'$'*$$
4444444)$'
'/'$'
4444444)'
/
4444444*'056
4444444444''$''
我们把每一个长行使用反斜杠)新行法分裂为两行或多行,实际上它们相当于一行,这样做
的意图仅仅是为了阅读方便。
使用 $ 文件创建可执行的称为‘’的文件,键入:
使用 $ 文件从目录中删除可执行文件和目标,键入:
在这个 $ 文件例子中,目标包括可执行文件‘’和 %& 文件‘’及‘*’。依赖
是 # 语言源文件和 # 语言头文件如‘’和‘$’等。事实上,每一个 %& 文件即是目标
也是依赖。所以命令行包括‘)’和‘)*’。
当目标是一个文件时,如果它的任一个依赖发生变化,目标必须重新编译和连接。任何命
令行的第一个字符必须是‘7*’字符,这样可以把 $ 文件中的命令行与其它行分别开
来。(一定要牢记:Make 并不知道命令是如何工作的,它仅仅能向您提供保证目标的合
适更新的命令。Make 的全部工作是当目标需要更新时,按照您制定的具体规则执行命
令。)
目标‘’不是一个文件,仅仅是一个动作的名称。正常情况下,在规则中‘ ’这个动
作并不执行,目标‘’也不需要任何依赖。一般情况下,除非特意告诉 执行‘’
命令,否则‘’命令永远不会执行。注意这样的规则不需要任何依赖,它们存在的目的
仅仅是执行一些特殊的命令。象这些不需要依赖仅仅表达动作的目标称为假想目标。详细
内容参见
假想目标
;参阅
命令错误
可以了解 或其它命令是怎样导致 忽略错误的。
2.3 make 处理 makefile 文件的过程
缺省情况下, 开始于第一个目标(假想目标的名称前带‘’)。这个目标称为缺省最终
目标(即 最终更新的目标,具体内容请看
指定最终目标的参数
一节)。
在上节的简单例子中,缺省最终目标是更新可执行文件‘’,所以我们将该规则设为第一
规则。这样,一旦您给出命令:
就会读当前目录下的 $ 文件,并开始处理第一条规则。在本例中,第一条规则
是连接生成‘’,但在 全部完成本规则工作之前,必须先处理‘’所依靠的 %& 文
件。这些 %& 文件按照各自的规则被处理更新,每个 %& 文件的更新规则是编译其源文件。
重新编译根据其依靠的源文件或头文件是否比现存的 %& 文件更‘新’,或者 %& 文件是否
存在来判断。
444其它规则的处理根据它们的目标是否和缺省最终目标的依赖相关联来判断。如果一些规
则和缺省最终目标无任何关联则这些规则不会被执行,除非告诉 强制执行(如输入
执行 命令)。
444在%& 文件重新编译之前, 首先检查它的依赖 # 语言源文件和 # 语言头文件是否
需要更新。如果这些 # 语言源文件和 # 语言头文件不是任何规则的目标, 将不会对
它们做任何事情。 也可以自动产生 # 语言源程序,这需要特定的规则,如可以根据
%' 或 8 产生 # 语言源程序。
444在 %& 文件重新编译(如果需要的话)之后, 决定是否重新连接生成 可执行文
件。如果 可执行文件不存在或任何一个 %& 文件比存在的 可执行文件‘新’,则
重新连接生成 可执行文件。
444这样,如果我们修改了‘'’文件,然后运行 , 将会编译‘'’文件更新
‘'’文件,然后重新连接生成 可执行文件。如果我们修改了‘’文件,然
后运行 , 将会重新编译‘*’和‘’文件,然后重新连接生成 可执
行文件。
2.4 使用变量简化 makefile 文件
在我们的例子中,我们在‘’的生成规则中把所有的 %& 文件列举了两次,这里再重复一
遍:
/*'056
444444''$''
4444444)*'056
444444444444444444''$''
这样的两次列举有出错的可能,例如在系统中加入一个新的 %& 文件,我们很有可能在一
个需要列举的地方加入了,而在另外一个地方却忘记了。我们使用变量可以简化 $
文件并且排除这种出错的可能。变量是定义一个字符串一次,而能在多处替代该字符串使
用(具体内容请阅读
使用变量
一节)。
在 $ 文件中使用名为 *9':%&(#7:*9':%&:*9:或%& 的变量代表所有 %&
文件已是约定成俗。在这个 $ 文件我们定义了名为 *9' 的变量,其定义格式如下:
*9';*'056
444444444''$''
然后,在每一个需要列举 %& 文件的地方,我们使用写为<=*9'">形式的变量代替(具
体内容请阅读
使用变量
一节)。下面是使用变量后的完整的 $ 文件:
*9';*'056
444444444''$''
/=*9'"
4444444)=*9'"
/$'
4444444)
*/*$'
4444444)*
/$'
4444444)
'05/'05$'*$$
4444444)'05
'/'$'*$$
4444444)'
'/'$'*$$
4444444)'
$'/$'$'*$$
4444444)$'
'/'$'
4444444)'
/
4444444=*9'"
2.5 让 make 推断命令
编译单独的 # 语言源程序并不需要写出命令,因为 可以把它推断出来: 有一个
使用‘##–’命令的把 # 语言源程序编译更新为相同文件名的 %& 文件的隐含规则。例如
可以自动使用‘))’命令把‘’编译‘’。因此,我们可以省
略 %& 文件的更新规则。详细内容请看
使用隐含规则
一节。
如果 # 语言源程序能够这样自动编译,则它同样能够自动加入到依赖中。所以我们可在依
赖中省略 # 语言源程序,进而可以省略命令。下面是使用隐含规则和变量 *9' 的完整
$ 文件的例子:
*9';*'056
444444444''$''
/=*9'"
4444444)=*9'"
/$'
*/$'
/$'
'05/$'*$$
'/$'*$$
'/$'*$$
$'/$'*$$
'/$'
?8/
/
4444444)=*9'"
这是我们实际编写 $ 文件的例子。(和目标‘’联系的复杂情况在别处阐述。具体
参见
假想目标
及
命令错误
两节内容。)因为隐含规则十分方便,所以它们非常重要,在
$ 文件中经常使用它们。
2.6 另一种风格的 makefile 文件
当时在 $ 文件中使用隐含规则创建 %& 文件时,采用另一种风格的 $ 文件也
是可行的。在这种风格的 $ 文件中,可以依据依赖分组代替依据目标分组。下面是
采用这种风格的 $ 文件:
*9';*'056
444444444''$''
/=*9'"
4444444)=*9'"
=*9'"/$'
*$'/
'05''$'/*$$
这里的 $' 是所有 %& 文件的共同的一个依赖; 和 *$$$ 是具体列出的
%& 文件的共同依赖。
虽然采用这种风格编写 $ 文件更具风味:$ 文件更加短小,但一部分人以为
把每一个目标的信息放到一起更清晰易懂而不喜欢这种风格。
2.7 在目录中删除文件的规则
剩余63页未读,继续阅读
zhufuligood
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0