Chinaunix首页 | 论坛 | 博客
  • 博客访问: 177242
  • 博文数量: 37
  • 博客积分: 1110
  • 博客等级: 少尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-29 22:01
文章分类

全部博文(37)

文章存档

2013年(10)

2011年(2)

2010年(25)

我的朋友

分类:

2010-11-14 00:48:58

  一、make的执行方式

1、  使用不带任何参数的“make”命令来重新编译所有过时的文件。

2、  为了达到这些特殊的目的,需要使用make的命令行参数来实现。原因如下:

A、可能需要使用make更新一部分过时文件而不是全部。

B、需要使用另外的编译器或者重新定义编译选项。

C、只需要察看那些文件被修改,而不需要重新编译。

 

二、make的退出状态:

1、0—   状态为0时,表示执行成功。

21 在执行make时使用了-q 参数,而且在当前存在过时的目标文件。

32—执行过程出现错误,同时会提示错误信息。

 

三、通过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 HEADERFILEHEADERFILE为需要忽略更改的头文件,防止那些依赖于这头文件的目标被重建。忽略多个头文件的修改可使用多个-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=bOPTIONS的可能值为下列这些,首字母有效(all     aw 等效)。

aall

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

bbasic

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

vverbose

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

iimplicit

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

jjobs

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

mmakefile

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

-e

--environment-overrides

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

-f=FILE

--file= FILE

--makefile= FILE

指定FILEmake执行的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

取消命令执行过程的打印。参考      4.1     命令回显  一节

-S

--no-keep-going

--stop

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

-t

—touch

Linuxtouch命令实现功能相同,更新所有目标文件的时间戳到当前系统时间。防止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
下载: 下载

 

 

 

 

 

 

 

 

阅读(1510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~