我做到這一點的構建多平臺(而非調試/發佈),但概念是相同的。其基本思路是你需要項目根目錄中的兩個文件 - 一個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不支持命令行選項,儘管看起來你不能使用簡短的表單。然後有兩個版本的一切取決於該標誌是否存在。 –