Make

Makefile 奇怪的變數替換

  • March 11, 2019

我的Makefile樣子是這樣的:

%.foo: %.bar
   cp $< $@

test: *.foo
   echo *.foo

我在目錄中有 2 個文件:a.barb.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.foob.foo. 如何做到這一點?

在這種情況下,您需要使用wildcard函式(至少在GNU Make中)顯式處理萬用字元:

%.foo: %.bar
   cp $< $@

foos = $(patsubst %.bar,%.foo,$(wildcard *.bar))

test: $(foos)
   echo $(foos)

$(wildcard *.bar)擴展到所有以 結尾的文件.barpatsubst呼叫替換.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

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