2011-10-17 37 views
3

我想在編譯期間設置一個變量的值。 我嘗試這樣做,在一個單獨的makefile目標如何從一個makefile運行一個系統調用並將答案保存在一個變量中

svnversion: 
    SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]') 
    $(info svn_rev = $(SVN_REV)) 

我已閱讀,這是設置一個變量的值的方式。 然而,當我運行「讓」我看到:

SVN_REV=613 
svn_rev = 

所以變量似乎是空的。之後,我希望這個變量會在編譯時發生(在其他目標中)。是這樣嗎?或者我應該在svnversion目標中添加一個'export'命令?以及如何解決SVN_REV變量? $(SVN_REV)或$$(SVN_REV)。

謝謝

+0

難道變量是區分大小寫的嗎? –

+0

哪個製造商...? – Kashyap

回答

4

你實際上是分配在在該行的末尾結束的子shell價值SVN_REV,

你可能想要的是:

svnversion:: SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]') 

svnversion: 
     $(info svn_rev = $(SVN_REV)) 

這臺當目標被設置時變量。

如果這不是我們想要的,比如說你想用變量做一些處理,那麼你需要使用線條語義末尾處的可怕的; \來使每一行成爲前一行的延續。如果您隨後引用了shell變量(如第一行中所評估的變量),則需要在變量名稱

(例如,)之前使用$$語法。

svnversion: 
     SVN_REV=$(shell svnversion -cn | sed -e 's/.*://' -e 's/\([0-9]*\).*/\1/' | grep '[0-9]'); \ 
     echo svn_rev = $$SVN_REV 

,而是因爲它在一個外殼,你不能在$(info命令中使用的變量,因爲這需要對象的評價之外。

+0

你能解釋一下'svnversion ::'snipet嗎?這是額外的目標?它何時運行? – nass

+0

當你的目標是'svnversion ::'時,你評估變量SVN_REV – Petesh

+0

這允許像'debug :: CFLAGS + = - g'這樣的機制添加到make中的CFLAGS變量 – Petesh

1

不能在規則中的不同行之間或甚至不同規則之間使用變量。每行都在它自己的shell中執行,所以沒有辦法通過這種方式傳遞信息。 (Petesh說,現在,我只看到)

,如果你需要存儲中間信息,使用的文件是這樣的:

foo: 
     uname -m > current_arch 
     ... 

bar: 
     gcc -m $$(cat current_arch) ... 
     ... 

如果正在執行的命令,您也可以設定一個宏是不是太次-consuming並且不依賴它時,在生成過程被稱爲上:螞蟻

ARCH = $$(uname -m) 

bar: 
     gcc -m $(ARCH) ... 

但這不是設定一個變量,但一個宏替換。調用make bar時傳遞給shell的實際命令是:

  gcc -m $(uname -n) 

然後 uname命令將被執行。

相關問題