2013-01-17 72 views
1

我已經通過示例scons構建這裏,發現他們想提供一個適合我的項目的解決方案。Scons Hierachical構建

的結構如下:

root/ 
    Module_A/ 
     include/ 
     foo.h 
     bar.h 
     src/ 
     foo.cpp 
     bar.cpp 
    Module_.../ 

每個模塊都遵循同樣的結構,所有的.h的一個包含文件夾和CPPS一個src文件。每個模塊構建到一個共享對象中。沒有可執行文件。

模塊具有交叉依賴性。例如Module_A是日誌記錄機制,它用在模塊B,C,D等中。同樣,Module_B是配置加載器,它在其他幾個模塊中使用。而Module_C將成爲IPC模塊,幾乎用於列出的每個模塊中。最後,Module_D是命令中心,並鏈接到每個其他模塊(字面上)。

我有興趣替換當前使用遞歸make構建項目的設置。我正在嘗試構建必要的sconstruct和SConscripts,但我甚至都是新手,更不用說scons了。

我有興趣將每個模塊的.cpp和.h文件轉換爲.so,並且可以像make make一樣自動解決它的依賴關係。

在SConscript中,我目前使用glob來獲取* .cpps,然後在CPPPATH中包含模塊的'./include'。 我用

env.SharedLibrary(CPPATH='./include', source= (list of the cpps))

但由於這依賴於其他模塊,它不會工作,指出正在使用的「未聲明」的其他模塊的功能。

我該如何着手使用分層scons設置來構建這種複雜的結構?

+0

我不明白你的這個說法:「但是因爲這取決於其他模塊,它不會工作,指出正在使用的「未申報的其他模塊的功能「'這是否會因包含依賴項而失效?如果是這樣,那麼它正確指定包含路徑的簡單問題 – Brady

回答

5

這對SCons來說應該很容易。您可能需要在每個模塊的根目錄下有一個SConscript腳本。這些將全部由位於整個項目根部的SConstruct腳本調用。

如果我正確地理解了這個問題,可以通過正確指定所有模塊的包含路徑來解決模塊之間的依賴性問題。這可以在SConstruct中創建的環境中執行一次,然後應該將其傳遞給模塊SConscript腳本。

這裏有一個簡單的例子:

Sconstruct

env = Environment() 

# Notice that the '#' in paths makes the path relative to the root SConstruct 
includePaths = [ 
    '#/Module_A/include', 
    '#/Module_B/include', 
    '#/Module_N/include', 
] 

env.Append(CPPPATH=includePaths) 

SConscript('Module_A/SConscript', exports='env', duplicate=0) 
SConscript('Module_B/SConscript', exports='env', duplicate=0) 
SConscript('Module_N/SConscript', exports='env', duplicate=0) 

Module_A/SConscript

Import('env') 

# Notice the CPPPATH's have already been set on the env created in the SConstruct 
env.SharedLibrary(target = 'moduleA', source = ModuleA_SourceFiles) 

Module_B/SConscript

Import('env') 

# Notice the CPPPATH's have already been set on the env created in the SConstruct 
env.SharedLibrary(target = 'moduleB', source = ModuleB_SourceFiles) 

Module_N/SConscript

Import('env') 

# Notice the CPPPATH's have already been set on the env created in the SConstruct 
env.SharedLibrary(target = 'moduleN', source = ModuleN_SourceFiles) 
+0

這是驚人的,完美的作品。我不知道它可能如此簡單,我過分複雜了很多。我在每個Module目錄中添加了符號鏈接到根目錄中的SConscript,因爲它們完全相同(因爲我使SConscript在* .cpp中搜索Module_X/src目錄)。非常感謝,這是完美的。 – zmartin

+0

@zmartin,很高興幫助。 – Brady