2013-12-17 77 views
6

使用Make recent(v3.81)時,我遇到了一些奇怪的行爲。我可以告訴Make忽略環境變量嗎?

假設我有下面的Makefile:

FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

all: 
    @echo "Hi" 

clean: 
    @echo "Hi again" 

看起來非常簡單夠了吧?值得注意的是,FOOBAR是一個「遞歸擴展變量」,所以在我引用它之前不應該對它進行評估。請注意,我從不參考它。另請注意,nonexistentdirectory不像您所預期的那樣存在。

現在假設我設置在外殼FOOBAR之前我調用make目標:

compy386$ FOOBAR="stuff" make clean 
find: nonexistentdirectory: No such file or directory 
Hi again 

爲什麼FOOBAR正在評估?顯然這與變量在shell中定義的事實有關。我是否應該預計用戶可能在其shell中設置了變量?我在這裏做錯了什麼?!

回答

2

FOOBAR正在評估,因爲您正在運行配方(對於clean)和FOOBAR存在於進入make的環境中。由於FOOBAR在輸入時存在於環境中,因此它將成爲輸出變量,這意味着make將提供它作爲配方中任何程序的環境的一部分。 make不是特例echo;它只是使用你的路徑中找到的那個。它不知道該實用程序是否會引用特定的環境變量,因此它必須導出所有導出的變量,這意味着它必須評估FOOBAR

(對於官方的說法,看到的Variables from the Environment在化妝手冊中的第三款。另請參見上recursive make invocation配方。)

要回答這個直接的問題,你可以告訴make忽略的事實是一個變量來自環境,因此不會將其重新導出:通過導出它:

unexport FOOBAR 
0

=像添加?

FOOBAR ?= $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') 

這將使用環境變量,如果設置和,如果取消設置或空單止評估。

相關問題