带有模式和目录的Makefile

时间:2016-06-30 00:56:08

标签: design-patterns makefile directory target

对于游戏来说,我需要进行大量的纹理处理,这可能需要一些时间,因此我只想重新生成修改过的纹理而不是所有纹理。

我有一个类似于这个结构的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 $@

正在工作(它返回我&#34;墙/红&#34;,&#34;墙/蓝&#34;和&#34;墙/混合&#34;)但是:

wall/%:\
  wall/%/top.png\
  wall/%/left.png\
  wall/%/right.png\
  wall/%/down.png\
    echo $@

不能正常工作(它回归说没有规则要建立&#34;墙/红&#34;墙壁&#34;墙&#34;)我不知道为什么因为我和已经看过如下规则:

obj/%.o: %.c $(DEPS)

工作正常。

2 个答案:

答案 0 :(得分:1)

最有可能wall/%: wall/%/top.png ...食谱不匹配,因为{{1}中的一些必需文件(top.pngleft.pngright.pngbottom.png)失踪。

GNU make documentation

中描述了此行为
  

为了应用模式规则,其目标模式必须与所考虑的文件名匹配,并且其所有先决条件(在模式替换之后)必须命名存在或可以创建的文件

证明

这是我的测试makefile:

.source/wall/model/

它正在重现这个问题:

# 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

立即行动!

答案 1 :(得分:1)

int index = 0; mDatabase.child("data").addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); // A new comment has been added, add it to the displayed list Data data = dataSnapshot.getValue(Data.class); index++; Map<String, Object> childUpdates = new HashMap<>(); childUpdates.put("/data/" + dataSnapshot.getKey()+"/index", index); mDatabase.updateChildren(childUpdates); } 规则中有一个反斜杠过多。如果你改变了这个:

wall/%

到此:

wall/%:\
  wall/%/top.png\
  wall/%/left.png\
  wall/%/right.png\
  wall/%/down.png\
    echo $@

它完美无缺。通过额外的反斜杠,您可以告诉Make wall/%:\ wall/%/top.png\ wall/%/left.png\ wall/%/right.png\ wall/%/down.png echo $@ 是规则的先决条件。由于没有名为“echo”的文件,并且makefile无法构建它,因此Make不能将echo规则用于任何事情。

如果你准备了minimal complete example,你可能很容易发现这个错误。