维护、更新和重新生成程序组。
make [ -DVariable ] [ -d Option] ] [ -e ] [ -i ] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile ... ] [ Target ... ]
make 命令辅助您维护程序集。输入 make 命令的是一个文件相关性规范列表。
在 makefile 中有四种类型的行:文件相关性规范、shell 命令、变量赋值和注释。通常,各行可通过以一个 \ (反斜杠) 结束来继续到下一行。以下行的末尾换行符和开头空白处都压缩成一个空格。
相关性行由一个或多个目标、一个运算符和零或更多的先决条件(源)构成。这就建立了一种关系,其中目标取决于先决条件且通常创建自先决条件。在目标和先决条件之间的精确关系由分隔它们的运算符来确定。运算符如下所示:
文件相关性规范有两种类型的规则:推论和目标。推论规则指定目标如何才是最新的。这些规则有一个带有 .(句点)的最小值且没有 /(斜杠)的目标。目标规则指定如何构建目标。这些规则能够有多于一个的目标。
make 命令逐行执行 makdfile 中的命令。如同 make 执行每一条命令,它把命令写到标准输出中(除非另外指定的,例如使用 -s 标志)。makefile 在每一行之前必须有一个制表符。
当一条命令通过 make 命令执行时,它使用 make 的执行环境。它包含从命令行到 make 命令的任何宏和在 MAKEFLAGS 变量中指定的任何环境变量。make 命令的环境变量覆盖现有环境中的任何同名变量。
注释:注释以字符 # 开始,可以放在除了 shell 命令行中的任何位置,并且到行尾结束。
环境:如果 MAKEFLAGS 环境变量存在的话,make 命令将使用它。
目标规则具有以下格式:
target[target...] : [prerequisite...] [;command] <Tab>command
多个目标和先决条件用空格分隔。任何后面跟着 ;(分号)的文本和所有以制表符开始的随后各行都被认为是用来更新目标的命令。一个新行不以制表符或 # 字符开始时,开始一个新的目标。
特殊目标不能包含到其它目标中;即它们是指定的唯一目标。这些目标控制 make 命令的操作。这些目标是:
make 命令有一个缺省的推论规则集,能够用 makefile 中的附加推论规则定义来补充或改写它。缺省规则存储在外部文件 /usr/ccs/lib/aix.mk 中。可以通过在命令行中将 MAKERULES 变量设置为自己的文件名来替换自己的规则文件。下一行显示如何从命令行中更改规则文件:
make MAKERULES=/pathname/filename
推论规则由目标后缀和命令构成。通过后缀,make 命令确定先决条件,通过后缀和它们的先决条件,make 命令确定如何使目标最新。推论规则具有以下格式:
rule: <Tab>command ...
其中 rule 具有以下形式之一:
.s1 | 单后缀推论规则描述如何构建附加单后缀的目标。 |
.s1.s2 | 双后缀推论规则描述如何构建附加带有先决条件的 .s2 的目标,这个先决条件附加带有 .s1。 |
.s1 和 .s2 后缀定义为特殊目标 .SUFFIXES 的先决条件。推论规则显示在 makefile 中时,后缀 .s1 和 .s2 必须是已知的后缀。推论规则按其在 .SUFFIXES 中指定的顺序使用后缀。当新行不以 <Tab> 或 # 字符开始时,开始新的推论规则。
如果 rule 为空,例如:
rule: ;
执行不起作用且 make 命令识别出后缀已存在,但当目标过期时无任何操作。
在前面规则中的 ~ (代字号) 指的是 SCCS 文件。因此,规则 .c~.o 将 SCCS C 语言先决条件文件转换成对象文件(.o)。因为 SCCS 文件的 s. 是一个前缀,所以它和 make 命令的后缀视图不兼容。~ (代字号) 是一个把任何文件引用都更改成 SCCS 文件引用的方法。
目标或先决条件也能够成为归档库的成员,即使名称中有圆括号也可以这样处理。例如,library(name) 表示 name 是归档库 library 的一位成员。要通过特殊的文件更新库的成员,可以使用格式 .s1.a,其中带有 .s1 后缀的文件用来更新归档库的成员。.a 指的是归档库。
在 makefile 中,宏定义按以下格式定义:
variable=value
宏能够通过 makefile 显示,如下:
如果宏没有定义,那么它缺省为 NULL。新的宏定义会覆盖现有的的同名宏定义。宏可以按下面列出的顺序来赋值:
SHELL 宏比较特殊。它是由 make 命令设置到 shell 命令解释器(/usr/bin/sh)的路径名上。然而,如果在 makefile 中或命令行上重新定义 SHELL 宏,那么将覆盖它的缺省设置。
每个目标都可以具有与其关联的一系列 shell 命令,这些命令通常用来创建目标。此脚本中的每一条命令都必须以制表符开始。虽然任何目标都能够显示在相关性行上,但除非使用 :: 操作符,否则这些相关性中只有一个能够通过创建脚本来跟随。
如果命令行的第一个或前两个字符是 @ (at 符号)、-(连字符)和 +(加号)这几个符号之一或全部,那么将特别处理该命令,如下:
@ | 使命令在被执行前不被回显。 |
- | 使任何命令行的任何非零退出状态都被忽略。 |
+ | 使命令行可以通过指定 -n、-q 或 -t 选项来执行。 |
没有元字符的命令通过 make 命令直接执行。例如,make 命令将下例中的第一条命令委托给 shell,因为它包含 >(大于号)shell 元字符。因为下例中的第二条命令不包含任何 shell 元字符,所以 make 命令直接执行它:
target: dependency cat dependency > target chmod a+x target
忽略 shell 程序可以节约时间,但是会导致某些问题。例如,如果命令行不包含至少一个 shell 元字符,那么要试图在 makefile 中通过设置 SHELL 宏到 /bin/csh 来执行 C shell 脚本的做法将不会成功。
SHELL=/bin/csh target: dependency my_csh_script
该 makefile 失败,这是因为 make 命令试图运行 my_csh_script,而不是把它委托到 C shell 中。
make 命令中的变量和 shell 中的变量非常相似,全部由大写字母组成。= 运算符将值分配给变量。任何以前的变量都会被覆盖。
赋值前的任何空格都会被删除;如果值是附加的,那么要在以前的变量内容和附加的值之间加一个空格。
变量通过用 { } (花括号) 或 ( )(圆括号)括起变量名并在前面加一个 $(美元符号)来进行扩展。如果变量名只包含一个字母,那么就不需要用花括号或圆括号把它括起来。不建议使用这种简短格式。
变量替换出现在两种不同的时刻,取决于它被使用的场合。相关性行中的变量在此行被读取时被扩展。shell 命令中的变量在 shell 被执行时被扩展。
变量的四种类型(按优先顺序从小到大排列):
当指定 -q 标志时,这条命令返回以下退出值:
0 | 成功完成。 |
1 | 目标过期。 |
>1 | 发生错误。 |
否则,这条命令返回以下退出值:
0 | 成功完成。 |
>1 | 发生错误。 |
make
pgm: a.o b.o c89 a.o b.o -o pgm a.o: incl.h a.c c89 -c a.c b.o: incl.h b.c b.o: incl.h b.c c89 -c b.c
.c.o: c89 -c -o $*.c 或: .c.o: c89 -c -o $<
makefile | 包含相关性列表。 |
Makefile | 包含相关性列表。 |
s.makefile | 包含相关性列表。这是一个 SCCS 文件。 |
s.Makefile | 包含相关性列表。这是一个 SCCS 文件。 |
/usr/ccs/lib/posix.mk | 包含用于 make 命令的缺省的 POSIX 规则。 |
/usr/ccs/lib/aix.mk | 包含用于 make 命令的缺省的规则。 |
sh 命令。
AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的make Command Overview。
《AIX 5L V5.2 系统用户指南:操作系统与设备》中的『命令概述』。