我有一个模式规则,它构建了几个工件,其中一些工件相互依赖。 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
的依赖关系或已经存在或,则它具有明确的(非模式)规则,那么它就能正常工作。
让这个有用吗?还是另一种实现同样目的的方式?
答案 0 :(得分:0)
我,我不喜欢模式规则。
它们使构造有点毛茸茸。
在任何给定的环境中, make 会选择哪些 make ,这一点从未真正清楚过。
因此,我总是使用-Rr
取消内置规则(同时提供有用的加速,并使make -d
的输出成为 lot saner)。
然而,模式本身很有用。 您可以通过静态模式规则将模式明确应用于预先存在的源。 这些更擅长恕我直言。
他们看起来像这样:
来源列表 :
目标模式 :
依赖模式
所以就像普通的模式规则一样,除了明确列出规则适用的源。 在你的情况下,我们最终得到
.SECONDEXPANSION:
foo_DEPS := bar-thing
foo-thing: %-thing: $${$$*_DEPS}
touch $@
我认为即使 foo-thing 不存在也能很好地工作。