Makefile学习笔记(10)make的运行,检查执行规则,make的参数

本文详细介绍了make的运行方式,包括make的退出码、指定makefile、目标指定、检查执行规则以及各种参数的用法。通过示例说明了如何利用make的参数进行调试和控制编译流程,如`-n`仅打印命令而不执行,`-t`更新目标时间戳等。同时,讨论了常用的伪目标如`all`、`clean`、`install`等在makefile中的应用。

运行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 发现有未定义的变量,那么就输出警告信息

                                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值