分类:
2010-11-14 00:48:58
一、make的执行方式
1、 使用不带任何参数的“make”命令来重新编译所有过时的文件。
2、 为了达到这些特殊的目的,需要使用make的命令行参数来实现。原因如下:
A、可能需要使用make更新一部分过时文件而不是全部。
B、需要使用另外的编译器或者重新定义编译选项。
C、只需要察看那些文件被修改,而不需要重新编译。
二、make的退出状态:
1、0— 状态为0时,表示执行成功。
2、1— 在执行make时使用了-q 参数,而且在当前存在过时的目标文件。
3、2—执行过程出现错误,同时会提示错误信息。
三、通过make的命令行参数来实现特殊目的
1、 指定makefile文件
通过make的命令行参数“-f”或者“--file”、“--makefile”。
2、 指定终极目标
通过make加目标名来指定终极目标。
主要的用途:
A、对程序的一部分进行编译,或者仅仅对某几个程序进行编译而不是完整编译这个工程
B、指定编译或者创建那些正常编译过程而不能生成的文件(例如重建一个调试输出文件、或者编译一个调试版本的程序等),这些文件在makefile中存在重建规则,但是它们没有出现在默认终极目标的依赖中。
C、指定执行一个由伪目标定义的若干条命令或者一个空目标文件
部分标准的伪目标和空目标命名:
all:
作为makefile的顶层目标,一般此目标为默认的终极目标。
clean:
定义一组删除所有由make创建的文件的命令。
mostlyclean:
定义一组删除部分由make创建的文件的命令。(比如说一些库文件)
distclean
realclean
clobber:
定义一组删除由make创建的文件和非make创建的文件。
install:
将make成功创建的可执行文件拷贝到shell环境变量PATH指定的某个目录。比如:应用可执行文件被拷贝到目录“/usr/local/bin”,库文件拷贝到目录“/usr/local/lib”。
print:
打印出所有被更改的源文件列表
tar
创建一个tar文件
shar
创建一个源代码的Shell文档
dist
为源文件创建发布的压缩包,可以是各种压缩方式的发布包。
TAGS
更新一个工程的tags列表
check
test
对makefile最后生成的文件进行检查
四、替代命令的执行
Makefile的目的是为了告诉make一个目标是否过期,以及如何重建一个过期的目标。但在有些时候,我们并不希望真正更新那些已经过期的目标文件(检查更新目标的命令是否正确、或者查看那些目标需要更新)。通过指定一些特殊的参数来替代make默认的动作,我们把这种方式叫做替代命令的执行。这些参数:
-n
--just-print
--dry-run
--recon
指定make执行空操作(不执行规则的命令),只打印出需要重建目标是用的命令,而不对目标进行重建。
-t
-touch
不更新目标文件的内容,只更新目标文件的时间戳。
-q
--question
不执行任何命令并且不打印任何输出信息,只检查所指定的目标是否已经是最新的。如果是则返回0,否则返回1。
-w FILE
--what-if=FILE
--assume-new=FILE
--new-file=FILE
这个参数需要指定一个文件名。通常是一个存在的原文件。Make将当前系统时间作为这个文件的时间戳(假设这个文件被修改过,但不真正的更改文件本身的时间戳)。因此这个文件的时间戳认为最新的,在执行时依赖于这个文件的目标将会被重建。通过这种方式并结合-n参数,我们可以查看哪些目标依赖于指定的文件。
-w参数和-n参数一同使用,可以在修改一个文件后检查修改会造成哪些目标需要被更新,但并不执行更新的命令,只是打印命令。
-w参数和-t参数一同使用,只对-w指定的文件执行touch命令。Make在对文件执行touch时不是调用shell命令,而是make直接操作。
-w参数和-q参数一同使用,将文件的时间戳指定为系统时间,所以目标时间比文件时间旧,所以make的返回状态在没有错误发生时为1,存在错误时为2。
参数-n、-t、-q不影响之前带+号和包含$(MAKE)的命令行的执行。
-p
输出makefile被执行的过程信息。
五、防止特定文件的重建
在修改了工程的某一个文件后,并不希望重建那些依赖于这个文件的目标。有两种方法:
第一种:
1、 执行make命令对所有需要更新的目标进行重建,保证修改某个文件之前所有的目标是最新的。
2、 编辑需要修改的那个源文件(不改变已经存在的任何东西)。
3、 执行make –t命令来更新所有目标文件的时间戳。
第二种:
1、 执行编译,使用make –o HEADERFILE,HEADERFILE为需要忽略更改的头文件,防止那些依赖于这头文件的目标被重建。忽略多个头文件的修改可使用多个-o HEADERFILE。-o参数仅限于头文件,不能指定源文件。
2、 执行make –t命令。
六、替换变量定义
在执行make时,一个含有”=”的命令行参数v=x 的含义是将变量v的值设置为x.。从而来更改makefile中变量的值。两种复值方式:=、:=。
为了防止命令行参数的变量定义覆盖makefile中的同名变量定义,可以在makefile中使用指示符override声明这个变量。
七、使用make进行编译测试
通过执行make –k 或者—keep-going的命令行选项,告诉make当遇到错误时继续执行,直到最后出现致命错误(无法重建终极目标)才返回非0并退出。
八、make的命令行选项
本节罗列出了 make 所支持的所有命令行参数(这些参数可以通过 make 的 man 手册查看):
-b
-m
忽略,提供其它版本 make 兼容性。
-B
--always-make
强制重建所有的规则中出现的目标文件。
-C DIR
--directory=DIR
在读取Makefile之前,进入目录“DIR”,就是切换工作目录到“DIR”之后执行make。存在多个“-C”选项时,make的最终工作目录是每一个目录将是前一个相对路径。例如:“make –C / -C etc”等价于“make –C /etc”。
-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”不需要重建,即使相对于它的依赖已经过期。因此依赖于文件“FILE”的目标也不会被重建。注意:此参数不会通过变量“MAKEFLAGS”传递给子make进程
-p
--print-data-base
命令执行之前,打印出 make 读取的 Makefile 的所有数据(包括规则和变量的值),同时打印出 make 的版本信息。如果执行打印这些数据信息(不打印其他信息、也不执行命令)可以使用“make -qp”命令。查看 make 执行前的预设规则和变量,可使用命令“make
–p –f /dev/null”。这个选项为我们在复杂环境中调试 Makefile 提供了手段。
-q
--question
称为“询问模式”;不运行任何命令,并且无输出。make只是返回一个查询状态。返回状态为 0 表示没有目标需要重建,1 表示存在需要重建的目标,2 表示有错误发生。
-r
--no-builtin-rules
取消所有make内嵌的隐含规则,可以在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时尽量避免超过三级以上的变量套嵌引用。
文件:
make的执行.pdf
大小:
114KB
下载:
下载