【问题标题】:creating SConscript objects in scons在 scons 中创建 SConscript 对象
【发布时间】:2012-10-04 14:25:22
【问题描述】:

我在 json 文件中指定了我的项目目标(二进制文件和库)。

我可以毫无问题地为指定目标创建环境。现在我正在尝试支持特定的构建目录。

我对 scons 的了解仍然非常基础,但似乎正确的方法是使用 SConscript 和 VariantDir。但是我已经在 json 中指定了我的目标,并且为每个目标创建一个 SConscript 文件将是多余的(加上维护成本)。

所以我的问题是:是否可以在运行时动态创建 SConscript 对象?

提前致谢。

【问题讨论】:

  • 为什么json文件中指定了目标?要使用 SCons,必须存在 SConstruct 文件,其语法为 Python。 SConscript 文件通常用于子目录层次结构构建。您能否详细说明您的意图并显示示例 json 文件。
  • 嗨布雷迪。我有一个 SConstruct 文件,我在其中根据 json 文件中指定的信息构建 scons 环境。这行得通。关于 json 文件,有两种类型。第一种类型指定平台、工具链等,第二种类型描述模块(二进制或库)、源、依赖项等。想法是您可以为不同的配置文件(平台、构建选项等)构建模块。
  • 我刚刚意识到您在询问有关创建 SConscript 对象的问题。我最初以为您是在询问有关创建动态 SConscript 文件的问题。我更新了答案以反映这一点。

标签: c++ scons


【解决方案1】:

VariantDir 不适用于 SConscturct 文件(可能我错了,但我没有找到任何方法)。 只需使用变体目录创建 SConscript 文件并执行您需要的操作即可。

#SConsruct
env = CreateEnvironment()
SConscript('SConscript', variant_dir = 'mybuilddir', exports = 'env', duplicate = 0)

# Do all work in SConscript
Import('env')
env.Program(...)
env.SharedLibrary(...)
...

此外,您可以将您的流程分为两种状态。 状态 1 - 生成的 SConscript 文件。 状态 2 - 运行生成的 SConscript 文件。

if 'generate' in COMMAND_LINE_TARGETS:
  # your code to generated SConscript from json
  Exit(0)

sconscriptFiles = getSconscriptFiles() # some code to get your sconscript, by mask for example
if len(sconscriptFiles) < 1:
    print "You need to generate files at first: scons generate"
    Exit(1)
for file in sconscriptFiles :
   SConscript(file, variant_dir = 'build' + file, duplicate = 0)

【讨论】:

    【解决方案2】:

    您可以使用 VariantDir() 函数或作为 SConscript() 调用的一部分指定构建目录。 here 讨论了所有不同的选项。考虑到您不想使用多个 SConstruct 文件,您应该只使用 VariantDir() 函数,如更详细的描述 here

    这是一个简单的例子:

        env = Environment()

    # It may be as simple as setting src_dir='.', but set accordingly
    # duplicate=0 tells SCons NOT to copy source files to variantDir, set accordingly
    # VariantDir() can be called multiple times so as to change dirs per builder call
    VariantDir(variant_dir = 'pathToBuildDir', src_dir = 'pathToSource', duplicate=0)
    # Now call the builders here
    

    仍然不清楚为什么要将 json 与 SCons 混合使用。除非您有一些非常令人信服的理由这样做,否则我建议将其全部保存在 SCons 中,即 Python。

    编辑:我刚刚意识到你问的是创建一个 SConscript 对象,而不是一个文件。

    我查看了 SCons 编程 API 并没有找到任何可以让您创建 SConscript 对象的东西。其实我不认为有 SConscript 对象的概念,因为它只是把对 SConscript() 函数的调用当作需要打开和处理的文件,几乎被当作 SConstruct 的扩展。

    因此,总结一下:您要么必须创建附属的 SConscript 文件,要么使用对 VariantDir() 的调用。根据您的项目目录结构,可能不需要创建 SConscript 文件。你可以从根 SConstruct 做所有事情。 SConscript 文件不是必需的,它们只是帮助更好地组织构建脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多