我曾经认为makefile只是一种列出shell命令组的便捷方式;一段时间后,我了解到它们是多么强大、灵活和全面。本文将向您介绍其中一些与规则相关的功能。注意:这些都是针对GNUMakefile的,如果你想支持BSDMakefile,你会发现缺少一些新功能。感谢zge指出这一点。规则规则是关于make应该如何以及何时构建一个称为目标的文件的指令。目标可以依赖于称为先决条件的其他文件。您指示make如何在配方中构建目标,配方是一组shell命令,按照它们出现的顺序一次执行一个。语法如下:target_name:prerequisitesrecipe定义规则后,您可以通过从命令行执行以下命令来构建目标:$maketarget_name一旦构建了目标,make就会足够聪明,除非先决条件更改步骤。关于先决条件的更多信息先决条件表示两件事:何时应该构建目标:如果其中一个先决条件比目标更新,则make假定应该构建目标。执行顺序:由于先决条件可以由makefile中的另一组规则依次构建,因此它们也暗示了执行规则的顺序。如果你想定义一个顺序但你不想在前提改变时重建目标,你可以使用一个叫做“仅顺序”的特殊前提。这样的前提条件可以放在正常的前提条件之后,用竖线字符(|)分隔。样式为了方便起见,make接受目标和先决条件的样式。可以通过包含%符号来定义样式。该符号是一个通配符,可以匹配任意长度或空格的文字符号。以下是一些示例:%:匹配任何文件%.md:匹配所有以.md前缀结尾的文件%.go:匹配所有以前缀开头并以.go结尾的文件特殊目标有一个目标名称列表,可用于制作特殊含义称为特殊目标。您可以在本文档中找到完整的特殊目标集。根据经验,特殊对象以一个点开头,后跟一个大写字母。这里有一些有用的特殊目标:.PHONY:表示使这个目标的先决条件可以被视为伪目标。这意味着make将始终运行,无论是否存在具有该名称的文件或上次修改时间。.DEFAULT:用于任何未指定规则的目标。.IGNORE:如果指定.IGNORE作为先决条件,make会忽略执行步骤中的错误。当您需要以您指定的方式更改变量的值时,替换很有用。另一种格式是$(var:a=b),意思是取变量var的值,并用值中的b替换单词末尾的每个a,以替换最终的字符串。示例:foo:=a.obar:=$(foo:.o=.c)#将bar设置为a.c注意:特别感谢LuisLavena让我们知道存在替代方案。档案档案用于将多个数据文件(类似于压缩文件的概念)一起收集到一个文件中。它们是由arUnix工具构建的。ar可用于为任何目的创建存档,但除静态库外,它在很大程度上已被tar取代。在make中,您可以使用存档的单个成员作为目标或先决条件,如下所示:鼓励您查看文档,创建一个笨拙的makefile并探索它。
