如何在Make中为多个图案规则共享同一配方?

时间:2019-06-05 10:14:01

标签: makefile gnu-make

我有这样的规则:

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

食谱完全一样,所以我想分享。
但这不会做同样的事情,对我来说这没有意义:

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

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

1 个答案:

答案 0 :(得分:3)

您的尝试不起作用,因为具有多个目标的模式规则和具有多个目标的显式规则的处理方式大不相同。

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

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

实际上告诉我们,一次调用{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)

个人来讲,这是我更喜欢如何编写它,而不是创建一个外部脚本或类似的东西。