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) |