我有以下文件树(例如):
foo/1213.csv
foo/7789.csv
far/8471.csv
far/7811.csv
boo/8109.csv
bar/2778.csv
bar/3334.csv
bar/1337.csv
现在,我希望为每个foo far boo bar
目录创建一个qux.json
内部目录,这取决于*.csv
该目录中的所有文件。
到目前为止,这应该不会太困难 - 我相信这样的事情会起作用(如果我错了,请纠正我):
%/qux.json: %/*.csv
my-script.py -o $@ $^
我陷入困境的一点是,当规则“类”很少,并且每个类都有不同的配方时,例如:
CLASS1=foo far
CLASS2=boo bar
$(patsubst %,%/qux.json,$(CLASS1)): $(patsubst %,%/*.csv,$(CLASS1))
my-script1.py -o $@ $^
$(patsubst %,%/qux.json,$(CLASS2)): $(patsubst %,%/*.csv,$(CLASS2))
my-script2.py -o $@ $^
但运行make foo/qux.json
失败并显示make: *** No rule to make target 'far/*.csv', needed by 'foo/qux.json'. Stop.
.
我尝试了很多不同的事情,例如:
$(patsubst %,%/qux.json,$(CLASS1)): $(wildcard $(patsubst %/qux.json,%/*.csv,$@))
my-script1.py -o $@ $
没有骰子。
本质上,我有几种类型的子目录。我可以将每个成员枚举到 makefile 变量中。每个子目录包含随机数量的输入 csv 文件。我想在每个目录中的所有 csv 文件中创建一个 json 文件。但每一类目录都需要运行不同的脚本。
我尝试阅读man
文件,我尝试在互联网上搜索,但这对于任何搜索结果来说都太具体了,而且对我来说很难通过手册弄清楚。
答案1
那时,函数对我来说总是看起来更清晰%
:
CLASS1=foo far
CLASS2=boo bar
define f
$1/qux.json: $(wildcard $1/*.csv)
$2
endef
$(foreach i, $(CLASS1), $(eval $(call f, $i,my-script1.py -o $$@ $$^)))
$(foreach i, $(CLASS2), $(eval $(call f, $i,my-script2.py -o $$@ $$^)))
但真的,编写以下内容需要更少的时间:
foo/qux.json: $(wildcard foo/*.csv)
my-script1.py -o $@ $^
boo/qux.json: $(wildcard boo/*.csv)
my-script2.py -o $@ $^
far/qux.json: $(wildcard far/*.csv)
my-script1.py -o $@ $^
bar/qux.json: $(wildcard bar/*.csv)
my-script2.py -o $@ $^