我做到这一点的构建多平台(而非调试/发布),但概念是相同的。其基本思路是你需要项目根目录中的两个文件 - 一个SConstruct来设置构建目录(或者scons中已知的“变体目录”),然后是描述实际构建步骤的SConscript。
在SConstruct文件你指定variant目录及其对应的源目录:
SConscript(dirs='.',
variant_dir=variant_dir,
duplicate=False,
exports="env")
现在你要variant_dir依赖的标志。你会使用AddOption或Variables来做到这一点。下面是一个完整的顶级SConstruct的一个例子做到这一点:
# build with `scons --debug-build` for debug.
AddOption(
'--debug-build',
action='store_true',
help='debug build',
default=False)
env = Environment()
if GetOption('debug_build'):
env.ParseFlags('-DDEBUG')
variant_dir = 'build/debug'
else:
variant_dir = 'build/release'
SConscript(dirs='.',
variant_dir=variant_dir,
duplicate=False,
exports="env")
AddOption是最容易使用的,但是如果你使用的变量,那么你可以缓存运行之间的结果,而不必拼出“scons的 - 每次构建“。
所有目录设置和关联的cruft位于SConstruct中。现在SConscript文件非常简单,根本不需要担心构建目录。
Import('env')
env.Program(target='foo_prog', source=['foo/main.cpp', 'lib/libmoo.a'])
# foo_prog since foo already exists as the name of the directory...
这是关于最简单的方法,我发现设置不同的生成目录没有得到奇怪的错误。它也非常灵活 - 只需修改顶层脚本中的“env”,就可以添加不同的平台构建,而无需更改构建的实际内容。
在你的问题的作品只有扳手是直接从SCons的编译autoconf的风格项目的方式。最简单的方法可能是使用一些Command()调用,但SCons喜欢了解每个步骤的输入和输出,所以这可能会变得怪异。此外,您必须依赖具有正确VPATH设置的autoconf构建 - 如果您尝试在源树之外进行编译,则某些项目不起作用。无论如何,这是一种编译autoconf的项目将是这样的:
import os
Import('env')
# get the path to the configure script from the "moo" source directory
conf = env.File('moo/configure').srcnode().abspath
# Create the "moo" build directory in the build dir
build_dir = env.Dir('.').path
moo_dir = os.path.join(build_dir, 'moo')
Mkdir(moo_dir)
# run configure from within the moo dir
env.Command('moo/Makefile', 'moo/Makefile.am',
conf, chdir=moo_dir)
# run make in the moo dir
env.Command('moo/libmoo.a', 'moo/Makefile',
'make', chdir=moo_dir)
env.Program(target='foo_prog', source=['foo/main.cpp', 'moo/libmoo.a'])
运行从源目录配置阶段,而当前的工作目录是某处在构建层次是尴尬。 make步骤不太麻烦,但仍需要了解当前的构建目录。由于您将“libmoo.a”指定为make step的输出,并将libmoo.a指定为程序的输入,所有依赖项Just Work,所以并行构建工作正常。并行构建只有在你太依赖依赖的时候才会崩溃。
一种方法是将选项传递给scons。 scons不支持命令行选项,尽管看起来你不能使用简短的表单。然后有两个版本的一切取决于该标志是否存在。 –