运行makefile文件通常情况时直接输入make指令,但有时候只是想重编译某些文件,而不是整个工程,或者有几套编译规则,在不同的时候使用不同的编译规则。接下来的内容是如何运行makefile。
10.1 make退出码
make 命令执行后有三个退出码:
0——表示成功执行。
1——如果 make 运行时出现任何错误,其返回 1。
2——如果你使用了 make 的“-q”选项,表示不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是0则说明要更新,如果是2则说明有错误发生。
10.2指定makefile
执行make时依次默认寻找“GNUmakefile”、“makefile”和“Makefile”这三个文件之一,一旦找到,就开始读取执行该文件。
当然可以指定特殊的文件名称,使用 make 的“-f”或是“--file”参数
假如makefile文件名称为“hchen.mk”,可以通过make –f hchen.mk命令。
10.3指定目标
make 的最终目标是 makefile 中的第一个目标,而其它目标一般是由这个目标连带出来的。当需要完成指定的目标时,只需要在后面跟名字就行,例如make clean。
有一个make的环境变量叫做“MAKECMDGOALS”这个变量中会存放你所指定的终极目标的列表,如果在命令行上,没有指定目标,那么,这个变量是空值。这个变量可以让你使用在一些比较特殊的情形下。比如下面的例子:
sources=foo.c bar.c
ifneq ($(MAKECMDGOALS),clean)
include $(sources:.c=.d)
endif
只要输入的命令不是“make clean”,那么 makefile 会自动包含“foo.d”和“bar.d”这两个 makefile。
例如之前的多目标实现使用伪目标来实现
.PHONY:all
all:prog1 prog2 prog3 prog4
这里可以指定目标单独生成四个目标中的任意一个,也可以用make all直接生成4个目标。(当all为第一个目标时直接make就行)。
这种性质可以根据指定的不同目标来完成不同的事。其 makefile 都包含了编译、安装、打包等功能。我们可以参照这种规则来书写我们的 makefile 中的目标。
“all”这个伪目标是所有目标的目标,其功能一般是编译所有的目标。
“clean”这个伪目标功能是删除所有被 make 创建的文件。
“install”这个伪目标功能是安装已编译好的程序,其实就是把目标执行文件拷贝到指定的目标中去。
“print”这个伪目标的功能是例出改变过的源文件。
“tar”这个伪目标功能是把源程序打包备份。也就是一个 tar 文件。
“dist”这个伪目标功能是创建一个压缩文件,一般是把 tar 文件压成 Z 文件。或是 gz 文件。
“TAGS”这个伪目标功能是更新所有的目标,以备完整地重编译使用。
“check” 和“test”这两个伪目标一般用来测试 makefile 的流程。
10.4检查执行规则
“-n” “--just-print” “--dry-run” “--recon”
作用:不执行参数,这些参数只是打印命令,不管目标是否更新,把规则和连带规则下的命令打印出来,但不执行,
这些参数对于调试 makefile 很有用处。
“-t” “--touch”
作用:这个参数的意思就是把目标文件的时间更新,但不更改目标文件。也就是说,make 假装编译目标,但不是
真正的编译目标,只是把目标变成已编译过的状态。
“-q” “--question”
作用:这个参数的行为是找目标的意思,也就是说,如果目标存在,那么其什么也不会输出,当然也不会执行编译,
如果目标不存在,其会打印出一条出错信息。
“-W <file>” “--what-if=<file>” “--new-file=<file>” “--assume-file=<file>”
作用:这个参数需要指定一个文件。一般是是源文件(或依赖文件),Make会根据规则推导来运行依赖于这个文件的命令,一般来说,可以和“-n”参数一同使用,来查看这个依赖文件所发生的规则命令。
10.5make的参数
make的参数解释都可以用 make --help来显示。可以查看到详细信息,有强迫症还是写一下。
-b,-m 这两个参数的作用是忽略和其它版本 make 的兼容性。
-B, --always-make 认为所有的目标都需要更新(重编译)。
-C目录, --directory=目录 指定读取 makefile 的目录,如果有多个“-C”参数,make 的解释是后面的路径以前面的作为相对路 径,并以最后的目录作为被指定目录。如:“make –C ~hchen/test –C prog”等价于
“make –C ~hchen/test/prog”。
—debug[=<options>] 输出 make 的调试信息。它有几种不同的级别可供选择,如果没有参数,那就是输出最简单的调 试信息。下面是<options>的取值:
a——也就是 all,输出所有的调试信息。(会非常的多)
b——也就是 basic,只输出简单的调试信息。即输出不需要重编译的目标。
v——也就是 verbose,在 b 选项的级别之上。输出的信息包括哪个 makefile 被解析,不需要被重 编译的依赖文件(或是依赖目标)等。
i——也就是 implicit,输出所以的隐含规则。
j——也就是 jobs,输出执行规则中命令的详细信息,如命令的 PID、返回码等。
m——也就是 makefile,输出 make 读取 makefile,更新 makefile,执行 makefile 的信息。
-d 相当于“--debug=a”。
-e,--environment-overrides
环境变量的值覆盖 makefile 中定义的变量的值
-f=<file>,--file=<file>,--makefile=<file>
指定需要执行的 makefile。
-h,--help 显示帮助信息。
-i,--ignore-errors 在执行时忽略所有的错误
-I <dir>,--include-dir=<dir>
在<dir>中搜索被包含的makefile
-j [N],--jobs[=N] N指同时运行命令的个数,无参数表明允许无限个任务
-k,--keep-going 出错也不停止运行。如果生成一个目标失败了,那么依赖于其上的目标就不会被执行了。
-l <N>,--load-average[=N],--max-load[=N]
指定 make 运行命令的负载,系统负载高于N时不启动多任务
-n,--just-print,--dry-run,--recon
仅输出执行过程中的命令序列,但并不执行
-o <file>,--old-file=<file>,--assume-old=<file>
不重新生成的指定的<file>,即使这个目标的依赖文件新于它
-p,--print-data-base 输出makefile中的所有数据,包括所有的规则和变量。这个参数会让一个简单的 makefile 都会输出 一堆信息。如果只是想输出信息而不想执行 makefile,可以使用“make -qp”;如果你想查看执行 makefile 前的预设变量和规则,你可以使用“make –p –f /dev/null”。这个参数输出的信息会包含着你 的 makefile 文件的文件名和行号,所以,用这个参数来调试你的 makefile 会是很有用的,特别是当 环境变量很复杂的时候。
-q,--question 不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新。如果是 0 则说明要更新,如果是 2 则说明有错误发生。
-r,--no-builtin-rules 禁止内置隐含规则
-R,--no-builtin-variabes 禁止内置变量设置
-s,--silent,--quie 在命令运行时不输出命令的输出
-S,--no-keep-going,--stop
取消“-k”选项的作用,因为有些时候,make 的选项是从环境变量“MAKEFLAGS”中继承下来的。所以 可以在命令行中使用这个参数来让环境变量中的“-k”选项失效。
-t,--touch 把目标的修改日期变成最新的,也就是阻止生成目标的命令运行
-v,--version 输出 make 程序的版本、版权等关于 make 的信息
-w,--print-directory 输出运行 makefile 之前和之后的信息。这个参数对于跟踪嵌套式调用 make 时很有用
--no-print-directory 禁止“-w”选项,即使默认开启
-W<file>,--what-if=<file>,--new-file=<file>,--assume-file=<file>
把<file>当成最新,假定目标<file>需要更新,如果和“-n”选项使用,那么这个参数会输出该目标更新时 的运行动作。如果没有“-n”那么就像运行 UNIX 的“touch”命令一样,使得<file>的修改时间为当前时间
--warn-undefined-variables
只要 make 发现有未定义的变量,那么就输出警告信息
本文详细介绍了make的运行方式,包括make的退出码、指定makefile、目标指定、检查执行规则以及各种参数的用法。通过示例说明了如何利用make的参数进行调试和控制编译流程,如`-n`仅打印命令而不执行,`-t`更新目标时间戳等。同时,讨论了常用的伪目标如`all`、`clean`、`install`等在makefile中的应用。
make的运行,检查执行规则,make的参数&spm=1001.2101.3001.5002&articleId=92764430&d=1&t=3&u=b0fe6ba28f5b4380bb6055157df41b11)
3546

被折叠的 条评论
为什么被折叠?



