Variant Builds

The BuildDir function now gives us 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 = ARGUMENT.get('OS', Platform())

    include = "#export/$PLATFORM/include"
    lib = "#export/$PLATFORM/lib"
    bin = "#export/$PLATFORM/bin"

    env = Environment(PLATFORM = platform,
                      CPPPATH = [include],
                      LIB = lib,
                      LIBS = '-lworld')

    Export('env')

    SConscript('src/SConscript', build_dir='build/$PLATFORM')

    #
    #BuildDir("#build/$PLATFORM", 'src')
    #SConscript("build/$PLATFORM/hello/SConscript")
    #SConscript("build/$PLATFORM/world/SConscript")
  

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

    $ scons OS=linux
    Install build/linux/world/world.h as export/linux/include/world.h
    cc -Iexport/linux/include -c build/linux/hello/hello.c -o build/linux/hello/hello.o
    cc -Iexport/linux/include -c build/linux/world/world.c -o build/linux/world/world.o
    ar r build/linux/world/libworld.a build/linux/world/world.o
    ar: creating build/linux/world/libworld.a
    ranlib build/linux/world/libworld.a
    Install 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 build/linux/hello/hello as export/linux/bin/hello
  

The same SConstruct file on Windows would build:

    C:\test\>scons OS=linux
    Install build\linux\world\world.h as export\linux\include\world.h
    cl /Iexport\linux\include /Fobuild\linux\hello\hello.obj build\linux\hello\hello.c
    cl /Iexport\linux\include /Fobuild\linux\world\world.obj build\linux\world\world.c
    XXX
    ar r build\linux\world\world.lib build\linux\world\world.obj
    Install build\linux\world\world.lib as export\linux\lib\libworld.a
    link /Fobuild\linux\hello\hello.exe build\linux\hello\hello.obj -Lexport\linux\lib world.lib
    Install build\linux\hello\hello.exe as export\linux\bin\hello.exe
  

    env = Environment(OS = )
    for os in ['newell', 'post']:
        SConscript('src/SConscript', build_dir='build/' + os)
  

    % scons