包含多个目标和依赖项组合的 Makefile

包含多个目标和依赖项组合的 Makefile

我有以下文件树(例如):

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 $@ $^

相关内容