【问题标题】:Wildcards in Makefile rulesMakefile 规则中的通配符
【发布时间】:2017-02-16 00:49:47
【问题描述】:

我在 Makefile 中有以下规则

%.00.png: %.dat
    genimg.py $< $@

%.10.png: %.dat
    genimg.py $< $@

%.20.png: %.dat
    genimg.py $< $@

%.30.png: %.dat
    genimg.py $< $@

其中genimg.py 是一个脚本,它根据*.dat 文件中的数据和存储在目标文件名称(00、10、20、30)中的参数生成图像。是否可以将所有这些规则合二为一?我尝试了明显的:

%.*.png: %.dat
    genimg.py $< $@

但这不起作用。

【问题讨论】:

    标签: makefile wildcard


    【解决方案1】:

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

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

    SIZES := 00 10 20 30
    
    $(foreach S,$(SIZES),$(eval %.$S.png: %.dat ; genimg.py $$< $$@))
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 2021-01-24
        • 1970-01-01
        相关资源
        最近更新 更多