Makefile - 要求所有模式匹配
Makefile - require all pattern matches
我正在尝试编写一个规则,该规则将在我的程序的每个阶段的输出上调用我的检查脚本,如果该输出尚不存在,则使用我的 %.output : %.input
规则生成该输出。
我试过 check : $(wildcard stage[1234].output)
但这导致规则只需要那些 已经存在 .
的匹配输出文件
我可以只定义一个像 TARGETS = stage1.output stage2.output ...
这样的变量,但是有没有一种方法可以生成一个模式的所有可能匹配项,然后要求它们?
要应用 %.output : %.input
规则,您需要两者
- 需要与模式匹配的中间体的目标
%.output
- 对应的
%.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'.
我正在尝试编写一个规则,该规则将在我的程序的每个阶段的输出上调用我的检查脚本,如果该输出尚不存在,则使用我的 %.output : %.input
规则生成该输出。
我试过 check : $(wildcard stage[1234].output)
但这导致规则只需要那些 已经存在 .
我可以只定义一个像 TARGETS = stage1.output stage2.output ...
这样的变量,但是有没有一种方法可以生成一个模式的所有可能匹配项,然后要求它们?
要应用 %.output : %.input
规则,您需要两者
- 需要与模式匹配的中间体的目标
%.output
- 对应的
%.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'.