python

您所在的位置:网站首页 sconscript和sconstruct的区别 python

python

2024-07-16 02:08| 来源: 网络整理| 查看: 265

我需要使用 scons 为大型项目生成发布和调试版本。对于发布和调试版本,它都会生成共享和静态库。构建后目录结构应如下所示:

project_dir/ |_ src |_ include |_ lib |_ lib_rel |_ lib_dbg |_ dll |_ dll_rel |_ dll_dbg

我怎样才能实现符合上述要求的 SConstruct 和 SConscript?

SConstruct 实现:

env = Environment() relEnv = env.clone(CCFLAGS = ['-O3', '-pthread')] dbgEnv = env.clone(CCFLAGS = ['-O0', '-g', '-pthread')] SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : relEnv}, variant_dir = 'lib_rel', duplicate = 0) SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : dbgEnv}, variant_dir = 'lib_dbg', duplicate = 0)

src/SConscript 实现:

Import('env') src_list = Glob('*.cpp') inc_list = ['dir_1/include', 'dir_2/include', 'common/include'] env.SharedLibrary(target = 'foo', source = src_list, CPP_PATH=inc_list) env.StaticLibrary(target = 'foo', source = src_list, CPP_PATH=inc_list)

使用上面的实现,它可以在 lib_rel 文件夹中生成共享库和静态库以及相关的目标文件,有没有什么方法可以使用变体目录,对于 SharedLibrary,它使用目标目录作为 {dll/lib_rel , dll/lib_dbg} 对于 StaticLibrary 方法,它使用 variant_dir 作为 {lib/lib_rel, lib/lib_dbg}

一种可行的方法是为 SharedLibrary 和 StaticLibrary 使用单独的 SConscript。但这是非常典型的,每个库构建器方法需要两个不同的文件。

请为此提出适当的解决方案。

最佳答案

我会将静态性和调试性视为两个维度并调用 SConscript 四次,如下所示:

env = Environment() relEnv = env.Clone(CCFLAGS = ['-O3', '-pthread']) dbgEnv = env.Clone(CCFLAGS = ['-O0', '-g', '-pthread']) SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : relEnv, 'Library' : relEnv.StaticLibrary}, variant_dir = 'lib/lib_rel', duplicate = 0) SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : dbgEnv, 'Library' : dbgEnv.StaticLibrary}, variant_dir = 'lib/lib_dbg', duplicate = 0) SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : relEnv, 'Library' : relEnv.SharedLibrary}, variant_dir = 'dll/dll_rel', duplicate = 0) SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : dbgEnv, 'Library' : dbgEnv.SharedLibrary}, variant_dir = 'dll/dll_dbg', duplicate = 0)

当然,这很丑陋,所以我实际上会使用一个循环:

env = Environment() relEnv = env.Clone(CCFLAGS = ['-O3', '-pthread']) dbgEnv = env.Clone(CCFLAGS = ['-O0', '-g', '-pthread']) for env, envPath in ((relEnv, 'rel'), (dbgEnv, 'dbg')): for lib, libPath in ((env.StaticLibrary, 'lib'), (env.SharedLibrary, 'dll')): SConscript(dirs = 'src', name = 'SConscript', exports = {'env' : env, 'Library' : lib}, variant_dir = '{libPath}/{libPath}_{envPath}'.format(**locals()), duplicate = 0)

SConscript当然需要导入Library:

Import('env', 'Library') src_list = Glob('*.cpp') inc_list = ['dir_1/include', 'dir_2/include', 'common/include'] Library(target = 'foo', source = src_list, CPP_PATH=inc_list)

关于python - SCons:单个 SConscript 文件中的不同 variant_dir,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24299903/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3