Make

有沒有辦法告訴 make 將規則應用於與模式匹配的每個文件?

  • March 14, 2019

我正在開發一個目錄結構看起來有點像這樣的項目:

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函式將刪除尾隨.txtaddsuffix並將添加一個尾隨.out

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