[英]Unset an env variable on a makefile
我有一個makefile,它通過首先設置一些變量來運行其他make目標:
make -C somedir/ LE_VAR=/some/other/stuff LE_ANOTHER_VAR=/and/so/on
現在,我需要取消設置LE_VAR (確實取消設置,而不僅僅是用“”覆蓋值)。
有什么辦法可以在GNU Make 3.81上做到嗎?
謝謝!
假設您的makefile包含類似這樣的內容以調用子make:
submake:
$(MAKE)
您需要修改魔術變量MAKEOVERRIDES
,如下所示:
MAKEOVERRIDES := $(filter-out LE_VAR=%,$(MAKEOVERRIDES))
unexport LE_VAR
submake:
$(MAKE)
檢查這個unexport variable
。 從GNU手冊
export variable
export variable-assignment
unexport variable
Tell make whether or not to export a particular variable to child processes
請參閱https://www.gnu.org/software/make/manual/html_node/Quick-Reference.html
非常感謝您的答復,這非常棘手。
執行make並在參數中設置vars時,例如:
make -C le/path install ONEVAR=one OTHERVAR=two
我們在環境上同時擁有ONEVAR和OTHERVAR,子任務由第一個命令運行。 這讓我感到困惑,因為我添加了任務(在le / path處)以執行僅執行以下操作的簡單bash腳本:
echo $ONEVAR
unset ONEVAR
令我驚訝的是,變量$ ONEVAR實際上是“一個”(因此它在env上),而unset實際上清除了它。 但是,在makefile上添加“ echo $(ONEVAR)”仍然會輸出“ one”。這是由於MAKEOVERRIDES所致,實際上,正如對Sub-make傳達選項所建議的那樣:
命令行變量定義確實出現在變量MAKEOVERRIDES中,並且MAKEFLAGS包含對此變量的引用。 如果您確實希望正常傳遞標志,但又不想傳遞命令行變量定義,則可以將MAKEOVERRIDES重置為空,如下所示:MAKEOVERRIDES =
或如MadScientist上面建議的那樣:)
但這還不夠,因為此var仍被傳遞給下面的其他子任務(在這種情況下,一些在本地文件夾中編譯的nodejs模塊,不幸的是,這是phantomjs的js文件和其他一些makefile,使用具有相同名稱的變量(例如$ ONEVAR)。
unexport變量告訴make是否將特定變量導出到子進程。 GNU附錄A快速參考
我所做的是:
DESTDIR_BUFFER=$(DESTDIR)
MAKEOVERRIDES := $(filter-out DESTDIR=%,$(MAKEOVERRIDES))
unexport DESTDIR
然后才安裝npm。
在此任務結束時,我導出了具有DESTDIR_BUFFER值的DESTDIR,所有其他后續任務仍然有效。
非常感謝你的幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.