1

我正在尝试 Scons,但在按我的喜好安排时遇到了问题。我有两个相关的项目,一个带有生产代码,另一个带有测试,其排列方式如下:

  • 根/生产
  • 根/单元测试

我想配置我的构建,以便我可以输入:

  1. scons - 从 Root 构建两者
  2. 来自生产的 scons 仅构建生产代码
  3. 来自 UnitTests 的 scons 仅构建单元测试

现在我该怎么做呢?如果我在根目录有 SConstruct,在生产和单元测试中有 SConscript,我只能从根目录构建。但是,如果我在每个级别都有 SConscript,而 Root 的人在子目录中调用它们:

    # Just call Sconscripts for src and unitTests
    SConscript('production/SConstruct')
    SConscript('unitTests/SConstruct')

然后,虽然它确实按预期构建,但它会吐出大量关于Two different environments were specified for target (...). 在这种情况下,生产和测试之间的构建确实很相似,但是一旦我让 scons 像我想要的那样工作,我就会转向管理一个更大的不一定相关的项目套件。

4

1 回答 1

2

我建议在每个目录中使用一个 SConstruct,并在每个目录中使用一个 SConscript。SConstruct 脚本将简单地调用所有逻辑所在的 SConscripts。像这样的东西:

Root/SConstruct
Root/Production/SConstruct
Root/Production/SConscript
Root/UnitTests/SConstruct
Root/UnitTests/SConscript

每个的内容可能如下:

根/S构造

env = Environment()

# build stuff in this dir

# now call subdir SConscripts
SConscript('Root/Production/SConscript', exports='env')
SConscript('Root/UnitTests/SConscript',  exports='env')

根/生产/SConstruct

env = Environment()

SConscript('SConscript', exports='env')

根/生产/SConscript

# This SConscript will be called either from the Root/SConstruct
# or Root/Production/SConstruct

Import('env')

# Build stuff here

根/单元测试/SConstruct

env = Environment()

SConscript('SConscript', exports='env')

根/单元测试/SConscript

# This SConscript will be called either from the Root/SConstruct
# or Root/UnitTests/SConstruct

Import('env')

# Build stuff here

请注意,SConscript 脚本不会创建Environment(),而是使用从同一目录中的 Root/SConstruct 或 SConstruct 传入的脚本。

还可以考虑将variant_dir参数与SConscript()函数调用一起使用,以将所有构建输出放置在代码目录结构之外的目录结构中。这样做时,还要考虑将duplicate=0参数与SConscript()函数调用一起使用。SConscript 函数在此处此处此处进行了详细说明。

于 2013-06-13T05:32:31.020 回答