Make
有沒有辦法告訴 make 將規則應用於與模式匹配的每個文件?
我正在開發一個目錄結構看起來有點像這樣的項目:
inputs/ a.txt b.txt c.txt outputs/ a.out b.out c.out makefile
文件夾中的
outputs
文件是從文件夾中的文件生成的inputs
,我想在輸入文件之一發生更改時自動更新它們。我試圖通過創建一個帶有模式規則的 makefile 來做到這一點。(為了讓這個問題簡單,我只是複制輸入文件而不是轉換它)
outputs/%.txt: inputs/%.out cp $< $@
但是,這個 makefile 並沒有完全滿足我的要求。如果我執行
make outputs/a.txt
它,它將應用我編寫的規則並重新生成輸出文件,如果它已過時,但如果我只是執行,make
那麼什麼也不會發生:make: *** No targets. Stop.
有沒有辦法告訴 make 預設情況下我想為輸入文件夾中的每個文件生成一個輸出文件?
編輯:使輸出文件具有與輸入文件不同的文件後綴。
您通常會使用類似這樣的 makefile 來執行此操作:
IN = $(wildcard inputs/*.txt) OUT = $(subst inputs/,outputs/,$(IN)) outputs/%.txt: inputs/%.txt cp $< $@ default: $(OUT)
這使得預設目標(文件中的第一個目標)取決於
OUT
哪個是現有文件的全域擴展,IN
其中目錄字元串從輸入更改為輸出。如果您想更改後綴,還有許多其他內置函式來操作目標。例如,您可以添加干預操作:
IN2 = $(addsuffix .out,$(basename $(IN)))
該
basename
函式將刪除尾隨.txt
,addsuffix
並將添加一個尾隨.out
。