Makefile - 需要所有模式匹配

时间:2017-01-31 17:12:34

标签: makefile wildcard

我尝试编写一条规则,在我程序的每个阶段的输出上调用我的检查脚本,如果使用我的%.output : %.input规则尚不存在,则生成该输出。

我尝试了check : $(wildcard stage[1234].output),但这会导致规则只需要已经存在的匹配输出文件

我可以定义一个像TARGETS = stage1.output stage2.output ...这样的变量,但有没有办法生成模式的所有可能匹配然后需要它们?

2 个答案:

答案 0 :(得分:1)

要申请%.output : %.input规则,您需要两者

  1. 需要与模式%.output
  2. 匹配的中间人的目标
  3. 相应的%.input文件 - 预先存在或建立它的规则
  4. 如果您的stage*.input文件已存在,则可以使用:

    INPUTS=$(wildcard stage[1234].input)
    TARGETS=$(INPUTS:%.input=%.output)
    check: $(TARGETS)
    

    如果您的stage*.input文件不存在但预计将根据类似的模式规则构建,请重新应用相同的原则。

    如果您的stage*.input是通过更复杂的方式生成的,但假设可以通过应用替换模式生成其名称,则只应用该模式。在您的示例中,它将类似于:

    L:= 1 2 3 4
    TARGETS=$(L:%=stage%.output)
    

答案 1 :(得分:0)

如果你想在Make中模拟seq Unix实用程序,那么它就是:

seq = $(if $(word $1,$2),$2,$(call seq,$1,$2 $(words $2 1)))
$(info seq(10)=$(call seq,10))

stage_sount:=7
stages:=$(patsubst %,stage%.output,$(call seq,$(stage_sount)))
$(info stages=$(stages))
all:

输出:

$ make
seq(10)= 1 2 3 4 5 6 7 8 9 10
stages=stage1.output stage2.output stage3.output stage4.output stage5.output stage6.output stage7.output
make: Nothing to be done for 'all'.