2012-01-10 26 views
4

我有一個C++/Python項目,我一直在努力,迄今爲止都依靠Visual Studio來管理構建。現在我想自動化構建過程,希望包括多個平臺支持(這都是標準的C++/Python),並且認爲SCons可以成爲完成這項工作的工具。SCons設置分層源但單個目標

有很多的源文件的參與,在多個目錄,而是一個(立體聲)典型的例子如下:

foo.lib 
    directory_1 
    bar1_1.cpp 
    bar1_2.cpp 
    ... etc. ... 
    directory_2 
    bar2_1.cpp 
    bar2_2.cpp 
    ... etc. ... 

所以,換句話說,源文件是一個層次,但有隻有一個目標。 (該層次結構在代碼中使用的名稱空間中進行匹配,但對於此問題而言,這是多餘的。)

我的問題是:什麼是構建SConstruct和SConscript文件的最佳方式?我閱讀了SCons文檔,特別是Hierarchical Builds部分,以及通過合適的'SConscript'調用使用多個SConscript文件的想法。一切似乎都很清晰,特別整潔。然而,它似乎是用於具有多個目標的層次結構。如果只有一個目標,我可以使用相同的功能嗎?我確實想到了一個頂級的SConstruct/SConscript文件,至少對於所討論的庫來說,列出了所有包含子目錄的源文件,但並沒有「感覺」這是做這件事的最好方式。也許的確如此是前進的方向嗎?)

非常感謝您的任何建議/見解。

回答

0

在一個SConstruct文件中列出所有源文件沒有任何問題。分層構建SConscripts也不錯,但你需要從每一層返回的對象,這將得到一個有點傻:

# SConscript, for example 
sources = ["bar1_1.cpp", "bar1_2.cpp", ...] 
objects = [env.Object(x) for x in sources] 
Return(objects) 

# SConstruct (top-level) 
directory_1_objects = SConscript("directory_1/SConscript") 
directory_2_objects = SConscript("directory_2/SConscript") 
program = env.Program("magical_wonders", [directory_1_objects, directory_2_objects]) 

我個人認爲,在所有的源文件的單個頂級光柵特定的二進制比這更好,當文件層次改變時需要更多的連線。

+0

謝謝!這當然突出顯示了我在文檔中明顯跳過(或誤解)的一個特性。 我的要求源於我想處理的兩種情況: i)選擇性包含某些文件;和ii)爲單個文件指定不同的構建標誌。 經過審查,案件(一)真的是我懶惰的一個例子。現在我只是堅持案例(ii) - 一個示例將禁用特定文件的警告,但不會全局禁用它。(我希望通過在特定的SConscript文件中處理適當的環境來處理這個問題,雖然我可能還沒有進入雜草......) – bitcyber 2012-01-10 22:36:54

4

我有好幾次使用了一個類似於你描述的分層解決方案。我已經選擇這樣一個解決方案:

在SConscript

#/bar/SConscript 
Import("env") 
env = specialize_env_for_this_subpackage() 

myfiles = Glob(*.cpp) 
apply_any_exclusions(myfiles) 
myobjects = env.Object(myfiles) 

Return(myobjects) 

然後在SConstruct:

#SConstruct 
env = construct_general_environment() 

subpackages = ["foo","bar","baz"] #or perhaps call your own find_subproject() function 

objects = SCons.Node.NodeList 
for package in subpackages: 
    pack_objects = env.SConscript(os.path.join(package,"SConscript"), exports = env) 
    objects.extend(pack_objects) 
program = env.Program("myprog",objects) 

Default(program) 

然後,你已微調過每個包中的環境控制,並用巧妙使用* site_scons *文件夾,可以防止每個sconscript重複同樣的行。這種方法的另一個優點是scons文件反映了設計。我還喜歡使用Glob收集cpp文件,允許我按照喜歡的方式添加和刪除文件,而無需編輯任何構建文件以進行此類微不足道的操作。

+0

感謝您的支持!我今晚會嘗試一下,我想這幾乎就是我要找的東西。唯一未解決的問題是更改特定文件的構建標誌(禁用包含第三方庫生成的警告等)。我可以忍受警告,儘管... – bitcyber 2012-01-11 23:30:18

+0

記住要在更改環境時製作一個深層環境副本,否則更改會影響後續包。 env.Clone()將會創建一個好的環境副本。 – daramarak 2012-01-12 15:16:51

+0

是的 - 一個好點!當然,我立即遇到了這個:-)。您的評論確認了我出錯的地方。 – bitcyber 2012-01-12 20:09:41