GNU Make手册阅读笔记(8)-- 第九章

第九章  执行Make

1      指定 makefile 文件

    当需要将一个普通命名的文件作为 makefile 文件时,需要使用 make 的“ -f ”、“ --file ”或者“ --makefile ”选项来指定。

2      指定终极目标

部分标准的伪目标和空目标命名:

        all

作为 Makefile 的顶层目标,一般此目标作为默认的终极目标。

clean

这个伪目标定义了一组命令,这些命令的功能是删除所有由 make 创建的文件。

install

  make 成功创建的可执行文件拷贝到 shell 环境变量“ PATH ”指定的某个目录。

  print

  打印出所有被更改的源文件列表。

  tar

创建一个 tar 文件(归档文件包)。

dist

为源文件创建发布的压缩包,可以使各种压缩方式的发布包。

test

Makefile 最后生成的文件进行检查。

3      替代命令的执行

-n

--just-print

--dry-run

--recon

指定 make 执行空操作(不执行规则的命令),只打印出需要重建目标使用的命令(只打印过期的目标的重建命令),而不对目标进行重建。

-t

--touch

类似于 shell 下的“ touch ”命令的功能。更新所有目标文件的时间戳(对于过时的目标文件不进行内容更新,只更新时间戳)。

-q

--question

不执行任何命令并且不打印任何输出信息,只检查所指定的目标是否已经是最新的。如果是则返回 0 ,否则返回 1 。使用“ -q ”(“ --question ”)的目的只是让 make 返回给定(没有指定则时终极目标)的目标是否是最新的。可以根据它的返回值来判断是否须要真正的执行更新目标的动作。

-W FILE

--what-if= FILE

--assume-new= FILE

--new-file= FILE

这个参数需要指定一个文件名。通常是一个存在源文件。 make 将当前系统时间作为这个文件的时间戳(假设这个文件被修改过,但不真正的更改文件本身的时间戳)。因此这个文件的时间戳被认为最新的,在执行时依赖于这个文件的目标将会被重建。通过这种方式并结合“ -n ”参数,我们可以查看那些目标依赖于这个文件(修改这个文件以后执行 make 那些目标会被更新)。

总结:

参数“ -n ”、“ -t ”和“ -q ”不影响之前带“ + ”号和包含“ $(MAKE) ”的命令行的执行。就是说如果在规则的命令行中命令之前使用了“ + ”或者此命令行是 递归地 make调用 时,无论是否使用了这三个参数之一,这些命令都得到执行。

-W ”参数有两个特点:

1.        可以和“ -n ”或者“ -q ”参数配合使用来查看修改所带来的影响(导致那些目标会被重建)。

2.        在不指定“ -n ”和“ -q ”参数、只使用“ -W ”指定一个文件时,可以模拟这个文件被修改的状态。 make 就会重建依赖于此文件的所有目标。

另外“ -p ”和“ -v ”参数可以允许我们输出 Makefille 被执行的过程信息,相信这一点在很多场合,特别是调试 Makefile 时非常有用

4       防止特定文件重建

1.        执行编译,使用“ make –o HEADERFILE ”,“ HEADERFILE ”为需要忽略更改的头文件,防止那些依赖于这个头文件的目标被重建。忽略多个头文件的修改可使用多个“ -o HEADERFILE ”。这样,头文件“ HEADERFILE ”的修改就不会触发依赖它的目标被重建(通过“ -o ”告诉 make ,这个头文件的时间戳比它的依赖晚)。需要注意的是:“ -o ”参数的这种使用方式仅限于头文件( .h 文件),不能使用“ -o ”来指定源文件。

2.        执行“ make -t ”命令。

5      替换变量定义

make CFLAGS=’-g –O2’

6      使用 make 进行编译测试

    在通常情况下, make 的目的是重建终极目标。当它在执行过程中一旦发现无法重建终极目标,就立刻以非 0 状态退出。当使用“ -k ”或者“ --keep-going ”参数时,执行的目的是为了测试重建过程,需要发现存在的所有问题,以便在下一次 make 之前进行修正。这也是调试 Makefile 或者查找源文件错误的一种非常有效的手段。

7      make 的命令行选项

-b

-m

忽略,提供其它版本 make 兼容性。

-B

--always-make

强制重建所有规则的目标,不根据规则的依赖描述决定是否重建目标文件。

-C DIR

--directory=DIR

在读取 Makefile 之前,进入目录“ DIR ”,就是切换工作目录到“ DIR ”之后执行 make 。存在多个“ -C ”选项时, make 的最终工作目录是第一个目录的相对路径。如:“ make –C / -C etc ”等价于“ make –C /etc ”。一般此选项被用在 递归地 make调用 中。

-d

make 在执行过程中打印出所有的调试信息。包括: make 认为那些文件需要重建;那些文件需要比较它们的最后修改时间、比较的结果;重建目标所要执行的命令;使用的隐含规则等。使用“ -d ”选项我们可以看到 make 构造依赖关系链、重建目标过程的所有信息,它等效于“ —debug=a .

debug[=OPTIONS]

make 执行时输出调试信息。可以使用“ OPTIONS ”控制调试信息级别。默认是“ OPTIONS=b ”,“ OPTIONS ”的可能值为以下这些,首字母有效( all aw 等效)。

a all

输出所有类型的调试信息,等效于“ -d ”选项。

b basic

输出基本调试信息。包括:那些目标过期、是否重建成功过期目标文件。

v verbose

basic ”级别之上的输出信息。包括:解析的 makefile 文件名,不需要重建文件等。此选项目默认打开“ basic ”级别的调试信息。

i implicit

输出所有使用到的隐含规则描述。此选项目默认打开“ basic ”级别的调试信息。

j jobs

输出所有执行命令的子进程,包括命令执行的 PID 等。

m makefile

也就是 makefile ,输出 make 读取 makefile ,更新 makefile ,执行 makefile 的信息。

-e

--environment-overrides

使用系统环境变量的定义覆盖 Makefile 中的同名变量定义。

-f=FILE

--file= FILE

--makefile= FILE

指定“ FILE ”为 make 执行的 makefile 文件。

-h

--help

打印帮助信息。

-i

--ignore-errors

执行过程中忽略规则命令执行的错误。

-I DIR

--include-dir=DIR

指定被包含 makefile 文件的搜索目录。在 Makefile 中出现“ include ”另外一个文件时,将在“ DIR ”目录下搜索。多个“ -I ”指定目录时,搜索目录按照指定顺序进行。

-j  [JOBS]

--jobs[=JOBS]

指定可同时执行的命令数目。在没有指定“ -j ”参数的情况下,执行的命令数目将是系统允许的最大可能数目。存在多个“ -j ”参数时,尽最后一个“ -j ”指定的数目(“ JOBS ”)有效。

-k

--keep-going

执行命令错误时不终止 make 的执行, make 尽最大可能的执行所有的命令,直到出现致命错误才终止。

-l LOAD

--load-average[=LOAD]

max-load[=LOAD]

告诉 make 当存在其它任务在执行时,如果系统负荷超过“ LOAD ”(浮点数表示的),不再启动新任务。没有指定“ LOAD ”的“ -I ”选项将取消之前“ -I ”指定的限制。

-n

--just-print

--dry-run

--recon

只打印出所要执行的命令,但不执行命令。

-o FILE

--old-file= FILE

--assume-old= FILE

指定文件“ FILE ”不需要重建,即使相对于它的依赖已经过期;同时也不重建依赖于此文件任何文件(目标文件)。注意:此参数不会通过变量“ MAKEFLAGS ”传递给子 make 进程。

-p

--print-data-base

命令执行之前,打印出 make 读取的 Makefile 的所有数据(包括规则和变量的值),同时打印出 make 的版本信息。如果只需要打印这些数据信息(不执行命令)可以使用“ make -qp ”命令。查看 make 执行前的预设规则和变量,可使用命令“ make –p -f /dev/null ”。

-q

--question

称为“询问模式”;不运行任何命令,并且无输出。 make 只是返回一个查询状态。返回状态为 0 表示没有目标需要重建, 1 表示存在需要重建的目标, 2 表示有错误发生。

-r

--no-builtin-rules

取消所有内嵌的隐含规则,不过你可以在 Makefile 中使用模式规则来定义规则。同时选项“ -r ”会取消所有支持后追规则的隐含后缀列表,同样我们也可以在 Makefile 中使用“ .SUFFIXES ”定义我们自己的后缀规则。“ -r ”选项不会取消 make 内嵌的隐含变量。

-R

--no-builtin-variabes

取消 make 内嵌的隐含变量,不过我们可以在 Makefile 中明确定义某些变量。注意,“ -R ”选项同时打开“ -r ”选项。因为没有了隐含变量,隐含规则将失去意义(隐含规则是以内嵌的隐含变量为基础的)。

-s

--silent

--quiet

取消命令执行过程的打印。

-S

--no-keep-going

--stop

取消“ -k ”选项。在递归的 make 过程中子 make 通过“ MAKEFLAGS ”变量继承了上层的命令行选项。我们可以在子 make 中使用“ -S ”选项取消上层传递的“ -k ”选项,或者取消系统环境变量“ MAKEFLAGS ”中的“ -k ”选项。

-t

—touch

Linux touch 命令实现功能相同,更新所有目标文件的时间戳到当前系统时间。防止 make 对所有过时目标文件的重建。

-v

--version

查看 make 版本信息。

-w

--print-directory

make 进入一个目录读取 Makefile 之前打印工作目录。这个选项可以帮助我们调试 Makefile ,跟踪定位错误。使用“ -C ”选项时默认打开这个选项。参考本节前半部分“ -C ”选项的描述。

--no-print-directory

取消“ -w ”选项。可以是用在递归的 make 调用过程中,取消“ -C ”参数的默认打开“ -w ”功能。

-W FILE

--what-if= FILE

--new-file= FILE

--assume-file= FILE

设定文件“ FILE ”的时间戳为当前时间,但不改变文件实际的最后修改时间。此选项主要是为实现了对所有依赖于文件“ FILE ”的目标的强制重建。

--warn-undefined-variables

在发现 Makefile 中存在对没有定义的变量进行引用时给出告警信息。此功能可以帮助我们调试一个存在多级套嵌变量引用的复杂 Makefile 。但是:我们建议在书写 Makefile 时尽量避免超过三级以上的变量套嵌引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值