2010-09-16 129 views
5

我有一個使用SCons(和MinGW/gcc取決於平臺)構建的項目。這個項目取決於其他幾個庫(我們稱它們爲libfoolibbar),它們可以安裝在不同的地方供不同的用戶使用。SCons配置文件和默認值

目前,我SConstruct文件嵌入到這些庫硬編碼路徑(比如,是這樣的:C:\libfoo)。現在

,我想配置選項添加到我的SConstruct文件,這樣誰在其他位置安裝libfoo用戶(比如C:\custom_path\libfoo)可以這樣做:

> scons --configure --libfoo-prefix=C:\custom_path\libfoo 

或者:

> scons --configure 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
### Environment configuration ### 
Please enter location of 'libfoo' ("C:\libfoo"): C:\custom_path\libfoo 
Please enter location of 'libbar' ("C:\libfoo"): C:\custom_path\libbar 
### Configuration over ### 

選擇後,應該將這些配置選項寫入某個文件,並在每次運行scons時自動重新讀取。

scons是否提供這樣的機制?我將如何實現這種行爲?我並不完全掌握Python,所以即使是明顯的(但完整的)解決方案也是受歡迎的。

謝謝。

回答

5

SCons有一個名爲「Variables」的功能。你可以設置它,以便它很容易地從命令行參數變量中讀取。所以在你的情況下,你會從命令行做這樣的事情:

scons LIBFOO=C:\custom_path\libfoo 

...並且變量會在運行之間被記住。所以下次你運行scons並且它使用LIBFOO的前一個值。

在代碼中使用它,像這樣:

# read variables from the cache, a user's custom.py file or command line 
# arguments 
var = Variables(['variables.cache', 'custom.py'], ARGUMENTS) 
# add a path variable 
var.AddVariables(PathVariable('LIBFOO', 
     'where the foo library is installed', 
     r'C:\default\libfoo', PathVariable.PathIsDir)) 

env = Environment(variables=var) 
env.Program('test', 'main.c', LIBPATH='$LIBFOO') 

# save variables to a file 
var.Save('variables.cache', env) 

如果你真的想用「 - 」樣式選項,那麼你可以結合以上與AddOption功能,但它是更爲複雜。

This SO question討論了將值從Variables對象中取出而不通過環境傳遞的問題。

+0

謝謝,這似乎有竅門;)是否有另一種方法來獲取變量的值?像'print var.getVariable('LIBFOO')''? – ereOn 2010-09-16 12:32:25

+0

@ereOn我已經搜遍了文檔,但是*沒有*似乎有任何方法可以做到這一點。相當不對稱。您必須將變量放入環境中並將其讀出。如果我知道,我會更新這篇文章。 – richq 2010-09-16 18:40:36