我有具有特定模式的输入文件,它会生成重复具有该模式的文件。
我的输入文件是:
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 $<
但是不起作用
你可以和
$(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
如果您的工具没有自动执行此操作,我还添加了生成输出目录的规则。