Make
Makefile 奇怪的變數替換
我的
Makefile
樣子是這樣的:%.foo: %.bar cp $< $@ test: *.foo echo *.foo
我在目錄中有 2 個文件:
a.bar
和b.bar
. 當我執行make test
它時輸出:cp b.bar *.foo echo *.foo *.foo
它還
*.foo
在目前目錄中創建一個文件。我實際上期待看到這個:
cp a.bar a.foo cp b.bar b.foo echo *.foo a.foo b.foo
並且還創建
a.foo
和b.foo
. 如何做到這一點?
在這種情況下,您需要使用
wildcard
函式(至少在GNU Make中)顯式處理萬用字元:%.foo: %.bar cp $< $@ foos = $(patsubst %.bar,%.foo,$(wildcard *.bar)) test: $(foos) echo $(foos)
$(wildcard *.bar)
擴展到所有以 結尾的文件.bar
,patsubst
呼叫替換.bar
為.foo
,然後所有目標都按照您的預期進行處理。
沒有 *.foo 文件開始。所以 make 所做的就是尋找如何從
*.foo
字面上進行製作,而第一條規則就是這樣做的。Make 擴展$<
到第一個先決條件(*.bar
,在這種情況下恰好是b.bar
)。Make 然後執行 shell 命令cp b.bar *.foo
。由於沒有 *.foo,shell 將其擴展為cp b.bar *.foo
字面意思。這就是你獲取*.foo
文件的方式。您可以通過執行來驗證這一點
make -d test
。您可以通過根據先決條件列表生成目標列表來獲得所需的效果。
TARGETS = $(patsubst %.bar,%.foo,$(wildcard *.bar)) %.foo: %.bar @cp $< $@ test: $(TARGETS) @echo $(TARGETS) echo *.foo