带有模式和目录的 Makefile
Makefile with pattern and directories
对于一款游戏,我有很多纹理需要重新生成,这可能需要一些时间,所以我只想重新生成修改后的一个而不是所有纹理。
我有一个结构与此类似的 makefile(此处为示例进行了简化):
all:\
wall
wall:\
wall/red\
wall/blue\
wall/mixed
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png\
echo $@ $<
wall/red/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(255,0,0)" -colorize 15,15,15,0 -level "0%,100%,0.8" $@
wall/blue/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(0,0,255)" -colorize 15,15,15,0 -level "0%,100%,0.8" $@
wall/black/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(0,0,0)" -level "0%,100%,0.4" $@
wall/white/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(255,127,0)" -level "0%,70%,1.2" $@
wall/mixed/%.png:\
wall/white/%.png\
wall/black/%.png\
.source/wall/mask/%.png
convert $(word 1,$^) $(word 2,$^) $(word 3,$^) -composite $@
我的问题是:
wall/%:
echo $@
正在工作(它 return 我 "wall/red"、"wall/blue" 和 "wall/mixed")但是 :
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png\
echo $@
不起作用(return 没有为 "wall" 构建 "wall/red" 的规则)我不知道为什么,因为我已经看到了像这样的规则:
obj/%.o: %.c $(DEPS)
可以正常工作。
很可能 wall/%: wall/%/top.png ...
配方不匹配,因为 top.png
、left.png
、right.png
、bottom.png
中的某些所需文件(top.png
、left.png
) =19=] 失踪了。
In order for the pattern rule to apply, its target pattern must match the file name under consideration and all of its prerequisites (after pattern substitution) must name files that exist or can be made
证明
这是我的测试 makefile:
# test.mk
wall/%: wall/%/top.png wall/%/bottom.png
@echo running: $@
wall/red/%.png: .source/wall/model/%.png
@echo running: $@
重现问题:
$ make -f test.mk wall/red
make: *** No rule to make target `wall/red'. Stop.
让我们尝试创建 top.png
:
$ mkdir -p .source/wall/model/top.png
$ make -f test.mk wall/red
make: *** No rule to make target `wall/red'. Stop.
还是不行。还添加 bottom.png
:
$ mkdir -p .source/wall/model/bottom.png
$ make -f test.mk wall/red
running: wall/red/top.png
running: wall/red/bottom.png
running: wall/red
现在可用!
wall/%
规则中的反斜杠过多。如果你改变这个:
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png\
echo $@
对此:
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png
echo $@
效果很好。使用那个额外的反斜杠,您告诉 Make echo
是规则的先决条件。由于没有名为 "echo" 的文件,并且 makefile 没有提供构建它的方法,因此 Make 不能对任何内容使用 wall/%
规则。
如果您准备了 minimal complete example.
,您可以很容易地发现此错误
对于一款游戏,我有很多纹理需要重新生成,这可能需要一些时间,所以我只想重新生成修改后的一个而不是所有纹理。
我有一个结构与此类似的 makefile(此处为示例进行了简化):
all:\
wall
wall:\
wall/red\
wall/blue\
wall/mixed
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png\
echo $@ $<
wall/red/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(255,0,0)" -colorize 15,15,15,0 -level "0%,100%,0.8" $@
wall/blue/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(0,0,255)" -colorize 15,15,15,0 -level "0%,100%,0.8" $@
wall/black/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(0,0,0)" -level "0%,100%,0.4" $@
wall/white/%.png:\
.source/wall/model/%.png
convert $< -fill "rgb(255,127,0)" -level "0%,70%,1.2" $@
wall/mixed/%.png:\
wall/white/%.png\
wall/black/%.png\
.source/wall/mask/%.png
convert $(word 1,$^) $(word 2,$^) $(word 3,$^) -composite $@
我的问题是:
wall/%:
echo $@
正在工作(它 return 我 "wall/red"、"wall/blue" 和 "wall/mixed")但是 :
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png\
echo $@
不起作用(return 没有为 "wall" 构建 "wall/red" 的规则)我不知道为什么,因为我已经看到了像这样的规则:
obj/%.o: %.c $(DEPS)
可以正常工作。
很可能 wall/%: wall/%/top.png ...
配方不匹配,因为 top.png
、left.png
、right.png
、bottom.png
中的某些所需文件(top.png
、left.png
) =19=] 失踪了。
In order for the pattern rule to apply, its target pattern must match the file name under consideration and all of its prerequisites (after pattern substitution) must name files that exist or can be made
证明
这是我的测试 makefile:
# test.mk
wall/%: wall/%/top.png wall/%/bottom.png
@echo running: $@
wall/red/%.png: .source/wall/model/%.png
@echo running: $@
重现问题:
$ make -f test.mk wall/red
make: *** No rule to make target `wall/red'. Stop.
让我们尝试创建 top.png
:
$ mkdir -p .source/wall/model/top.png
$ make -f test.mk wall/red
make: *** No rule to make target `wall/red'. Stop.
还是不行。还添加 bottom.png
:
$ mkdir -p .source/wall/model/bottom.png
$ make -f test.mk wall/red
running: wall/red/top.png
running: wall/red/bottom.png
running: wall/red
现在可用!
wall/%
规则中的反斜杠过多。如果你改变这个:
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png\
echo $@
对此:
wall/%:\
wall/%/top.png\
wall/%/left.png\
wall/%/right.png\
wall/%/down.png
echo $@
效果很好。使用那个额外的反斜杠,您告诉 Make echo
是规则的先决条件。由于没有名为 "echo" 的文件,并且 makefile 没有提供构建它的方法,因此 Make 不能对任何内容使用 wall/%
规则。
如果您准备了 minimal complete example.
,您可以很容易地发现此错误