make

大型程序维护工具


语法格式

make [-BdeikLnpqrRsStvw] [-C dir] [-f mkfile] [-I dir] [-j [jobs]]
[-o file] [-W file] [gnu-opts] [targets]
make [--version]

命令简介

make是一个开发工具,在大型程序的开发过程中,用于自动确定其中的哪一组程序模块需要重新编译,根据makefile文件中的规则与依赖关系,运行适当的命令,重新编译过时的程序模块,确保每个程序模块编译的一致性。make是一个通用的程序维护工具,不仅适用于C程序,也可用于其他任何编程语言,只要其编译器能够作为Shell命令运行即可。事实上,make并不限于程序的维护,也可以使用make实现基于文件修改时间和相互依赖关系需要自动更新的任何任务。

在准备运行make命令之前,首先需要编写一个makefile(或Makefile)文件,描述程序中各个模块文件的相互依赖关系,说明更新每个模块文件需要运行的命令。在一个程序中,可执行文件通常依赖于目标文件,随着目标文件的更新而重新连接,目标文件又依赖于源代码文件,随着源代码文件的更新而重新编译。

一旦存在适当的makefile文件,每当修改任何源代码文件时,只需简单地运行make命令,即可执行任何必要的编译、重新编译或连接等处理步骤。make命令使用makefile中定义的规则、更新模块文件需要运行的命令、模块文件之间的相互依赖关系,以及文件的最近修改时间,决定哪一个文件需要更新,对于需要更新的模块文件,运行相关的命令。

make执行makefile文件中的命令,更新一个或多个对象,所谓的对象通常是一个程序。如果未指定“-f”选项,make将会依次检索GNUmakefile、makefile和Makefile文件。通常建议使用Makefile文件,最好不要使用GNUmakefile文件。如果使用“-”作为makefile文件,make将会从标准输入中读取makefile文件。

在对象程序稳定之后,如果其依赖的模块文件又发生了变动,或对象程序不存在,make将会更新或重建对象程序。

命令选项

-B, --always-make  不管是否必要,总是无条件地处理所有的对象文件。

-C dir, --directory=dir  在读取makefile或执行其他任何动作之前,首先把工作目录改换到指定的目录dir。如果同时指定了多个“-C”选项,每个“-C”选项都需要基于前一个“-C”选项而解释。例如,“-C / -C etc”选项的最终解释结果等价于“-C /etc”选项。这个选项典型地用于递归调用make命令的场合。

-d  除了常规处理之外,还输出调试信息,说明哪些文件需要更新,哪些文件的时间需要比较,结果如何,实际上哪些文件需要编译、重新编译或连接,其规则如何,需要运行哪些命令。总之,输出用户感兴趣的make命令内部如何决断与处理的所有信息。

--debug[=flags]  除了常规处理之外,还输出调试信息。如果省略了flags,表示输出基本的调试信息。参数flags用于指定调试信息的级别。其中a表示输出所有的调试信息,其效果等同于“-d”选项。b表示输出基本的调试信息,包括过时的对象文件,编译是否成功等。v表示输出更详细的调试信息。i表示输出隐含的规则。j表示输出命令调用的细节。m表示输出重新编译时的调试信息。

-e, --environment-overrides  在处理过程中,运行环境中的变量优先于makefile文件中的变量。

-f mkfile, --file=mkfile, --makefile=mkfile  使用指定的mkfile作为makefile。

-i, --ignore-errors  重新编译时忽略命令执行过程中产生的所有错误。

-I dir, --include-dir=dir  从指定的目录dir检索其中包括的makefile文件。如果同时指定了多个“-I”选项,从而指定了多个目录,则按指定的顺序依次检索目录。

-j [jobs], --jobs[=jobs]  指定可以同时运行的作业(命令)数量。如果同时指定了多个“-j”选项,仅最后一个有效。如果指定了“-j”选项,但未给定参数jobs,make不限制能够同时运行的作业数量。

-k, --keep-going  即使出现错误,也尽可能地继续进行处理。

-L, --check-symlink-times  除了考察符号链接文件引用的文件的修改时间,还要考察符号链接文件本身的修改时间。指定这个选项时,取两者中最近的一个修改时间作为对象文件的修改时间。

-n, --just-print, --dry-run, --recon  显示将会执行的命令,但实际上并不执行。

-o file, --old-file=file, --assume-old=file  与其依赖的模块文件相比,即使指定文件file的修改时间还要早,也不重新编译该文件。同样,即使指定的文件已经修改,也不执行任何更新。

-p, --print-data-base  输出makefile文件中定义的规则、变量设置及版本信息(如同指定了“-v”选项),然后正常执行make命令,除非另有指定。若想输出上述信息但不更新任何文件,可以运行“make -pq”命令。若想仅仅输出预定义的规则与变量设置,可以运行“make -p -f /dev/null”命令。这个选项可以用作一个调试工具。

-q, --question  安静模式。不运行任何命令,也不输出任何信息,仅仅返回一个结束状态。如果指定对象的时间已是最新的,返回0,否则返回非0。

-r, --no-builtin-rules  禁止使用内置的隐含规则。同时也清除默认的后缀规则。

-R, --no-builtin-variables  禁止定义任何内置变量。

-s, --silent, --quiet  安静处理模式。禁止执行显示相应的命令。

-S, --no-keep-going, --stop  取消“-k”选项的作用。除非在递归调用make命令时,底层make会通过MAKEFLAGS变量继承上层make使用的“-k”选项,通常不需要指定这个选项。

-v, --version  显示make命令的版本、版权及作者等信息。

-w, --print-directory  在做其他处理动作之前和之后,输出工作目录等信息。在递归调用make命令的复杂情况下,若想跟踪编译错误,这个选项是非常有用的。

--no-print-directory  撤销“-w”选项,包括隐含启用的“-w”选项。

--warn-undefined-variables  当引用的变量未定义时,给出警告信息。

应用实例

1. 使用当前目录中的makefile文件,编译、重新编译或连接其中定义的程序。

$ make

2. 使用指定的文件testtmkfile作为makefile文件,编译、连接或重新编译其中定义的程序。

$ make –f testmkfile

索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z