GNU Make 使用手册(中译版)(二)
时间:2005-08-20 来源:thestones
这里是4-7章
4 编写规则
4.1规则的语法
4.2在文件名中使用通配符
4.2.1通配符例子
4.2.2使用通配符的常见错误
4.2.3函数wildcard
4.3在目录中搜寻依赖
4.3.1VPATH:所有依赖的搜寻路径
4.3.2vpath指令
4.3.3目录搜寻过程
4.3.4编写搜寻目录的shell命令
4.3.5目录搜寻和隐含规则
4.3.6连接库的搜寻目录
4.4假想目标
4.5没有命令或依赖的规则
4.6使用空目录文件记录事件
4.7内建的特殊目标名
4.8具有多个目标的规则
4.9具有多条规则的目标
4.10静态格式规则
4.10.1静态格式规则的语法
4.10.2静态格式规则和隐含规则
4.11双冒号规则
4.12自动生成依赖
5 在规则中使用命令
5.1命令回显
5.2执行命令
5.3并行执行
5.4命令错误
5.5中断或关闭make
5.6递归调用make
5.6.1变量MAKE的工作方式
5.6.2与子make通讯的变量
5.6.3与子make通讯的选项
5.6.4`--print-directory'选项
5.7定义固定次序命令
5.8使用空命令
6 使用变量
6.1变量引用基础
6.2变量的两个特色
6.3变量高级引用技术
6.3.1替换引用
6.3.2嵌套变量引用
6.4变量取值
6.5设置变量
6.6为变量值追加文本
6.7override指令
6.8定义多行变量
6.9环境变量
6.10特定目标变量的值
6.11特定格式变量的值
7 Makefile文件的条件语句
7.1条件语句的例子
7.2条件语句的语法
7.3测试标志的条件语句
4编写规则
makefile文件中的规则是用来说明何时以及怎样重建特定文件的,这些特定的文件称为该规则的目标(通常情况下,每个规则只有一个目标)。在规则中列举的其它文件称为目标的依赖,同时规则还给出了目标创建、更新的命令。一般情况下规则的次序无关紧要,但决定缺省最终目标时却是例外。缺省最终目标是您没有另外指定最终目标时,make认定的最终目标。缺省最终目标是makefile文件中的第一条规则的目标。如果第一条规则有多个目标,只有第一个目标被认为是缺省最终目标。有两种例外的情况:以句点(‘.’)开始的目标不是缺省最终目标(如果该目标包含一个或多个斜杠‘/’,则该目标也可能是缺省最终目标);另一种情况是格式规则定义的目标不是缺省最终目标(参阅定义与重新定义格式规则)。
所以,我们编写makefile文件时,通常将第一个规则的目标定为编译全部程序或是由makefile文件表述的所有程序(经常设定一个称为‘all’的目标)。参阅指定最终目标的参数。
4.1规则的语法
通常一条规则形式如下:
targets : prerequisites
command
...
或:
targets : prerequisites ; command
command
...
目标(target)是文件的名称,中间由空格隔开。通配符可以在文件名中使用(参阅在文件名中使用通配符),‘a(m)’形式的文件名表示成员m在文件a中(参阅档案成员目标)。一般情况下,一条规则只有一个目标,但偶尔由于其它原因一条规则有多个目标(参阅具有多个目标的规则)。
命令行以Tab字符开始,第一个命令可以和依赖在一行,命令和依赖之间用分号隔开,也可以在依赖下一行,以Tab字符为行的开始。这两种方法的效果一样,参阅在规则中使用命令。
因为美元符号已经用为变量引用的开始符,如果您真希望在规则中使用美元符号,您必须连写两次,‘$$’(参阅使用变量)。您可以把一长行在中间插入‘’使其分为两行,也就是说,一行的尾部是’’的话,表示下一行是本行的继续行。但这并不是必须的,make没有对makefile文件中行的长度进行限制。一条规则可以告诉make两件事情:何时目标已经过时,以及怎样在必要时更新它们。
判断目标过时的准则和依赖关系密切,依赖也由文件名构成,文件名之间由空格隔开,通配符和档案成员也允许在依赖中出现。一个目标如果不存在或它比其中一个依赖的修改时间早,则该目标已经过时。该思想来源于目标是根据依赖的信息计算得来的,因此一旦任何一个依赖发生变化,目标文件也就不再有效。目标的更新方式由命令决定。命令由shell解释执行,但也有一些另外的特点。参阅在规则中使用命令。
4.2 在文件名中使用通配符
一个简单的文件名可以通过使用通配符代表许多文件。Make中的通配符和Bourne shell中的通配符一样是‘*’、‘?’和‘[…]’。例如:‘*.C’指在当前目录中所有以‘.C’结尾的文件。
字符‘~’在文件名的前面也有特殊的含义。如果字符‘~’单独或后面跟一个斜杠‘/’,则代表您的home目录。如‘~/bin’扩展为‘/home/bin’。如果字符‘~’后面跟一个字,它扩展为home目录下以该字为名字的目录,如‘~John/bin’表示‘home/John/bin’。在一些操作系统(如ms-dos,ms-windows)中不存在home目录,可以通过设置环境变量home来模拟。
在目标、依赖和命令中的通配符自动扩展。在其它上下文中,通配符只有在您明确表明调用通配符函数时才扩展。
通配符另一个特点是如果通配符前面是反斜杠‘’,则该通配符失去通配能力。如‘foo*bar’表示一个特定的文件其名字由‘foo’、‘*’和‘bar’构成。
4.2.1通配符例子
通配符可以用在规则的命令中,此时通配符由shell扩展。例如,下面的规则删除所有OBJ文件: