Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1108330
  • 博文数量: 143
  • 博客积分: 969
  • 博客等级: 准尉
  • 技术积分: 1765
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-30 12:09
文章分类

全部博文(143)

文章存档

2023年(4)

2021年(2)

2020年(4)

2019年(4)

2018年(33)

2017年(6)

2016年(13)

2014年(7)

2013年(23)

2012年(33)

2011年(14)

我的朋友

分类: LINUX

2012-08-19 11:45:40

2.Makefile
  Makefile中包含五种内容:显式规则,隐式规则,变量定义,指令(directive)和注释。
  1.显式规则:描述如何生成规则的目标,它列出了目标依赖的文件,指定了产生或更新目标的命令
  2.隐式规则:描述如何生成基于文件名的一类文件,说明目标可能依赖于和其文件名类似的文件,指定了相应的命令。
  3.变量定义:定义一个变量
  3.指令:类似与编译器的伪指令,包含:指示make读入另一个makefile,决定是否忽略makefile中的一部 分
  4.注释:以‘#’开始直到行末,除非遇到续行符号。在’define’和命令中不能有注释,其它情况下注 释可出现在任何地方。

2.1.makefile名字
    缺省情况下,make以下列名字查找makefile:’GNUmakefile’,’makefile’和’Makefile’(注意大小写)。通常你的makefile应叫做’makefile’或’Makefile’。’GNUmakefile’不推荐,除非你的makefile是为GNU的make定制的,其它的make不认为该名字是一个makefile的名字。
    如果你使用非标准命名的makefile,必须用命令开关’-f ’ 或 ’—file’。参数’–f NAME’或’—file NAME’告诉make读入NAME作为makefile。如果使用多个该开关,所有的文件将按顺序连接起来。如果使用该选项,标准的makefile名字不会自动检测。

2.2.包含
  ‘include’指令告诉make暂停处理余下的内容,读入其它makefile。语法如下:
    include FILENAMES …
    这一行起始可以有空格,但TAB字符不允许。如果文件名包含变量或函数,这些将被扩展。

2.3.‘MAKEFILE’变量
    如果环境变量’MAKEFILE’已定义,make认为它的值是一系列空格隔开的文件名,这些文件在处理其它makefile前被make程序读入。这类似于include指令;这些文件中的目标不会影响缺省目标,而且如果文件未找到的话,make并不认为是错误。这个变量的主要用途是递归引用make程序时通讯

2.4.如何重新生成makefile
    有时候makefile是从其它文件生成的,比如RCS或SCCS文件。如果makefile是由其它文件生成的,需要make读入最新版本的makefile。在读入所有makefile之后,make认为每个makefile是一个目标,试图去更新它;如果makefile中有一条如何更新它的规则,或者有适用的隐式规则,需要的更新会进行。所有的makefile检查完之后,如果有的改变了,make重新开始再读入(make会试图再做更新,但通常不会再改变了,因为已经是最新的了)。
    如果一个文件使用双冒号规则,提供了命令但没有依赖关系,文件始终会被更新。在makefile的情况下,如果makefile双冒号规则,提供了命令但没有依赖关系,这样makefile始终会重新生成,这会导致循环:make只是在不断更新makefile,却不干活。为避免这种情况,make不会重新生成那些只有命令没有依赖关系的双冒号规则的makefile。
    如果没有使用’-f’或’--file’选项,make会尝试缺省的makefile文件名。和指明’-f’或’--file’选项不同,make不能确定这些文件是否应当存在。然而,如果缺省makefile不存在但可以通过运行make规则生成,你可能希望这些规则被运行使得makefile可以使用。因此,如果没有缺省makefile,make试图按照makefile名查找的顺序生成它,直到成功或名字用完。注意如果make 不能找到或生成makefile,这并不是错误;makefile不总是必需的。
     当使用’-t’或’--touch’选项时,不希望使用过时的makefile来决定那个目标来touch。所以’-t’选项对makefile更新不起作用;类似’-q’(or ‘—question’)和’-n’(or ’—just-print’)不阻止makefile的更新,因为过时的makefile会产生错误的输出。这样’make –f mfile –n foo’会更新’mfile’,读入它,打印出更新’foo’需要执行的命令但不运行这些命令。与’foo’有关的命令是更新过的’mfile’中的内容。
     但是有时不希望更新makefile,可以将makefile作为命令行的目标,当makefile被显式指定为目标时,’-t’选项也适用于它们。这样’make –f mfile –n mfile foo’会读入’mfile’,打印出更新执行的命令,’foo’的命令是当前的’mfile’中的内容。

2.5.重载makefile
    可以使用’include’指令来包含其它makefile,增加目标的变量定义。然而,make不允许同一个目标有不同的命令,有其它的途径可以达到目的。
    假设有’makefile’ 和’mfile’,’makfile’要包含’mfile’,但都有对于目标’foo’的规则。这是可以在’makefile’中写一条匹配任意模式的规则,指明当make在’makefile’中未找到目标时,搜索’mfile’:
   foo:
      frobnicate > foo
      %: force
      @$(MAKE) -f mfile $@
   force: ;
当执行’make foo’时,make找到’makefile’,执行命令’ frobnicate > foo’;执行’make bar’时,在’makefile’中未找到相应的规则,这时模式规则适用,执行命令’make –f mfile bar’,’makefile’中未提及的其它目标也是类似的。
    这种方法之所以工作是因为模式规则的模式是’%’,可以匹配任何的目标;这条规则的依赖是’force’,保证即使目标存在命令也会执行;’force’规则的命令为空防止’make’为其搜索隐式规则-这样会导致依赖循环。
阅读(2305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~