大型程序维护工具
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