GNU Make中的递归模式规则

时间:2017-09-28 16:02:43

标签: gnu-make

我有一个模式规则,它构建了几个工件,其中一些工件相互依赖。 GNU Make似乎无法应对这种情况。

这是一个最小的例子:

$ cat Makefile 
.SECONDEXPANSION:

foo_DEPS := bar-thing

%-thing: $$($$*_DEPS)
    touch $@
$ make foo-thing
make: *** No rule to make target 'foo-thing'. Stop.

如果foo-thing 的依赖关系已经存在,则它具有明确的(非模式)规则,那么它就能正常工作。

让这个有用吗?还是另一种实现同样目的的方式?

1 个答案:

答案 0 :(得分:0)

我,我不喜欢模式规则。 它们使构造有点毛茸茸。 在任何给定的环境中, make 会选择哪些 make ,这一点从未真正清楚过。 因此,我总是使用-Rr取消内置规则(同时提供有用的加速,并使make -d的输出成为 lot saner)。

然而,模式本身很有用。 您可以通过静态模式规则将模式明确应用于预先存在的源。 这些更擅长恕我直言。

他们看起来像这样:

来源列表 : 目标模式 : 依赖模式

所以就像普通的模式规则一样,除了明确列出规则适用的源。 在你的情况下,我们最终得到

.SECONDEXPANSION:

foo_DEPS := bar-thing

foo-thing: %-thing: $${$$*_DEPS}
     touch $@

我认为即使 foo-thing 不存在也能很好地工作。