即使已经有另一个与目标匹配的规则,模式隐式规则也会执行吗?

时间:2019-01-09 03:20:08

标签: makefile

基本上,如果我有一个已经有规则但仍与另一个模式隐式规则匹配的目标。 make如何处理这种情况?

targ.bin :: dep

dep: some-req
   some rules

%.bin : some-reqs
   some rules

在这种情况下,两个规则都适用于targ.bin吗?意思是,将dep与其先决条件和规则一起调用,然后执行%.bin模式隐式先决条件和规则吗?

1 个答案:

答案 0 :(得分:1)

请参阅GNU Make手册4.13 Double-Colon Rules, 特别是:

  

每个双冒号规则都应指定一个配方;如果不适用,则将应用一个隐式规则。请参阅使用隐式规则。

您的双冒号规则:

targ.bin :: dep

没有食谱。因此,它仅表示依赖项targ.bin-> dep 和隐式规则:

%.bin : some-reqs
   some rules

通过执行以下命令来指定targ.bin为最新版本:

some rules

以及暗示依赖性targ.bin-> some-reqs

Make结合了目标targ.bin的所有先决条件。因此,您的Makefile表示:

dep: some-req
   some rules

targ.bin : some-reqs dep
   some rules

targ.bin的完整食谱。

制作文件

targ.bin :: dep

dep: a
    echo '$@ -> $^'

%.bin : b
    echo '$@ -> $^'

运行方式:

$ touch a b
$ make
echo 'dep -> a'
dep -> a
echo 'targ.bin -> b dep'
targ.bin -> b dep

稍后

  

假设在示例中您提供的双冒号规则有一个配方,这是否意味着隐式规则将不适用?

请参见10.1 Using Implicit Rules,尤其是:

  

通常,搜索每个目标和每个没有配方的双冒号规则的隐式规则。

是的,如果双冒号规则具有配方,则隐式规则将不适用。我把实验留给你。