如何编写具有重复模式的 Makefile 目标?

问题描述 投票:0回答:1

我有具有特定模式的输入文件,它会生成重复具有该模式的文件。

我的输入文件是:

inputs/<pattern>.py

例如

inputs/cfg1.py
inputs/cfg2.py

调用

python inputs/<pattern>.py
生成:

outputs/<pattern>/<pattern>.rpt
outputs/<pattern>/<pattern>.html
outputs/<pattern>/<pattern>.txt

例如

python inputs/cfg1.py
生成

outputs/cfg1/cfg1.rpt
outputs/cfg1/cfg1.html
outputs/cfg1/cfg1.txt

我该如何为此编写 make 规则?

我试过了

outputs/%/%.rpt: inputs/%.py
    python $<

但是不起作用

makefile
1个回答
0
投票

你可以和

$(eval )
一起破解一些东西:

# Create a list of inputs.
override inputs := $(wildcard inputs/*.py)

# A list of output files which we fill below.
override all_outputs :=

# Function to generate the targets for a single set of output files.
override define make_target =
$(eval override _name := $(patsubst inputs/%.py,%,$(input)))
$(eval override _dir := outputs/$(_name))
$(eval override _outputs := $(addprefix $(_dir)/$(_name),.rpt .html .txt))
$(eval override all_outputs += $(_outputs))

$(_outputs) &: $(input) | $(_dir)
    touch $(_outputs)# Your command here.

$(_dir):
    mkdir -p $$@
endef

# Generate the targets:
$(foreach input,$(inputs),$(eval $(make_target)))

# The `all` target.
.PHONY: all
all: $(all_outputs)
.DEFAULT_GOAL := all

如果您的工具没有自动执行此操作,我还添加了生成输出目录的规则。

© www.soinside.com 2019 - 2024. All rights reserved.