複数のターゲットと依存関係の組み合わせを含む 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 $@ $^

関連情報