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"为其搜索隐式规则-这样会导致依赖循环 。
3 规则
makefile 中的规则描述如何生成特定的文件,即规则的目标 。规则列出了目标的依赖文件,指定生成或更新目标的命令 。规则的次序是不重要的,除非是确定缺省目标:缺省目标是第一个makefile 中的第一个规则;如果第一个规则有多个目标,第一个目标是缺省的 。有两个例外:以"."开头的目标不是缺省目标;模式规则对缺省目标没有影响 。
通常我们所写的第一个规则是编译整个或makefile 中指定的所有程序 。
推荐阅读
- q点是什么 简介q点是什么
- 布朗族主要分布在哪里 布朗族简介
- 白居易字什么晚年号是什么 白居易的简介晚年号
- gawk的使用方法
- vi 简介
- 关于gcc、gdb 和gmake 的资料
- Makefile工具的使用
- 佛教八大菩萨简介
- 白鹿原简介
- FreeBSD中/etc下的文件简介
