Makefile - 要求所有模式匹配

Makefile - require all pattern matches

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

我试过 check : $(wildcard stage[1234].output) 但这导致规则只需要那些 已经存在 .

的匹配输出文件

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

要应用 %.output : %.input 规则,您需要两者

  1. 需要与模式匹配的中间体的目标%.output
  2. 对应的 %.input 文件 - 预先存在或构建它的规则

如果您的 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)

如果你想在 Make 中模拟 seq Unix 实用程序,这里是:

seq = $(if $(word ,),,$(call seq,, $(words  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'.