如何在 Make 中为多个模式规则共享相同的配方?

How to share the same recipe for multiple pattern rules in Make?

我有这样的规则:

.SECONDEXPANSION:
foo/%.x: bar/$$*$$(suffix $$@)
    {complicated recipe}
foo/%.y: bar/$$*$$(suffix $$@)
    {complicated recipe}

菜谱一模一样,分享一下
但这并没有做同样的事情,这对我来说没有意义:

.SECONDEXPANSION:
foo/%.x foo/%.y: bar/$$*$$(suffix $$@)
    {complicated recipe}

为多个模式规则共享同一个复杂配方的正确方法是什么?

您的尝试无效,因为具有多个目标的模式规则和具有多个目标的显式规则的处理方式完全不同。

具有多个目标的显式规则会创建多个显式规则,每个目标一个。但是具有多个目标的模式规则会创建一个 builds multiple targets 作为其输出的规则。所以你的规则是:

foo/%.x foo/%.y: bar/$$*$$(suffix $$@)
        {complicated recipe}

实际上告诉 make 单次调用 {complicated recipe} 将同时创建 foo/%.xfoo/%.y 目标。

我不确定你说的是什么意思我也不能在一行中完成但是你总是可以使用宏。如果您需要多个逻辑行,请使用 define 语法:

define complex_recipe
....
endef

在您的评论中,您写 $$ 重复确实使规则变得笨拙,但您需要它的唯一原因是因为您试图定义多个模式规则在一节中。如果您多次编写它,则不需要任何这些东西:

define complex_recipe
...
endef

foo/%.x : bar/%.x ; $(complex_recipe)
foo/%.y : bar/%.y ; $(complex_recipe)

就个人而言,我更喜欢这样写,而不是创建外部脚本或类似的东西。