我觉得这很简单
%.png: ../figs/%.png
convert $? -resize '40%' $@
也就是说,我想在“../figs/”中的相应图像中生成此目录中的图像。
但是,上面会导致无限的依赖链,因为../figs/foo.png
匹配%.png
,因此尝试检查../figs/../figs/foo.png
,它匹配%.png
因此尝试。 。 。
最后,使用“文件名太长”停止。
我一定错过了什么。什么是清洁解决方案?
答案 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)
从所有先决条件列表中计算所有目标的列表有几个很好的副作用,例如添加all
和clean
目标的可能性。