3 回答

TA貢獻1804條經(jīng)驗 獲得超2個贊
在您的示例中,TMP只要評估了規(guī)則,out.tar便會設(shè)置變量(并創(chuàng)建臨時目錄)。為了僅在out.tar實際觸發(fā)時創(chuàng)建目錄,您需要將目錄創(chuàng)建移至以下步驟:
out.tar :
$(eval TMP := $(shell mktemp -d))
@echo hi $(TMP)/hi.txt
tar -C $(TMP) cf $@ .
rm -rf $(TMP)
該EVAL,如果它已經(jīng)手動鍵入到makefile文件函數(shù)計算的字符串。在這種情況下,它將TMP變量設(shè)置為shell函數(shù)調(diào)用的結(jié)果。
編輯(回應(yīng)評論):
要創(chuàng)建唯一變量,您可以執(zhí)行以下操作:
out.tar :
$(eval $@_TMP := $(shell mktemp -d))
@echo hi $($@_TMP)/hi.txt
tar -C $($@_TMP) cf $@ .
rm -rf $($@_TMP)
這會將目標名稱(在本例中為out.tar)放在變量之前,從而產(chǎn)生一個名稱為的變量out.tar_TMP。希望這足以防止沖突。

TA貢獻1785條經(jīng)驗 獲得超4個贊
另一種可能性是在規(guī)則觸發(fā)時使用單獨的行來設(shè)置Make變量。
例如,這是帶有兩個規(guī)則的makefile。如果規(guī)則觸發(fā),它將創(chuàng)建一個臨時目錄并將TMP設(shè)置為該臨時目錄名稱。
PHONY = ruleA ruleB display
all: ruleA
ruleA: TMP = $(shell mktemp -d testruleA_XXXX)
ruleA: display
ruleB: TMP = $(shell mktemp -d testruleB_XXXX)
ruleB: display
display:
echo ${TMP}
運行代碼會產(chǎn)生預期的結(jié)果:
$ ls
Makefile
$ make ruleB
echo testruleB_Y4Ow
testruleB_Y4Ow
$ ls
Makefile testruleB_Y4Ow
- 3 回答
- 0 關(guān)注
- 603 瀏覽
添加回答
舉報