2013-01-17 74 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