# 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)