如何通过在Makefile列表上循环创建多个食谱



我有下面的makefile,它有多个cp命令,用于将目录从源复制到目标。

process:
cp dir/level/2000/config.json output/2000/config.json
cp dir/level/2001/config.json output/2001/config.json
cp dir/level/2002/config.json output/2002/config.json
stage:
mkdir -p output/2000 output/2001 output/2002
cp dir/common/2000/esc output/2000/esc
cp dir/common/2001/esc output/2001/esc
cp dir/common/2002/esc output/2002/esc
apply: stage process

我想通过引入2000 2001 2002的变量列表使上面的Makefile更具动态性,然后它将在变量上循环,并在每次迭代中运行规则。类似。。。

var := 2000 2001 2002
process:
cp dir/level/${var}/config.json output/${var}/config.json
stage:
mkdir -p output/${var}
cp dir/common/${var}/esc output/${var}/esc
apply: stage process

现在,如果我运行make apply,它应该重新创建与第一个makefile相同的步骤。我尝试使用多个目标作为${var},它按照我想要的方式工作,但它只能代替其中一个目标,不能同时用于stageprocess。我做了

process:
cp dir/level/2000/config.json output/2000/config.json
cp dir/level/2001/config.json output/2001/config.json
cp dir/level/2002/config.json output/2002/config.json
${var}:
mkdir -p output/$@ 
cp dir/common/$@/esc output/$@/esc
apply: ${var} process

现在,如果我运行make-apply,它会像我预期的那样运行,但如何使用相同的多个目标来代替process呢?

您很可能会使用模式规则:

apply: stage process
var := 2000 2001 2002
process: $(foreach V,$(var),output/$V/config.json)
stage: $(foreach V,$(var),output/$V/esc)
output/%/config.json: dir/level/%/config.json
cp $< $@
output/%/esc : dir/common/%/esc
mkdir -p $(@D)
cp $< $@

最简单的解决方案可能是在配方中使用shellfor循环:

var := 2000 2001 2002
process:
for year in $(var); do 
cp dir/level/$$year/config.json output/$$year/config.json; 
done

请注意,在配方中,我们需要编写$$year以引用shell变量名为year,因为单个$会引入makefile变量引用。


只需使用make语法,就可以做到这一点:

var = 2000 2001 2002
outputs = $(patsubst %,output/%/config.json,$(var))
output/%/config.json: dir/level/%/config.json
echo cp $< $@
all: $(outputs)

这将创建一个变量outputs,其内容为:

output/2000/config.json output/2001/config.json output/2002/config.json

然后使用模式规则隐式地创建配方,用于从相应的输入创建这些输出。

相关内容

  • 没有找到相关文章

最新更新