Makefile 中重载另外一个makefile

3.8 重载另外一个makefile


有些情况下,存在两个比较类似的 makefile 文件。其中一个( makefile-A)需要使用另外一个( makefile-B)中所定义的变量和规则。
通常我们会想到在“ makefile-A”中使用指示符“ include”包含“ mkaefile-B”来达到目的。但使用这种方式,如果在两个 makefile 文件中存在相同目标,
而在不同的文件中其描述规则使用不同的命令。这样,相同的目标文件就同时存在两个不同的规则命令,这是 makefile 所不允许的。

遇到这种情况,使用指示符“ include”显然是行不通的。
GNU make 提供另外一种途径来实现此目的。

具体的做法如下:
在需要包含的makefile文件( makefile-A)中,定义一个称之为“所有匹配模式”(参考 10.5 模式规则 一节)的规则,
它用来述那些在“ makefile-A”中没有给出明确创建规则的目标的重建规则。就是说,如果在当前makefile文件中不能找到重建一个
目标的规则时,就使用“所有匹配模式”所在的规则来重建这个目标。

看一个例子,如果存在一个命名为“ Makefile”的 makefile 文件,其中描述目标“ foo”
的规则和其他的一些规,我们也可以书写一个内容如下命名为“ GNUmakefile”的文件。
GNUmakefile文件:

#sample GNUmakefile,注意当前文件是 GNUmakefile
#功能:在当前GNUmakefile文件调用Makefile文件中的规则,来建立目标,避免使用 include

foo:
frobnicate > foo

#“所有匹配模式”规则:当前GNUmakefile找不到对应规则时就执行此规则
%: force
@$(MAKE) -f Makefile $@  #在Makefile文件中去查找对应的规则,并执行
force: ;

执行命令“ make foo”, make 将使用工作目录下命名为“ GNUmakefile”的文件并执行目标“ foo”所在的规则,创建目标“ foo”的命令是:“ frobnicate > foo”。
如果执行另外一个命令“ make bar”,因为在“ GUNmakefile”中没有此目标的更新规则。 make 将使用“所有匹配模式”规则,执行命令“ $(MAKE) -f Makefile bar”。

如果文件“ Makefile”中存在此目标更新规则的定义,那么这个规则会被执行。此过程同样适用于其它 “ GNUmakefile”中没有给出的目标更新规则。此方式的灵活之处在于:
如果在“ Makefile”文件中存在同样一一个目标“ foo”的重建规则,由于 make 执行时首先读取文件“ GUNmakefile”并在其中能够找到目标“ foo”的重建规则,所以 make
就不会去执行这个“所有模式匹配规则”(上例中目标“ %”所在的规则)。这样就避免了使用指示符“ include”包含一个 makefile 文件时所带来的目标规则的重复定义问
题。
此种方式,模式规则的模式只使用了单独的“ %”(我们称他为“所有模式匹配规则”),它可以匹配任何一个目标;它的依赖是“ force”,保证了即使目标文件已经
存在也会执行这个规则(文件已存在时,需要根据它的依赖文件的修改情况决定是否需要重建这个目标文件);

“ force”规则中使用空命令是为了防止 make 程序试图寻找一个规则去创建目标“ force”时,又使用了模式规则“ %: force”而陷入无限循环。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值