gpt4 book ai didi

c++ - scons搭建环境继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:03 25 4
gpt4 key购买 nike

我在重构基于 scons 的构建系统时遇到了一些问题。我们有一个 C/C++ 源代码树,其中包含几个不同的输出对象(dll、可执行文件、测试可执行文件),以及我们的源文件的某种异构布局(尽管其中大部分位于带有 src/inc/ 的“模块”目录中)目录)。

我对当前设置的最大问题之一是,我们真的希望所有这些构建产品在默认情况下都使用一致的编译器选项构建。我们当前的布局有一个主 SConstruct 文件调用子目录中的许多子 SConscript 文件,然后构建较大构建产品的片段(例如 .a 的)。默认情况下,SConscript() scons 中的函数不会将当前构造环境对象传递或继承给调用的 SConstruct 文件。这意味着目前所有这些子 SConstript 文件都在使用它们自己不同的构造环境。

我试图组合的新布局有一个主构建环境,它与我们需要的所有必要的 CFLAGS 和构建定义一起放在源代码树的根目录下。我希望将此构建环境传递给子 SConscript 文件,以便我知道每个 .c.cpp我们的构建树中的文件正在使用相同的命令行构建。

不过,我不确定如何在 scons 中执行此操作。有 Import()Export()函数,但这些基本上是丑陋的全局变量——调用 SConstruct 文件对子 SConstruct 文件对全局变量 Export() 的处理没有太多控制。 '编辑。有没有什么干净的方法可以将当前构造环境的子 SConscript 文件作为参数,而不让它必须修改它?可能是这样的:

master_env = Environment()
master_env.Append( CXXFLAGS=['-Wall', '-Werror', '-g', '-fPIC', ... ] )

### add other stuff that we want everything to use

SConscript( 'somelibrary/SConstruct', inherited_environment=master_env.Clone() )

### master_env has now been used to build a
### .dll in somelibrary/, but any variations
### made to somelibrary/SConstruct's inherited
### env haven't contaminated master_env

我知道我可以像这样做一些笨拙和粗暴的事情:

clobber_env = Environment()
master_env = Environment()
master_env.Append( CXXFLAGS=['-Wall', '-Werror', '-g', '-fPIC', ... ] )

call_somelibrary_sconstruct( master_env )

def call_somelibrary_sconstruct(env):
param_env = env.Clone()
Export( 'param_env' )
SConstript( 'somelibrary/SConstruct' )

# because we don't want any contamination of our global variable
# between SConscript calls. I'm not even sure if this is necessary
# or does what I think it does because I'm not sure how this ugly
# Export()'d global variable environment works with locals like
# param_env here.
param_env = clobber_env
Export( 'param_env' )

有没有一种优雅的方式来做到这一点?

更新:

所以我又尝试了一些,看起来只要我在主 SConstruct 文件中这样做:

def build_somelib( env ):
Export( env=env.Clone() )
somelib = SConscript( 'somelib/SConscript' )
return somelib

master_env = Environment()
master_env.Append( CXXFLAGS=['-Wall', '-Werror', '-g', '-fPIC', ... ] )

build_somelib( master_env )

然后在somelib/SConscript

Import( 'env' )
env.Append( CXXFLAGS=['-weirdoption1', ... ] )
lib = env.StaticLibrary( 'somelib', source=['source1.cpp', 'source2.cpp', ...] )
Return( "lib" )

然后是 master_env在主 SConstruct 中保持未受污染。 Export( env=env.Clone() ) 对我来说很重要之所以工作,是因为我不想依赖所有子 SConscript 来执行安全克隆()操作——该策略应该是父 SConscript/SConstruct 文件。

不过,必须要有 env 还是有点难看作为策略的参数名称。

最佳答案

我所知道的最好的方法是从你的主 SConstruct 那里做到这一点:

env = Environment()

env.SConscript('src/SConscript', 'env')

然后在你的 src/SConscript 文件中:

Import('env')

然后您可以像在 SConstruct 文件中那样引用 env 变量。如果您不想在 src/SConscript 中改变 SConstruct 的环境,请将其放在导入之后:

env = env.Clone()

很确定这就是它的全部内容。

关于c++ - scons搭建环境继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11531218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com