makefile(6)
2.4 隐含规则 (Implicit Rules)
请细致,在上面的例子里,几个产生 .o 文件的下令都是一样的。 都是从 .c 文件和 相关文件里产生 .o 文件,这是一个标准的步 骤。其实 make 已经知道怎样做——它 有一些叫做隐含规则的内 置的规则,这些规则告诉它当你没有给出某些下令的时候, 应该 怎样办。要是你把天生 foo.o 和 bar.o 的下令从它们的规则中删除, make 将会查找它的隐含 规则,然后会找到一个得当的下令。它的下令会 使用一些变量,因而你可以按照你的 想法来设定它:它使用变量 CC 做为编译器(象我们在前面的例子),并且通报变量 CFLAGS (给 C 编译器,C++ 编译器用 CXXFLAGS ),CPPFLAGS ( C 预 处置惩罚器旗 标), TARGET_ARCH (现在不消思量这个),然后它加 入旗标 "-c" ,后面跟变量 $< (第一个依靠名),然后是旗 标 "-o" 跟变量 $@ (目标文件名)。
一个C编译的 具体下令将 会是:$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@ 固然你可以按照你本身的需要来界说这些变量。这就是为什么用 gcc 的 -M 或 -MM 开 关输出的码可以直接用在一个 makefile 里。 2.5 假象目标 (Phony Targets) 假设你的一个项目末了需要产生两个可执行文件。你的主要目标 是产生两个可执行文 件,但这两个文件是相互独立的——要是一 个文件需要重建,并不影响另一个。你可 以使用“假象目标”来 达到这种结果。一个假象目标跟一个正常的目标险些是一样 的, 只是这个目标文件是不存在的。因而, make 总是会假设它需要 被天生,当把它 的依赖文件更新后,就会执行它的规则里的下令 行。 要是在我们的 makefile 开端处输入:
all : exec1 exec2 其中 exec1 和 exec2 是我们做为目标的两个可执行文件。 make 把这个 "all" 做为 它的主要目标,每次执行时都会实验把 "all" 更新。但既然这行规则里没有哪个下令 来作用在一个叫 "all" 的 现实文件(究竟上 all 并不会在磁碟上现实产生),以是 这个规 则并不真的转变 "all" 的状态。可既然这个文件并不存在,以是 make 会实验 更新 all 规则,因而就查抄它的依靠 exec1, exec2 是否需要更新,要是需要,就把 它们更新,从而达到我们的目标。 假象目标也可以用来形貌一组非预设的动作。例如,你想把全部由 make 产生的文件删 除,你可以在 makefile 里设立如许一个规则:
veryclean :
rm *.o
rm myprog
前提是没有别的的规则依靠这个 "veryclean" 目标,它将永远 不会被执行。但是,要是你明白的使用下令 "make veryclean" , make 会把这个目标做为它的主要目标,执行那些 rm 下令。要是你的磁碟上存在一个叫 veryclean 文件,会发生什么事?这 时由于在这个规则里 没有任何依靠文件,以是这个目标文件肯定是 最新的了(全部的依靠文件都已经是最 新的了),以是既使用户明 确下令 make 重新产生它,也不会有任何事情发生。解决 方法是标 明全部的假象目标(用 .PHONY),这就告诉 make 不消查抄它们 是否存在 于磁碟上,也不消查找任何隐含规则,直接假设指定的目 的需要被更新。在 makefile 里加入上面这行包罗上面规则的规则:
..PHONY : veryclean
就可以了。细致,这是一个特别的 make 规则,make 知道 .PHONY 是一个特别目标, 固然你可以在它的依靠里加入你想用的任何假象 目标,而 make 知道它们都是假象目 的。
- 文章作者: 福州军威计算机技术有限公司
军威网络是福州最专业的电脑维修公司,专业承接福州电脑维修、上门维修、IT外包、企业电脑包年维护、局域网网络布线、网吧承包等相关维修服务。
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 、作者信息和声明。否则将追究法律责任。
TAG:
评论加载中...
|