2014-09-19 74 views
1

今天我面對一個奇怪的SCons行爲。使用SCons添加/刪除數組的奇怪行爲

我的問題是以下(如果有更好的解決方法,我對SCons來說很新): 我的SCons腳本正在構建.cu cuda文件和.cpp C++文件。對於C++文件,我需要-std = C++ 0x標記,因爲我們正在執行C++ 11,但nvcc並不真的喜歡那個標記。

因此,我需要做的是在編譯C++文件時添加臨時標誌,並在編譯cuda文件時將其刪除。

我想是這樣的:

def defaultLibConstructObjs(self,targetName,env,avoided=[]): 
     constructedObjects=[] 
     oldcppflags=env["CPPFLAGS"] 
     print(env["CPPFLAGS"]) 
     for ext in ["cu","c","cpp"]: 
     if ext == "cu": 
       prefix = ext 
      else: 
       prefix = "" 
      if ext == "cpp": 
       env["CPPFLAGS"]+=env["CPPONLYFLAGS"] 
     constructedObjects.append(self.constructObjs(targetName,env,ext,prefix,avoided)) 
     env["CPPFLAGS"]=oldcppflags 
     return constructedObjects 

所以我希望env["CPPFLAGS"]是在每個循環依次不變,但不是每次都是這樣我cpponlyflags-std=c++0x在這種情況下)附加所以我最終與列表中的次數我調用defaultLibConstructObjs -std=c++0x

回答

2

這看起來有點像您不僅是SCons的新手,還有Python。 ;)與

oldcppflags=env["CPPFLAGS"] 

您正在存儲變量中環境的「引用」,但不創建其內容的完整副本。這就是爲什麼你的環境得到反正改變...

關於您的實際問題:更SConsish的辦法是設置在頂層SConstruct兩種環境:

cuda_env = Environment(...) # default, without the offending flags 
std_env = cuda_env.Clone() # create a copy 
std_env.Append(CPPFLAGS=['-std=c++0x']) 

然後,你可以通過這些到您的子文件夾SConscripts(請參閱導出/導入方法),並有使用

cuda_env.Program('foo', Glob('*.cu')) 

,或者

std_env.Library('bar', Glob('*.cpp')) 

就像你需要它一樣。請注意,即使在相同的SConscript中,您如何自由混合由哪個環境創建的文件!在構建環境中不存在文件夾界限,例如自動工具。 祝您的項目好運,如果您有進一步的問題,您可以考慮在[email protected]上訪問SCons用戶郵件列表。

+0

嗨, 你猜對了,我沒有太多的python經驗。我的錯。 如果有人正在用我原來的問題來看這個主題(參考VS副本,這裏是一個有用的鏈接:http://stackoverflow.com/questions/2612802/how-to-clone-or-copy-a-list- in-python) 非常感謝你。 – MisterJ 2014-09-22 07:18:03

+0

編輯:我添加的鏈接中提到的解決方案都沒有工作。這與SCons有關嗎? – MisterJ 2014-09-22 07:26:34

+0

甚至在構建對象後還有一步:if(ext == cpp): env [「CPPFLAGS」] = env [「CPPFLAGS」] [: - 1]' 在我的調試輸出中,當我應該建立cpp文件,我看到std = C++ 0x標誌,但是在實際建造時,它已經消失了......所以我想你的多env解決方案是唯一可行的 – MisterJ 2014-09-22 07:38:08