我在Makefile中有以下规则
genimg.py
其中*.dat
是根据%.*.png: %.dat
genimg.py $< $@
文件中的数据生成图像的脚本,以及存储在目标文件名称中的参数(00,10,20,30) 。是否可以将所有这些规则合并为一个?我尝试了显而易见的事实:
<tr>
<td class="lalign"><span class="ceoName"></span><span class="ceoTitle" style="color: navy;text-align: center;"></span></td>
<td><span class="ceoMondaySchedule"></span></td>
<td><span class="ceoTuesdaySchedule"></span></td>
<td><span class="ceoWednesdaySchedule"></span></td>
<td><span class="ceoThursdaySchedule"></span></td>
<td><span class="ceoFridaySchedule"></span></td>
</tr>
<tr>
<td class="lalign"><span class="cfoName"></span><span class="cfoTitle" style="color: navy;text-align: center;"></span></td>
<td><span class="cfoMondaySchedule"></span></td>
<td><span class="cfoTuesdaySchedule"></span></td>
<td><span class="cfoWednesdaySchedule"></span></td>
<td><span class="cfoThursdaySchedule"></span></td>
<td><span class="cfoFridaySchedule"></span></td>
</tr>
<tr>
<td class="lalign"><span class="ctoName"></span><span class="ctoTitle" style="color: navy;text-align: center;"></span></td>
<td><span class="ctoMondaySchedule"></span></td>
<td><span class="ctoTuesdaySchedule"></span></td>
<td><span class="ctoWednesdaySchedule"></span></td>
<td><span class="ctoThursdaySchedule"></span></td>
<td><span class="ctoFridaySchedule"></span></td>
</tr>
但这不起作用。
答案 0 :(得分:2)
不,没有办法将其合并为一条规则。
但是,您可以自动生成规则。假设你可以把它写成一行,你可以使用类似的东西:
SIZES := 00 10 20 30
$(foreach S,$(SIZES),$(eval %.$S.png: %.dat ; genimg.py $$< $$@))
答案 1 :(得分:0)
您可以使用secondary expansion,automatic variable $*
和basename
函数来实现与此非常接近的内容:
.SECONDEXPANSION:
%.png: $$(basename $$*).dat
genimg.py $< $@
但是这具有以下限制:名称foo.png
的文件仍将由此规则拟合并依赖于foo.dat
。
如果这对您的应用程序来说不是可接受的行为,您可以使用更复杂的版本:
.SECONDEXPANSION:
# This relies on the assumption that there's no file named '/-'
%.png: $$(if $$(word 2,$$(subst ., ,$$*)),$$(word 1,$$(subst ., ,$$*)).dat,/-)
genimg.py $< $@
但是这带来了额外的限制,即名为a.b.10.png
的文件将作为先决条件a.dat
而不是预期的a.b.dat
。