簡體   English   中英

取消makefile上的環境變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM