Makefile规则中的通配符

时间:2017-02-16 00:49:47

标签: makefile wildcard

我在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>

但这不起作用。

2 个答案:

答案 0 :(得分:2)

不,没有办法将其合并为一条规则。

但是,您可以自动生成规则。假设你可以把它写成一行,你可以使用类似的东西:

SIZES := 00 10 20 30

$(foreach S,$(SIZES),$(eval %.$S.png: %.dat ; genimg.py $$< $$@))

答案 1 :(得分:0)

您可以使用secondary expansionautomatic 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