diff --git a/.gitignore b/.gitignore index 1b15a29f..a7e65b00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Build files /bin /build +/scons_build_* # Generated documentation /doxygen_html diff --git a/SConstruct b/SConstruct new file mode 100644 index 00000000..ab37532b --- /dev/null +++ b/SConstruct @@ -0,0 +1,107 @@ +""" SConstruct file fore building Kvazaar with Scons. + +This file defines two targets, x86 and x64, and builds construction +environments for both. + +TODO: +- add debug builds +- whole program optimization for gcc + +""" + +import os +import platform + +Help(""" +Type: 'scons x86' to build a 32-bit release version, + 'scons x64' to build a 64-bit release version. + 'scons x86 x64 -c' to clear all build directories. +""") + + +# Create construction environments for 32 and 64 bit builds. +# Visual studio needs the architecture to be set in this stage. It can not be +# modified later. +env_x86 = Environment( + ASCOM='yasm $ASFLAGS -o $TARGET $SOURCES', + ENV={'PATH': os.environ['PATH']}, # to find yasm on Windows + TARGET_ARCH='x86', # for Visual Studio + ) +env_x64 = Environment( + ASCOM='yasm $ASFLAGS -o $TARGET $SOURCES', + ENV={'PATH': os.environ['PATH']}, # to find yasm on Windows + TARGET_ARCH='amd64', # for Visual Studio + ) + +# YASM flags for different architectures. The object file format and name +# mangling must be the same as used by the C compiler for that OS. +# Indexed by platform.system(). +yasm_flags = { + 'Windows': { + 'x86': '-f win32 -DPREFIX ', + 'x64': '-f win64'}, + 'Darwin': { + 'x86': '-f macho32 -DPREFIX', + 'x64': '-f macho64 -DPREFIX'}, + 'Linux': { # Flags for Unix-like. + 'x86': '-f elf32', + 'x64': '-f elf64'}, + 'all': { # Falgs for all systems. + 'x86': ' -DARCH_X86_64=0 -m x86', + 'x64': ' -DARCH_X86_64=1 -m amd64'}, +} +# Set yasm flags for OS and architecture. +target_yasm_flags = yasm_flags.get(platform.system(), yasm_flags['Linux']) +env_x86.Replace(ASFLAGS=target_yasm_flags['x86']) +env_x64.Replace(ASFLAGS=target_yasm_flags['x64']) +env_x86.Append(ASFLAGS=yasm_flags['all']['x86']) +env_x64.Append(ASFLAGS=yasm_flags['all']['x64']) + + +# Try and deal with all the remaining compiler specific differences that I +# really with scons would handle. +if 'MSVS' in env_x86: + # /MD = multithreaded DLL runtime + # /Ox = full optimization, sets /Ob2, /Og, /Oi, /Ot, /Oy + # /GL = enable whole program optimization + # /LTCG = link time code generation + # /arch:SSE2 = use SSE2 (x86 only) + env_x86.Append( + CCFLAGS='/MD /Ox /GL /arch:SSE2', + LINKFLAGS='/LTCG') + env_x64.Append( + CCFLAGS='/MD /Ox /GL', + LINKFLAGS='/LTCG') + # Linker needs TMP + env_x86['ENV']['TMP'] = os.environ['TMP'] + env_x64['ENV']['TMP'] = os.environ['TMP'] + # VS version uses winsock2 + # We probably should be linking against the dll or just not using winsock. + env_x86.MergeFlags('-lws2_32') + env_x64.MergeFlags('-lws2_32') # ws2_64 isn't found, but 32 works. +else: + # GCC flags + # -m for arch, -O2 for optimization, -lm for math lib + env_x86.MergeFlags('-m32 -O2 -lm') + env_x64.MergeFlags('-m64 -O2 -lm') + + +# Declare build targets. +x86 = SConscript('src/SConscript', + exports={'env': env_x86}, + variant_dir='scons_build_x86', + duplicate=False) +Alias('x86', x86) + +x64 = SConscript('src/SConscript', + exports={'env': env_x64}, + variant_dir='scons_build_x64', + duplicate=False) +Alias('x64', x64) + + +if platform.machine().endswith('64'): + Default(x64) +else: + Default(x86) + diff --git a/src/SConscript b/src/SConscript new file mode 100644 index 00000000..4681f750 --- /dev/null +++ b/src/SConscript @@ -0,0 +1,18 @@ +""" Build Kvazaa +""" + +import os + +Import('env') + +sources = [] +sources += env.Glob('*.c') +sources += env.Glob('extras/*.c') +sources += env.Glob('x86/*.asm') +env.Depends('x86/cpu.asm', 'x86/x86inc.asm') + +prog = env.Program('kvazaar', sources) + +env.Clean(prog, '.') # Remove variant_dir with 'scons -c'. + +Return('prog')