2014-06-16 51 views
0

我有先設置一些變量運行另外一些make目標生成文件:取消設置在生成文件的環境變量

make -C somedir/ LE_VAR=/some/other/stuff LE_ANOTHER_VAR=/and/so/on 

現在我需要取消LE_VAR(真的沒有設置,不僅覆蓋值與「」)。

有什麼辦法可以這麼做GNU Make 3.81

謝謝!

+0

你被允許改變第二個makefile,但不是第一個? – Beta

回答

0

非常感謝您的答覆,這是相當棘手。

當執行令,並在參數設置增值經銷商,如:

make -C le/path install ONEVAR=one OTHERVAR=two 

我們有ONEVAR和OTHERVAR對env和子任務跑了第一個命令。這種困惑我,因爲我添加到任務(在LE /路徑)來執行一個簡單的bash腳本,只做:

echo $ONEVAR 
unset ONEVAR 

而且通過我吃驚的是變量$ ONEVAR竟是「一」(所以它在env上)並且unset實際上清除了它。但是,添加在Makefile文件「回聲$(ONEVAR)」仍然輸出「一」。這是由於MAKEOVERRIDES,而事實上,作爲建議的Communicating Options to a Sub-make

命令行變量的定義真的出現在變量 MAKEOVERRIDES和MAKEFLAGS包含對此變量的引用。如果 你想傳遞國旗降正常,但不希望傳遞下去 在命令行中的變量定義,您可以重置MAKEOVERRIDES到 空的,就像這樣: MAKEOVERRIDES =

或者作爲MadScientist建議以上:)

但是這還不夠,因爲這個var仍然被傳遞給下面的其他子任務(在這種情況下,一些nodejs模塊正在本地文件夾上編譯,並且運氣不好,兩個js文件從phantomjs和其他使用具有相同名稱的變量的其他makefile(例如,$ ONEVAR)。

未導出變量告訴是否將特定的 變量導出到子進程。 GNU Make Appendix A Quick Reference

我所做的是:

DESTDIR_BUFFER=$(DESTDIR) 
MAKEOVERRIDES := $(filter-out DESTDIR=%,$(MAKEOVERRIDES)) 
unexport DESTDIR 

,然後才讓NPM​​安裝。

在此任務結束時,我將DESTDIR導出爲DESTDIR_BUFFER的值,其他所有後續任務仍然有效。

非常感謝您的幫助!

1

假設你的makefile包含像這樣來調用一個子品牌:

submake: 
     $(MAKE) 

您需要修改的神奇變量MAKEOVERRIDES,就像這樣:

MAKEOVERRIDES := $(filter-out LE_VAR=%,$(MAKEOVERRIDES)) 
unexport LE_VAR 

submake: 
     $(MAKE) 
+0

仍然無法正常工作..它是一個var作爲參數傳遞給真正的env變量,還是讓它有另一種處理? – josetapadas

+1

哦,我明白了;您正在運行子版本,並且您希望在調用子版本時從命令行中刪除該變量分配。我以爲你想從環境中刪除這個變量。 make命令行上的變量不是環境變量,它們是make變量。 – MadScientist

+0

是的..我做了一個包裝腳本,做了'未設置'但仍然不工作:S真正的問題是,我有一個子node_module使用同名的var .. – josetapadas