读取scons从external.py文件构建变量

时间:2013-11-21 13:52:27

标签: scons

我想在external.py文件中定义scons构建变量,如

external.py

mode=debug
toolchain=x86

我想在SConstruct文件中回读这些变量,该文件位于同一目录中。根据变量值,我想做一些操作!

vars = Variables('external.py')
vars.Add('mode', 'Set the mode for debug or release', 'debug')
if ${RELEASE}=="debug"
   #Do these!
elif ${RELEASE}=="release"
   #Do that!

3 个答案:

答案 0 :(得分:1)

如果external.py包含有效的Python代码,则只需使用import关键字将其导入即可。然后,您可以使用dir函数迭代external模块中定义的名称,并将它们添加到SCons变量中。您可能还想查看getattr函数。

答案 1 :(得分:1)

你缺少的是Scons Environment和你的变量。

vars = Variables('external.py')
vars.Add('mode', 'Set the mode for debug or release', 'debug')

env = Environment(variables = vars)

if env['mode'] == 'debug':
    # do action1
elif env['mode'] == 'release':
    # do action2
else:
    # do action3


您可以阅读有关使用Scons here以及您的问题here

的更多信息

答案 2 :(得分:1)

Soumyajit答案很棒,但我想补充一点,如果您希望能够使用命令行覆盖文件中的值并限制变量的允许值,您可以按照以下步骤操作:

# Build variables are loaded in this order:
# Command Line (ARGUMENTS) >> Config File (external.py) >> Default Value
vars = Variables(files='external.py', args=ARGUMENTS)
vars.Add(EnumVariable('mode', 'Build mode.', 'debug', allowed_values=('debug', 'release')))

env = Environment(variables = vars)

if env['mode'] == 'debug':
    env.Append(CCFLAGS = [ '-g' ])
    # whatever...
else:
    env.Append(CCFLAGS = '-O2')
    # whatever...

您可以调用此scons之类的构建脚本,但也可以通过执行scons mode=release

来覆盖特定变量而无需编辑配置文件

如果您为变量指定了错误值,则会收到来自Scons的错误,如:

$> scons mode=foo
scons: Reading SConscript files ...
scons: *** Invalid value for option mode: foo.  Valid values are: ('debug', 'release')