首页 > 解决方案 > 即使已经有另一个与目标匹配的规则,模式隐式规则也会执行吗?

问题描述

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

targ.bin :: dep

dep: some-req
   some rules

%.bin : some-reqs
   some rules

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

标签: makefile

解决方案


请参阅 GNU Make 手册4.13 双冒号规则,尤其是:

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

你的双冒号规则:

targ.bin :: dep

没有食谱。因此它只表达依赖targ.bin->dep 和隐含规则:

%.bin : some-reqs
   some rules

指定targ.bin应通过执行更新:

some rules

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

Make 结合了 target 的所有先决条件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 使用隐式规则,尤其是:

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

所以是的,如果双冒号规则有一个配方,则不会应用隐式规则。我把实验留给你。


推荐阅读