程序员人生 网站导航

make命令

栏目:php教程时间:2016-06-07 15:20:43

make 命令

笔记。

用处

保护、更新和重新生成程序组。

语法

make [ -DVariable ] [ -d Option] ] [ -e ] [ -i ] [ -k ] [ -n ] [ -p ] [ -q ] [ -r ] [ -S ] [ -s ] [ -t ] [ -f MakeFile … ] [ Target … ]

描写

make 命令辅助您保护程序集。输入 make 命令的是1个文件相干性规范列表。

在 makefile 中有4种类型的行:文件相干性规范、shell 命令、变量赋值和注释。通常,各行可通过以1个 \ (反斜杠) 结束来继续到下1行。以下行的末尾换行符和开头空白处都紧缩成1个空格。

文件相干性规范

相干性行由1个或多个目标、1个运算符和零或更多的先决条件(源)构成。这就建立了1种关系,其中目标取决于先决条件且通常创建自先决条件。在目标和先决条件之间的精确关系由分隔它们的运算符来肯定。运算符以下所示:

如果目标的修改时间小于它的任何先决条件,那末将目标视为过期。在使用此运算符时,目标的先决条件是通过相干性行积累的。除非目标有 .PRECIOUS 属性,否则如果 make 命令中断,那末该目标将被删除。
:: 如果没有指定先决条件,那末始终重新创建目标。否则,如果目标的任何先决条件都比目标修改得更晚,那末将该目标认为过期。在使用此运算符时,目标的先决条件不通过相干性行积累。如果 make 命令中断,则不会删除目标。
文件相干性规范有两种类型的规则:推论和目标。推论规则指定目标如何才是最新的。这些规则有1个带有 .(句点)的最小值且没有 /(斜杠)的目标。目标规则指定如何构建目标。这些规则能够有多于1个的目标。

Makefile 履行

make 命令逐行履行 makdfile 中的命令。犹如 make 履行每条命令,它把命令写到标准输出中(除非另外指定的,例如使用 -s 标志)。makefile 在每行之前必须有1个制表符。

当1条命令通过 make 命令履行时,它使用 make 的履行环境。它包括从命令行到 make 命令的任何宏和在 MAKEFLAGS 变量中指定的任何环境变量。make 命令的环境变量覆盖现有环境中的任何同名变量。

注:
当 make 命令遇到以单词 include 开头,后面随着另外一个是 makefile 的名称的单词的行(例如 include depend)时,make 命令会试图打开那个文件,并且处理它的内容,就像那些内容原来就显示在 include 行处1样。这类行动只有在由 make 命令读取的第1个 makefile 的第1个非注释行不是 .POSIX 目标时产生;否则,将出现1个语法毛病。
注释:注释以字符 # 开始,可以放在除 shell 命令行中的任何位置,并且到行尾结束。

环境:如果 MAKEFLAGS 环境变量存在的话,make 命令将使用它。

目标规则

目标规则具有以下格式:

target[target…] : [prerequisite…] [;command]
command
多个目标和先决条件用空格分隔。任何后面随着 ;(分号)的文本和所有以制表符开始的随后各行都被认为是用来更新目标的命令。1个新行不以制表符或 # 字符开始时,开始1个新的目标。

注:
先决条件的列表可为空。

特殊目标

特殊目标不能包括到其它目标中;即它们是指定的唯1目标。这些目标控制 make 命令的操作。这些目标是:

.DEFAULT 这用作1些目标(只用作先决条件)的规则,这些目标是没法由 make 命令用其他任何方法创建的。仅使用 shell 脚本。继承 .DEFAULT 的命令的目标的 <(左尖括号)变量被设置成目标本身的名称。
.IGNORE 此目标的先决条件是目标本身;这会致使疏忽与它们本身关联的命令所产生的毛病。如果没有指定先决条件,则同等于指定 -i 标志。
.POSIX 致使 make 命令使用不同的缺省规则文件。文件 /usr/ccs/lib/posix.mk 提供 POSIX 标准中指定的缺省规则。
.PRECIOUS 此目标的先决条件是目标本身。.PRECIOUS 避免目标被删除。如果没有指定先决条件,那末 .PRECIOUS 属性将利用于文件中的每个目标。通常,当 make 被中断时(例如,使用 SIGHUP、SIGTERM、SIGINT 或 SIGQUIT),它将删除所有未完全构成的目标。如果 make 以带有 -n、-p 或 -q 标志来调用,则认为目标具有 .PRECIOUS 属性。
.SILENT 目标的先决条件是目标本身。这会致使履行与目标关联的命令之前不会将其写到标准输出中。如果没有指定先决条件,那末 .PRECIOUS 属性将利用于文件中的每条命令。
.SUFFIXES 使用此名称把更多的后缀添加到 make 辨认的文件后缀列表中。目标的先决条件被附加到已知后缀列表。如果没有指定后缀,那末任何之前指定的后缀会被删除。这些后缀由推论规则使用。要更改后缀的顺序,需要指定1个空的 .SUFFIXES 条目,然后指定1个新的 .SUFFIXES 条目列表。makefile 1定不能将命令与 .SUFFIXES 关联。

推论规则

make 命令有1个缺省的推论规则集,能够用 makefile 中的附加推论规则定义来补充或改写它。缺省规则存储在外部文件 /usr/ccs/lib/aix.mk 中。可以通过在命令行中将 MAKERULES 变量设置为自己的文件名来替换自己的规则文件。下1行显示如何从命令行中更改规则文件:

make MAKERULES=/pathname/filename
推论规则由目标后缀和命令构成。通过后缀,make 命令肯定先决条件,通过后缀和它们的先决条件,make 命令肯定如何使目标最新。推论规则具有以下格式:

rule:
command

其中 rule 具有以下情势之1:

.s1 单后缀推论规则描写如何构建附加单后缀的目标。
.s1.s2 双后缀推论规则描写如何构建附加带有先决条件的 .s2 的目标,这个先决条件附加带有 .s1。
.s1 和 .s2 后缀定义为特殊目标 .SUFFIXES 的先决条件。推论规则显示在 makefile 中时,后缀 .s1 和 .s2 必须是已知的后缀。推论规则按其在 .SUFFIXES 中指定的顺序使用后缀。当新行不以 或 # 字符开始时,开始新的推论规则。

如果 rule 为空,例如:

rule: ;
履行不起作用且 make 命令辨认出后缀已存在,但当目标过期时无任何操作。

在前面规则中的 ~ (代字号) 指的是 SCCS 文件。因此,规则 .c~.o 将 SCCS C 语言先决条件文件转换成对象文件(.o)。由于 SCCS 文件的 s. 是1个前缀,所以它和 make 命令的后缀视图不兼容。~ (代字号) 是1个把任何文件援用都更改成 SCCS 文件援用的方法。

目标或先决条件也能够成为归档库的成员,即便名称中有圆括号也能够这样处理。例如,library(name) 表示 name 是归档库 library 的1位成员。要通过特殊的文件更新库的成员,可使用格式 .s1.a,其中带有 .s1 后缀的文件用来更新归档库的成员。.a 指的是归档库。

使用宏

在 makefile 中,宏定义按以下格式定义:

variable=value
宏能够通过 makefile 显示,以下:

如果宏显示在目标行中,那末在读取目标行时给宏赋值。
如果宏显示在命令行中,那末在履行命令行时给宏赋值。
如果宏显示在宏定义行中,那末在新的宏显示于规则或命令中时给宏赋值。
如果宏没有定义,那末它缺省为 NULL。新的宏定义会覆盖现有的的同名宏定义。宏可以按下面列出的顺序来赋值:

缺省的推论规则
环境的内容
Makefile
命令行。
注:
-e 标志会使环境变量覆盖 makefile 中定义的变量。
SHELL 宏比较特殊。它是由 make 命令设置到 shell 命令解释器(/usr/bin/sh)的路径名上。但是,如果在 makefile 中或命令行上重新定义 SHELL 宏,那末将覆盖它的缺省设置。

注:
SHELL 宏既不影响 SHELL 环境变量,也不会被它影响。

shell 命令

每一个目标都可以具有与其关联的1系列 shell 命令,这些命令通经常使用来创建目标。此脚本中的每条命令都必须以制表符开始。虽然任何目标都能够显示在相干性行上,但除非使用 :: 操作符,否则这些相干性中只有1个能够通过创建脚本来跟随。

如果命令行的第1个或前两个字符是 @ (at 符号)、-(连字符)和 +(加号)这几个符号之1或全部,那末将特别处理该命令,以下:

@ 使命令在被履行前不被回显。
- 使任何命令行的任何非零退出状态都被疏忽。
+ 使命令行可以通过指定 -n、-q 或 -t 选项来履行。
没有元字符的命令通过 make 命令直接履行。例如,make 命令将下例中的第1条命令拜托给 shell,由于它包括 >(大于号)shell 元字符。由于下例中的第2条命令不包括任何 shell 元字符,所以 make 命令直接履行它:

target: dependency
cat dependency > target
chmod a+x target
疏忽 shell 程序可以节俭时间,但是会致使某些问题。例如,如果命令行不包括最少1个 shell 元字符,那末要试图在 makefile 中通过设置 SHELL 宏到 /bin/csh 来履行 C shell 脚本的做法将不会成功。

SHELL=/bin/csh

target: dependency
my_csh_script
该 makefile 失败,这是由于 make 命令试图运行 my_csh_script,而不是把它拜托到 C shell 中。

变量赋值

make 命令中的变量和 shell 中的变量非常类似,全部由大写字母组成。= 运算符将值分配给变量。任何之前的变量都会被覆盖。

赋值前的任何空格都会被删除;如果值是附加的,那末要在之前的变量内容和附加的值之间加1个空格。

变量通过用 { } (花括号) 或 ( )(圆括号)括起变量名并在前面加1个 $(美元符号)来进行扩大。如果变量名只包括1个字母,那末就不需要用花括号或圆括号把它括起来。不建议使用这类简短格式。

变量替换出现在两种不同的时刻,取决于它被使用的场合。相干性行中的变量在此行被读取时被扩大。shell 命令中的变量在 shell 被履行时被扩大。

变量的4种类型(按优先顺序从小到大排列):

环境 变量被定义为 make 命令的环境的1部份。
全局 变量在 makefile 中或在被包括的 makefile 中定义。
命令行 变量被定义为命令行的1部份。
局部 特定为某种目标定义的变量。局部变量以下:
<使.DEFAULT*
代表使没有后缀的目标过期(在推论规则下)的先决条件的文件名段。
@%
如果目标是归档库的成员,代表目标规则中的库成员。
还可以通过附加 D 或 F 来使用局部变量:

D
表明局部变量利用于名称的目录部份。这是后面不带有 /(斜杠)的路径名。对当前目录,D 是1个 .(句点)。
F
表明局部变量利用于名称的文件名部份。
另外,make 命令设置或理解以下变量:

(美元符号);即 $$ 扩大到单个美元符号。
LANG 当 LC_ALL 和相应的环境变量(以 LC_ 开始的)都没有指定语言环境时,肯定对语言环境种别所用的语言环境。
LC_ALL 肯定用于重设语言环境种别的值的语言环境,这些语言环境种别是由 LANG 或任何其它的 LC_ 环境变量的设置指定的。
LC_CTYPE 肯定对字符情势的文本数据的按字节顺序解释的语言环境。例如,参数中的单字节对多字节字符串。
LC_MESSAGES 肯定写消息所用的语言。
MAKEFLAGS 环境变量 MAKEFLAGS 包括在 make 命令行中指定的任何内容。任何在 make 命令行中指定的内容都被附加到 MAKEFLAGS 变量中,然后将变量输入到 make 履行的所有程序的环境中。注意 MAKEFLAGS 变量中的 -f 和 -p 标志的操作未定义。在这个变量中,命令行标志优先于 -f 和 -p 标志。
VPATH 允许指定搜索先决条件的目录列表。这个目录列表就像 SHELL 中的 PATH 变量那样工作。VPATH 变量可以用冒号隔开指定多个目录。例如:
VPATH=src:/usr/local/src
这表明 make 命令按以下顺序搜索给出的目录:

当前目录(乃至在没有 VPATH 时也会出现)
src(当前目录中的1个子目录)
/usr/local/src.
标志

-D 变量 设置变量值为 1。
-d 选项 显示关于 make 检查(调试方式)的文件和次数的详细信息。没有任何选项或带有 A 选项的 -d 标志显示所有可用的调试信息。以下为个别可选的调试选项:
A
显示所有可能的调试信息。
a
显示关于归档搜索和高速缓存的调试信息。
d
显示关于目录搜索的调试信息。
g1
显示在构造任何对象前的关于输入图的调试信息。
g2
显示构造每一个对象以后或出错退出之前关于输入图的调试信息。
m
显示关于构造目标的调试信息,包括修改日期。
s
显示关于后缀搜索的调试信息。
v
显示关于变量赋值的调试信息。
-e 指定环境变量覆盖 makefile 中的宏赋值。
-f Makefile 指定读取1个 makefile 来代替缺省的 makefile。如果 Makefile 是 -(连字符),则读取标准输入。可以指定多个 makefile 并按指定的顺序读取。
-i 疏忽 makefile 中的 shell 命令的非零退出。同等于在 makefile 中的每个命令行前指定 - (连字符)。
-k 遇到毛病后继续处理,但仅限于对不依赖于在创建时产生了毛病的目标的那些目标进行该操作。
-n 显示命令,但是其实不运行它们。但是,会履行以 +(加号)开始的行。
-p 在履行任何命令前显示所有宏定义集合和目标描写。
-q 如果对象文件没有过期,则返回1个零状态码;如果目标过期,则返回1个状态码。但是,会履行以 +(加号)为前缀的命令行。
-r 不使用缺省规则。
-S 如果产生毛病,则终止 make 命令。这是缺省值,与 -k 标志相反。
-s 履行命令时不在屏幕上显示它们。
-t 创建1个目标或更新它的修改时间,使它看起来没有过期。履行以 +(加号)开始的命令行。
Target 指定 Target 情势的目标名或设置变量值。
退出状态

当指定 -q 标志时,这条命令返回以下退出值:

0 成功完成。
1 目标过期。

1 产生毛病。
否则,这条命令返回以下退出值:

0 成功完成。

1 产生毛病。
示例

为了构建在 makefile 中找到的第1个目标,请输入:
make
显示但不运行,make 命令用来构成1个文件的命令:
make -n search.o
该履行将在使用1个新的描写文件时验证其是不是正确。
要建立1个 makefile,比如 pgm,取决于两个文件(a.o 和 b.o),这两个文件取决于它们相应的先决条件文件(a.c 和 b.c)和1个公共文件 incl.h,请输入:
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 文件,请输入:
.c.o:
c89 -c -o .c.c.o:c89co<
要查看内置规则的内容,请输入:
make -p -f /dev/null 2>/dev/null
文件

makefile 包括相干性列表。
Makefile 包括相干性列表。
s.makefile 包括相干性列表。这是1个 SCCS 文件。
s.Makefile 包括相干性列表。这是1个 SCCS 文件。
/usr/ccs/lib/posix.mk 包括用于 make 命令的缺省的 POSIX 规则。
/usr/ccs/lib/aix.mk 包括用于 make 命令的缺省的规则。

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐