Variable
具有多個目標和依賴項組合的 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
文件,我嘗試在網際網路上搜尋,但是這對於任何搜尋結果來說都太具體了,而且我很難通過手冊來弄清楚。
那時我的功能總是看起來更清晰
%
: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 $@ $^