我在 json 文件中指定了我的项目目标(二进制文件和库)。
我可以毫无问题地为指定目标创建环境。现在我正在尝试支持特定的构建目录。
我对 scons 的了解仍然非常基础,但似乎正确的方法是使用 SConscript 和 VariantDir。但是我已经在 json 中指定了我的目标,并且为每个目标创建一个 SConscript 文件将是多余的(加上维护成本)。
所以我的问题是:是否可以在运行时动态创建一个 SConscript 对象?
提前致谢。
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)
您可以使用VariantDir()函数或作为 SConscript() 调用的一部分指定构建目录。这里讨论了所有不同的选项。考虑到您不想使用多个 SConstruct 文件,您应该只使用 VariantDir() 函数,如此处更详细描述的那样。
这是一个简单的例子:
env = 环境()
# 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 文件不是必需的,它们只是帮助更好地组织构建脚本。