「Linux下,make命令行选项详解」

  CREATED BY JENKINSBOT

命令行语法格式(SYNOPSIS)

make [OPTION]… [TARGET]…

命令简述(DESCRIPTION)

make自动确定大程序的哪些部分需要重新编译,并发出命令以重新编译它们。
make的示例中使用的是C语言,但是make可以在任何语言下使用,只要这些语言的编译器可以使用shell命令运行。
实际上,make可以使用在任何任务中。

在使用make之前,要先有一个makefile,makefile文件描述了程序各个文件之间的关系和处理各个文件的命令。
make默认在在当前目录中寻找makefile文件,实际上是在当前目录中依次查找makefiles,GNUmakefile, makefile, Makefile。通常建议使用的名字是Makefile,因为这样靠近目录列表开头,会和README这样的重要文件靠的近,显得规整一些。不建议使用GNUmakefile,因为其他版本的make(make 有很多实现,比如NetBSD make。)都不认识。
如果使用了 -f(-f file, –file=file, –makefile=FILE) 选项,make 将使用 -f 指定的文件。如果 -f 的参数是 `-‘,表示从标准输入中读取 makefile。

当makefile存在之后,就可以执行make命令。
make在构建的时候,除了使用makefile之外,还要使用到文件的最后修改时间来决定是否要更新文件。
如果目标文件依赖的文件发生了修改或者目标文件不存在,make就会更新目标文件。
然后,make命令对要更新的文件使用makefile中记录的命令。

命令支持的选项及含义(OPTIONS)

-b, -m
为了兼容其他版本的make,这些命令已经被忽略。

-B, –always-make
无条件的构建所有的目标(targets)。

-C dir, –directory=dir
读取makefile或者做其他事情之前,先进入指定的文件夹。
如果指定了多个 -C 选项,则相对于前一个依次解释执行。如 `-C / -C etc’ == `-C /etc’。
用于 make 的递归调用。

-d
除了正常调用外,打印 debug 信息。
debug 信息显示将要重建的文件、将要被比较的文件时间和比较结果、需要被重建的文件、哪条隐含的规则被考虑和哪条被采用。
关于 make 决定怎么去做的一切内容。

–debug[=FLAGS]
除了正常调用外,打印 debug 信息。
如果 FLAGS 未指定,是使用 -d 选项是相同的。
a:显示所有的 debug 信息;
b:显示基本的 debug 信息;
v:更多详细的基本 debug 信息;
i:显示隐含的规则;
j:调用命令的详细信息;
m:重建 makefile 时的 debug 信息;
n:禁用所有的 debug flag;

-e, –environment-overrides
使从环境中取得的变量优先级高于makefile中的变量。

-f file, –file=file, –makefile=FILE
手动指定makefile。

-i, –ignore-errors
忽略被执行命令的所有错误信息;

-I dir, –include-dir=dir
指定搜索 makefile 的文件夹。
如果指定了多个 -I 选项,将按照顺序搜索这些文件夹。
-Idir 与 -I dir 都是合法的。

-j [jobs], –jobs[=jobs]
指定同时运行的命令数;
如果提供了多个 -j 选项,只有最后一个有效。
如果 -j 没有参数,make 将不限制同时运行的任务(job)数。
网友推荐的参数是“一般是以CPU的核心数目的两倍”。

-k, –keep-going
出现错误之后尽量继续执行。当构建target失败的时候,那些依赖于target的也无法构建,这些目标的其他依赖关系可以被完全处理。

-l [load], –load-average[=load]
如果有其他的任务正在进行并且负载已经达到load指定的值(一个浮点数),则不再创建新任务。
如果没有参数则移出之前指定的一个load值。

-L, –check-symlink-times
使用符号链接和目标之间最新的mtime。

-n, –just-print, –dry-run, –recon
打印出将要执行的命令,但不是真正的执行。

-o file, –old-file=file, –assume-old=file
指定文件“filename”不需要重建,即使相对于它的依赖已经过时,同时也不重建依赖于此文件的任何目标文件。

-O[type], –output-sync[=type]
当使用 -j 运行多任务的时候,确保每个任务的输出是在一起的而不是很其他的任务的输出是散开的。
如果没有指定 type 或者是 target,整个对于target的方法的输出将放在一起;
如果 type 为 line,来自方法的每一命令的输出将放在一起;
如果 type 为 recurse,整个递归make产生的输出将放在一起;
如果 type 为 none,禁用同步输出;

-p, –print-data-base
打印因为读取makefile而产生的数据库(规则和变量值);然后照常或另行指定地执行。同时,输出内容中包含了-v选项输出的版本信息。
如果执行该命令的时候不想重建任何文件,可以使用make -p -f/dev/null,该命令可以用于查看make内建的规则。

-q, –question
“Question mode”。
不执行任何命令,不打印任何信息。如果指定的 target 已经是最新的,只返回一个为零的状态码,否则返回非0。

-r, –no-builtin-rules
忽略隐规则,使之不起作用。还清除后缀规则的后缀的默认列表。

-R, –no-builtin-variables
不要定义任何内置变量。

-s, –silent, –quiet
执行命令的时候,不打印正在执行的命令;

-S, –no-keep-going, –stop
取消 -k 选项的影响。这个选项没什么必要,除非在make的递归调用中,-k 是从顶级的 MAKEFLAGS 中继承的或者环境中设置的MAKEFLAGS。

-t, –touch
直接改变文件的最后修改时间,而不是通过运行他们的构建命令。通常用于跳过之后的某些 make 调用。

–trace
打印关于每个 target 的处理信息(为什么 target 正在重建并且重建时运行了什么命令)。

-v, –version
打印 make 的相关信息;

-w, –print-directory
在执行其他处理前或者之后打印出工作目录;有助于从复杂的递的make调用中确定出错的位置。

–no-print-directory
关闭 -w,即使 -w 被隐含的打开。

-W file, –what-if=file, –new-file=file, –assume-new=file
假设目标文件已经被修改了。
如果使用了 -n,则显示如果你修改了文件之后,将要发生的事情。
如果没有使用 -n,如同对给定的文件在运行make之前运行的 touch 命令,除非修改时间这是在make的想象中。

–warn-undefined-variables
引用未定义的变量时发出警告。

退出状态码(EXIT STATUS)

makefile成功解析并且没有target构建失败,返回0;
如果使用 -q 并且 make 决定一个 target 需要重建,则返回1;
发生错误,返回2;

存在的问题(BUGS)

BUG这个东西还是要留意以下的。详细内容查看make手册中 “Problems and Bugs” 章节:https://www.gnu.org/software/make/manual/make.html#Bugs