GNU Make - 如何为所有虚假规则指定默认配方

GNU Make - How to specify a default recipe for all phony rules

我有一个项目,其中包含一堆相互依赖的虚假 Makefile 规则,它们都共享相同的基本配方。 (这个 Makefile 更多地用于映射依赖关系而不是生成构建工件。)Makefile 看起来像这样:

.PHONY: foo bar baz qux
foo:
    @echo $@
bar: foo
    @echo $@
baz: foo
    @echo $@
qux: bar baz
    @echo $@

实际上,Makefile 定义了几十条规则,因此变得相当冗长。我不想为每个规则明确指定相同的配方,而是遵循 DRY 原则并为所有目标定义一个默认配方,从而生成如下所示的 Makefile:

.PHONY: foo bar baz qux
foo:
bar: foo
baz: foo
qux: bar baz

我缺少的部分是如何定义默认配方。 我发现的一种“解决方法”是使用一种基于宏的方法,但它最终会产生大量重复代码并使规则的可读性大大降低:

define defrule
.PHONY: 
: 
    @echo $$@
endef

$(eval $(call defrule,foo))
$(eval $(call defrule,bar,foo))
$(eval $(call defrule,baz,foo))
$(eval $(call defrule,qux,bar baz))

我想知道 match-anything rule 是否可以提供帮助,尽管我在这方面没有取得任何成功。另请注意,我不关心食谱 运行ning 多次(当目标 qux 时,foo 规则获得 运行 两次,这对我的用例来说很好) .

I'd like to follow the DRY principle and define a default recipe for all the targets

如果你想指定多个目标应该根据相同的配方构建,那么你只需将它们全部命名为相同规则的目标:

foo bar baz qux:
    @echo $@

指定每个目标可以通过运行宁规则的配方来构建,而不是所有是由单个 运行 的食谱构建,我认为这正是您想要的。 $@ 正确反映了在执行任何配方时构建的目标。

您可以使用单独的仅依赖性规则声明它们的依赖性:

bar: foo
baz: foo
qux: bar baz

。当然,您仍然可以声明它们。PHONY:

.PHONY: foo bar baz qux