たとえば、次のファイルツリーがあります。
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 $@ $^