Makefile:阻止无限模式递归

时间:2016-07-29 04:08:06

标签: makefile gnu-make

我觉得这很简单

%.png: ../figs/%.png
        convert $? -resize '40%' $@

也就是说,我想在“../figs/”中的相应图像中生成此目录中的图像。

但是,上面会导致无限的依赖链,因为../figs/foo.png匹配%.png,因此尝试检查../figs/../figs/foo.png,它匹配%.png因此尝试。 。 。 最后,使用“文件名太长”停止。

我一定错过了什么。什么是清洁解决方案?

3 个答案:

答案 0 :(得分:3)

以上所有答案都很有趣。不过,我想提一下终端规则解决方案:

%.png:: ../figs/%.png
    convert $? -resize '40%' $@

通过更改为双冒号 ::,我们然后标记先决条件 terminal

<块引用>

一种选择是通过用双冒号定义匹配任何规则来将其标记为终结符。 当规则是终端规则时,除非它的先决条件确实存在,否则它不会适用。 可以用其他隐式规则建立的先决条件不够好。换句话说,除了终止规则之外,不允许进一步链接。

注意:仅适用于匹配任何规则。

答案 1 :(得分:1)

使用空规则杀死链

%.png: ../figs/%.png
    convert $? -resize '40%' $@

../figs/%.png: ;

答案 2 :(得分:0)

user657267的解决方案非常完美。另一种选择是使用静态模式规则:

PNGS    := $(patsubst ../figs/%.png,%.png,$(wildcard ../figs/*.png))

all: $(PNGS)

$(PNGS): %.png: ../figs/%.png
    convert $< -resize '40%' $@

clean:
    rm -f $(PNGS)

从所有先决条件列表中计算所有目标的列表有几个很好的副作用,例如添加allclean目标的可能性。