Variable

具有多個目標和依賴項組合的 Makefile

  • December 27, 2020

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

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

引用自:https://unix.stackexchange.com/questions/626307