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”而陷入无限循环。