Chapter 16. Variant Builds

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 a shared directory with separate side-by-side build directories for the Windows and Linux versions of the program.

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


    env.SConscript('src/SConscript', variant_dir='build/$PLATFORM')

This SConstruct file, when run on a Linux system, yields:

    % scons -Q OS=linux
    Install file: "build/linux/world/world.h" as "export/linux/include/world.h"
    cc -o build/linux/hello/hello.o -c -Iexport/linux/include build/linux/hello/hello.c
    cc -o build/linux/world/world.o -c -Iexport/linux/include build/linux/world/world.c
    ar rc build/linux/world/libworld.a build/linux/world/world.o
    ranlib build/linux/world/libworld.a
    Install file: "build/linux/world/libworld.a" as "export/linux/lib/libworld.a"
    cc -o build/linux/hello/hello build/linux/hello/hello.o -Lexport/linux/lib -lworld
    Install file: "build/linux/hello/hello" as "export/linux/bin/hello"

The same SConstruct file on Windows would build:

    C:\>scons -Q OS=windows
    Install file: "build/windows/world/world.h" as "export/windows/include/world.h"
    cl /Fobuild\windows\hello\hello.obj /c build\windows\hello\hello.c /nologo /Iexport\windows\include
    cl /Fobuild\windows\world\world.obj /c build\windows\world\world.c /nologo /Iexport\windows\include
    lib /nologo /OUT:build\windows\world\world.lib build\windows\world\world.obj
    Install file: "build/windows/world/world.lib" as "export/windows/lib/world.lib"
    link /nologo /OUT:build\windows\hello\hello.exe /LIBPATH:export\windows\lib world.lib build\windows\hello\hello.obj
    embedManifestExeCheck(target, source, env)
    Install file: "build/windows/hello/hello.exe" as "export/windows/bin/hello.exe"