在scons中创建SConscript对象

时间:2012-09-29 15:00:36

标签: c++ scons

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

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

您可以使用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文件不是必需的,它们只是帮助更好地组织构建脚本。

答案 1 :(得分:0)

VariantDir不能与SConscturct文件一起使用(可能我错了,但我没有找到任何办法)。 只需使用variant dir创建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)