%scons; %builders-mod; %functions-mod; %tools-mod; %variables-mod; ]>
Variant Build Examples The &variant_dir; keyword argument of the &SConscript; function provides everything we need to show how easy it is to create variant builds using &SCons;. Suppose, for example, that we want to build a program for both Windows and Linux platforms, but that we want to build it in directory on a network share with separate side-by-side build directories for the Windows and Linux versions of the program. We have to do a little bit of work to construct paths, to make sure unwanted location dependencies don't creep in. The top-relative path reference can be useful here. To avoid writing conditional code based on platform, we can build the variant_dir path dynamically: platform = ARGUMENTS.get('OS', Platform()) include = "#export/$PLATFORM/include" lib = "#export/$PLATFORM/lib" bin = "#export/$PLATFORM/bin" env = Environment( PLATFORM=platform, BINDIR=bin, INCDIR=include, LIBDIR=lib, CPPPATH=[include], LIBPATH=[lib], LIBS='world', ) Export('env') env.SConscript('src/SConscript', variant_dir='build/$PLATFORM') Import('env') SConscript('hello/SConscript') SConscript('world/SConscript') Import('env') hello = env.Program('hello.c') env.Install('$BINDIR', hello) #include "world.h" int main(int argc, char *argv[]) { printf "hello.c\n"; world(); } Import('env') world = env.Library('world.c') env.Install('$LIBDIR', world) env.Install('$INCDIR', 'world.h') #define STRING "world.h" extern int world(); int world() { printf "world.c\n"; } This SConstruct file, when run on a Linux system, yields: scons -Q OS=linux The same SConstruct file on Windows would build: scons -Q OS=windows In order to build several variants at once when using the variant_dir argument to &SConscript;, you can call the function repeatedely - this example does so in a loop. Note that the &f-link-SConscript; trick of passing a list of script files, or a list of source directories, does not work with variant_dir, &SCons; allows only a single &SConscript; to be given if variant_dir is used. env = Environment(OS=ARGUMENTS.get('OS')) for os in ['newell', 'post']: SConscript('src/SConscript', variant_dir='build/' + os)