== FFMPEG ==
[blender.git] / SConstruct
index f226ed4870797e51d078363021f2201165d36992..2cacb91d10342114d1b9ef5d2baf5fbd853b863f 100644 (file)
 #!/usr/bin/env python
-import string
-import os
-import time
+# $Id$
+# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version. The Blender
+# Foundation also sells licenses for use in proprietary software under
+# the Blender License.  See http://www.blender.org/BL/ for information
+# about this.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+# The Original Code is Copyright (C) 2006, Blender Foundation
+# All rights reserved.
+#
+# The Original Code is: all of this file.
+#
+# Contributor(s): Nathan Letwory.
+#
+# ***** END GPL/BL DUAL LICENSE BLOCK *****
+#
+# Main entry-point for the SCons building system
+# Set up some custom actions and target/argument handling
+# Then read all SConscripts and build
+
 import sys
-from distutils import sysconfig
-import SCons.Script
-from tools.scons.bs import *
+import os
+import os.path
+import string
+import shutil
+import glob
+import re
+
+import tools.Blender
+import tools.btools
+import tools.bcolors
+
+BlenderEnvironment = tools.Blender.BlenderEnvironment
+btools = tools.btools
+B = tools.Blender
+
+### globals ###
+platform = sys.platform
+quickie = None
+quickdebug = None
+nsis_build = None
+
+##### BEGIN SETUP #####
+
+B.possible_types = ['core', 'common', 'blender', 'intern',
+                    'international', 'game', 'game2',
+                    'player', 'player2', 'system']
+
+B.binarykind = ['blender' , 'blenderplayer']
+##################################
+# target and argument validation #
+##################################
+# XX cheating for BF_FANCY, we check for BF_FANCY before args are validated
+use_color = ARGUMENTS.get('BF_FANCY', '1')
+if platform=='win32':
+    use_color = None
+
+if not use_color=='1':
+    B.bc.disable()
+    
+ #on defaut white Os X terminal, some colors are totally unlegible
+if platform=='darwin':
+    B.bc.OKGREEN = '\033[34m'
+    B.bc.WARNING = '\033[36m'
+
+# arguments
+print B.bc.HEADER+'Command-line arguments'+B.bc.ENDC
+B.arguments = btools.validate_arguments(ARGUMENTS, B.bc)
+btools.print_arguments(B.arguments, B.bc)
+
+# targets
+print B.bc.HEADER+'Command-line targets'+B.bc.ENDC
+B.targets = btools.validate_targets(COMMAND_LINE_TARGETS, B.bc)
+btools.print_targets(B.targets, B.bc)
+
+##########################
+# setting up environment #
+##########################
+
+# handling cmd line arguments & config file
+
+# first check cmdline for toolset and we create env to work on
+quickie = B.arguments.get('BF_QUICK', None)
+quickdebug = B.arguments.get('BF_QUICKDEBUG', None)
+
+if quickdebug:
+    B.quickdebug=string.split(quickdebug, ',')
+else:
+    B.quickdebug=[]
 
-bs_globals.arguments = ARGUMENTS
+if quickie:
+    B.quickie=string.split(quickie,',')
+else:
+    B.quickie=[]
+    
+toolset = B.arguments.get('BF_TOOLSET', None)
+if toolset:
+    print "Using " + toolset
+    if toolset=='mstoolkit':
+        env = BlenderEnvironment(ENV = os.environ)
+        env.Tool('mstoolkit', ['tools'])
+    else:
+        env = BlenderEnvironment(tools=[toolset], ENV = os.environ)
+        if env:
+            btools.SetupSpawn(env)
+else:
+    env = BlenderEnvironment(ENV = os.environ)
 
-appname = ''
-playername = ''
-config_guess = ''
+if not env:
+    print "Could not create a build environment"
+    Exit()
 
-bs_config.checkPyVersion()
 
-if sys.platform != 'win32':
-       #~ sys.stdout = os.popen("tee build.log", "w")
-       #~ sys.stderr = sys.stdout
-       # guess at the platform, used to maintain the tarball naming scheme
-       config_guess = os.popen("SRCHOME=source/ source/tools/guess/guessconfig").read()[:-1]
-else:
-       config_guess = "windows"
-       
-if sys.platform == 'darwin':
-       appname = 'blender'
-       playername = 'blenderplayer'
-else:
-       appname = 'blender$PROGSUFFIX'
-       playername = 'blenderplayer$PROGSUFFIX'
-
-# Build directory.
-# root_build_dir = '..' + os.sep + 'build' + os.sep + sys.platform + os.sep
-
-bs_config.parseOpts()
-
-# Create the build directory. SCons does this automatically, but since we
-# don't want to put scons-generated .sconsign files in the source tree, but in
-# the root_build_dir, we have to create that dir ourselves before SCons tries
-# to access/create the file containing .sconsign data.
-if os.path.isdir (bs_globals.root_build_dir) == 0:
-       os.makedirs (bs_globals.root_build_dir)
-
-
-# Blender version.
-version='2.34'
-shortversion = '234' # for wininst target -> nsis installer creation
-
-sdl_env = Environment ()
-freetype_env = Environment ()
-env = Environment ()
-
-if sys.platform == 'linux2' or sys.platform == 'linux-i386':
-       use_international = 'false'
-       use_gameengine = 'true'
-       use_openal = 'false'
-       use_fmod = 'false'
-       use_quicktime = 'false'
-       use_sumo = 'true'
-       use_ode = 'false'
-       use_buildinfo = 'true'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'true'
-       build_blender_plugin = 'false'
-       release_flags = ['-O2']
-       debug_flags = ['-O2', '-g']
-       extra_flags = ['-pipe', '-funsigned-char']
-       cxxflags = []
-       defines = []
-       warn_flags = ['-Wall', '-W']
-       window_system = 'X11'
-       platform_libs = ['m', 'util', 'stdc++']
-       platform_libpath = []
-       platform_linkflags = ['-pthread']
-       extra_includes = []
-       # z library information
-       z_lib = ['z']
-       z_libpath = ['/usr/lib']
-       z_include = ['/usr/include']
-       # png library information
-       png_lib = ['png']
-       png_libpath = ['/usr/lib']
-       png_include = ['/usr/include']
-       # jpeg library information
-       jpeg_lib = ['jpeg']
-       jpeg_libpath = ['/usr/lib']
-       jpeg_include = ['/usr/include']
-       # OpenGL library information
-       opengl_lib = ['GL', 'GLU']
-       opengl_static = ['/usr/lib/libGL.a', '/usr/lib/libGLU.a']
-       opengl_libpath = ['/usr/lib', '/usr/X11R6/lib']
-       opengl_include = ['/usr/include']
-       # SDL library information
-       sdl_env.ParseConfig ('sdl-config --cflags --libs')
-       sdl_cflags = sdl_env.Dictionary()['CCFLAGS']
-       sdl_include = sdl_env.Dictionary()['CPPPATH']
-       sdl_libpath = sdl_env.Dictionary()['LIBPATH']
-       sdl_lib = sdl_env.Dictionary()['LIBS']
-       # SOLID library information
-       solid_lib = []                                              # TODO
-       solid_libpath = []                                          # TODO
-       solid_include = ['#extern/solid']
-       qhull_lib = []                                              # TODO
-       qhull_libpath = []                                          # TODO
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = ['ode']
-       ode_libpath = ['#../lib/linux-glibc2.2.5-i386/ode/lib']
-       ode_include = ['#../lib/linux-glibc2.2.5-i386/ode/include']
-       # Python library information
-       python_lib = ['python%d.%d' % sys.version_info[0:2]]
-       python_libpath = [sysconfig.get_python_lib (0, 1) + '/config']
-       python_include = [sysconfig.get_python_inc ()]
-       python_linkflags = Split (sysconfig.get_config_var('LINKFORSHARED'))
-       # International support information
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = ['#../lib/linux-glibc2.2.5-i386/ftgl/lib']
-       ftgl_include = ['#../lib/linux-glibc2.2.5-i386/ftgl/include']
-       freetype_env.ParseConfig ('pkg-config --cflags --libs freetype2 2>/dev/null || freetype-config --cflags --libs 2>/dev/null')
-       freetype_lib = freetype_env.Dictionary()['LIBS']
-       freetype_libpath = freetype_env.Dictionary()['LIBPATH']
-       freetype_include = freetype_env.Dictionary()['CPPPATH']
-       gettext_lib = []
-       gettext_libpath = []
-       gettext_include = []
-       # OpenAL library information
-       openal_lib = ['openal']
-       openal_libpath = ['/usr/lib']
-       openal_include = ['/usr/include']
-
-elif sys.platform == 'darwin':
-       use_international = 'true'
-       use_gameengine = 'true'
-       use_openal = 'true'
-       use_fmod = 'false'
-       use_quicktime = 'true'
-       use_precomp = 'true'
-       use_sumo = 'true'
-       use_ode = 'false'
-       use_buildinfo = 'true'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'true'
-       build_blender_plugin = 'false'
-       # TODO: replace darwin-6.1-powerpc with the actual directiory on the
-       #       build machine
-       # darwin-6.1 is the name of cvs precomp folder
-       # a symbolic link named darwin-X.Y-powerpc must be manually done
-       #for now. X-Y is darwin kernel rev number
-       darwin_precomp = '#../lib/darwin-6.1-powerpc/'
-       fink_path = '/sw/'
-       # TODO : try -mpowerpc -mpowerpc-gopt -mpowerpc-gfxopt optims
-       #           doing actual profiling
-       extra_flags = ['-pipe', '-fPIC', '-funsigned-char', '-ffast-math', '-mpowerpc', '-mtune=G4'] 
-       
-       # , '-malign-natural'] malign is causing problems with jpeg lib but worth a 1-2% speedup
-       #'-force_cpusubtype_ALL', '-mpowerpc-gpopt', 
-       cxxflags = []
-       defines = ['_THREAD_SAFE' ]
-       if use_quicktime == 'true':
-               defines += ['WITH_QUICKTIME']
-       warn_flags = ['-Wall']    # , '-W'
-       release_flags = ['-O2']
-       debug_flags = ['-g']
-       window_system = 'CARBON'
-       # z library information
-       z_lib = ['z']
-       z_libpath = []
-       z_include = []
-       # TODO : add a flag to allow each lib to be build from fink or precomp
-       #        without having to have to specify the path manually in config.opts.    
-       # png library information
-       png_lib = ['libpng']
-       png_libpath = [darwin_precomp + 'png/lib']
-       png_include = [darwin_precomp + 'png/include']
-       # jpeg library information
-       jpeg_lib = ['libjpeg']
-       jpeg_libpath = [darwin_precomp + 'jpeg/lib']
-       jpeg_include = [darwin_precomp + 'jpeg/include']
-       # OpenGL library information
-       opengl_lib = ['GL', 'GLU']
-       opengl_static = []
-       opengl_libpath = []
-       opengl_include = []
-       # SDL specific stuff.
-       sdl_env.ParseConfig ('sdl-config --cflags --libs')
-       sdl_cflags = sdl_env.Dictionary()['CCFLAGS']
-       # Want to use precompiled libraries?
-       if use_precomp == 'true':
-               sdl_include = [darwin_precomp + 'sdl/include']
-               sdl_libpath = [darwin_precomp + 'sdl/lib']
-               sdl_lib = ['libSDL.a']
-       platform_libs = ['stdc++'] 
-       extra_includes = ['/sw/include']
-       platform_libpath = ['/System/Library/Frameworks/OpenGL.framework/Libraries']
-       platform_linkflags = []
-       # SOLID library information
-       solid_lib = []                                          
-       solid_libpath = []                                          
-       solid_include = ['#/extern/solid']
-       qhull_lib = []                                          
-       qhull_libpath = []                                          
-       qhull_include = ['#/extern/qhull/include']
-       # ODE library information
-       ode_lib = ['libode']                                             
-       ode_libpath = [darwin_precomp + 'ode/lib']                                          
-       ode_include = [darwin_precomp + 'ode/include/ode']
-       # Python variables.
-       # TODO : fill vars differently if we are on 10.2 or 10.3
-       # python_lib = ['python%d.%d' % sys.version_info[0:2]]
-       # python_libpath = [sysconfig.get_python_lib (0, 1) + '/config']
-       # python_include = [sysconfig.get_python_inc ()]
-       # python_linkflags = Split (sysconfig.get_config_var('LINKFORSHARED'))
-       python_lib = []
-       python_libpath = ['/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config']
-       python_include = ['/System/Library/Frameworks/Python.framework/Versions/2.3/include/python2.3']
-       python_linkflags = ['-u', '__dummy', '-u', '_PyMac_Error', 
-                                               '-framework', 'System',
-                                               '-framework', 'Python',
-                                               '-framework', 'CoreServices',
-                                               '-framework', 'Foundation',
-                                               '-framework', 'OpenGL']
-       # International stuff
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = [darwin_precomp + 'ftgl/lib']
-       ftgl_include = [darwin_precomp + 'ftgl/include']
-       freetype_lib = ['libfreetype']
-       freetype_libpath = [darwin_precomp + 'freetype/lib']
-       freetype_include = [darwin_precomp + 'freetype/include']
-       gettext_lib = ['libintl']
-       gettext_libpath = [darwin_precomp + 'gettext/lib']
-       gettext_include = [darwin_precomp + 'gettext/include']
-       # OpenAL library information
-       openal_lib = ['libopenal']
-       openal_libpath = [darwin_precomp + 'openal/lib']
-       openal_include = [darwin_precomp + 'openal/include']
-
-elif sys.platform == 'cygwin':
-       use_international = 'false'
-       use_gameengine = 'false'
-       use_openal = 'false'
-       use_fmod = 'false'
-       use_quicktime = 'false'
-       use_sumo = 'false'
-       use_ode = 'false'
-       use_buildinfo = 'false'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'false'
-       build_blender_plugin = 'false'
-       release_flags = ['-O2']
-       debug_flags = ['-O2', '-g']
-       extra_flags = ['-pipe', '-mno-cygwin', '-mwindows', '-funsigned-char']
-       cxxflags = []
-       defines = ['FREE_WINDOWS']
-       warn_flags = ['-Wall', '-Wno-char-subscripts']
-       platform_libs = ['png', 'jpeg', 'netapi32',
-                                        'opengl32', 'glu32', 'winmm',
-                                        'mingw32']
-       platform_libpath = ['/usr/lib/w32api', '/lib/w32api']
-       platform_linkflags = ['-mwindows', '-mno-cygwin', '-mconsole']
-       window_system = 'WIN32'
-       extra_includes = []
-       # z library information
-       z_lib = ['z']
-       z_libpath = ['#../lib/windows/zlib/lib']
-       z_include = ['#../lib/windows/zlib/include']
-       # png library information
-       png_lib = ['png']
-       png_libpath = ['#../lib/windows/png/lib']
-       png_include = ['#../lib/windows/png/include']
-       # jpeg library information
-       jpeg_lib = ['jpeg']
-       jpeg_libpath = ['#../lib/windows/jpeg/lib']
-       jpeg_include = ['#../lib/windows/jpeg/include']
-       # OpenGL library information
-       opengl_lib = ['opengl32', 'glu32']
-       opengl_static = []
-       opengl_libpath = []
-       opengl_include = []
-       # SDL specific stuff.
-       sdl_include = ['#../lib/windows/sdl/include']
-       sdl_libpath = ['#../lib/windows/sdl/lib']
-       sdl_lib = ['SDL']
-       sdl_cflags = []
-       #sdl_cflags = '-DWIN32'
-       # SOLID library information
-       solid_lib = []                                                                                    # TODO
-       solid_libpath = []                                                                                # TODO
-       solid_include = ['#extern/solid']
-       qhull_lib = []                                                                                    # TODO
-       qhull_libpath = []                                                                                # TODO
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = ['ode']
-       ode_libpath = ['#../lib/windows/gcc/ode/lib']
-       ode_include = ['#../lib/windows/gcc/ode/include']
-       # Python library information
-       python_include = ['#../lib/windows/python/include/python2.2']
-       python_libpath = ['#../lib/windows/python/lib']
-       python_lib = ['python22']
-       python_linkflags = []
-       # International stuff
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = ['#../lib/windows/gcc/ftgl/lib']
-       ftgl_include = ['#../lib/windows/gcc/ftgl/include']
-       freetype_lib = ['freetype']
-       freetype_libpath = ['#../lib/windows/gcc/freetype/lib']
-       freetype_include = ['#../lib/windows/gcc/freetype/include']
-       gettext_lib = []
-       gettext_libpath = []
-       gettext_include = []
-       # OpenAL library information
-       openal_lib = []
-       openal_libpath = []
-       openal_include = []
-
-elif sys.platform == 'win32':
-       use_international = 'true'
-       use_gameengine = 'true'
-       use_openal = 'true'
-       use_fmod = 'false'
-       use_quicktime = 'true'
-       use_sumo = 'true'
-       use_ode = 'false'
-       use_buildinfo = 'true'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'true'
-       build_blender_plugin = 'false'
-       release_flags = ['/Og', '/Ot', '/Ob1', '/Op', '/G6']
-       debug_flags = ['/Zi', '/Fr${TARGET.base}.sbr']
-       extra_flags = ['/EHsc', '/J', '/W3', '/Gd', '/MT']
-       cxxflags = []
-       defines = ['WIN32', '_CONSOLE']
-       defines += ['WITH_QUICKTIME']
-       defines += ['_LIB', 'USE_OPENAL']
-       defines += ['FTGL_LIBRARY_STATIC']
-       warn_flags = []
-       platform_libs = [ 'qtmlClient', 'soundsystem',
-                                        'ws2_32', 'dxguid', 'vfw32', 'winmm',
-                                        'iconv', 'kernel32', 'user32', 'gdi32',
-                                        'winspool', 'comdlg32', 'advapi32', 'shell32',
-                                        'ole32', 'oleaut32', 'uuid', 'odbc32', 'odbccp32',
-                                        'libcmt', 'libc']
-       platform_libpath = ['#../lib/windows/iconv/lib',
-                                               '#../lib/windows/QTDevWin/Libraries']
-       platform_linkflags = [
-                                               '/SUBSYSTEM:CONSOLE',
-                                               '/MACHINE:IX86',
-                                               '/ENTRY:mainCRTStartup',
-                                               '/INCREMENTAL:NO',
-                                               '/NODEFAULTLIB:"msvcprt.lib"',
-                                               '/NODEFAULTLIB:"glut32.lib"',
-                                               '/NODEFAULTLIB:"libcd.lib"',
-                                               #'/NODEFAULTLIB:"libc.lib"',
-                                               '/NODEFAULTLIB:"libcpd.lib"',
-                                               '/NODEFAULTLIB:"libcp.lib"',
-                                               '/NODEFAULTLIB:"libcmtd.lib"',
-                                               ]
-       window_system = 'WIN32'
-       extra_includes = []
-       if use_quicktime == 'true':
-               extra_includes += ['#../lib/windows/QTDevWin/CIncludes']
-       # z library information
-       z_lib = ['libz_st']
-       z_libpath = ['#../lib/windows/zlib/lib']
-       z_include = ['#../lib/windows/zlib/include']
-       # png library information
-       png_lib = ['libpng_st']
-       png_libpath = ['#../lib/windows/png/lib']
-       png_include = ['#../lib/windows/png/include']
-       # jpeg library information
-       jpeg_lib = ['libjpeg']
-       jpeg_libpath = ['#../lib/windows/jpeg/lib']
-       jpeg_include = ['#../lib/windows/jpeg/include']
-       # OpenGL library information
-       opengl_lib = ['opengl32', 'glu32']
-       opengl_static = []
-       opengl_libpath = []
-       opengl_include = ['/usr/include']
-       # SDL library information
-       sdl_include = ['#../lib/windows/sdl/include']
-       sdl_libpath = ['#../lib/windows/sdl/lib']
-       sdl_lib = ['SDL']
-       sdl_cflags = []
-       window_system = 'WIN32'
-       # SOLID library information
-       solid_lib = ['extern/solid']
-       solid_libpath = ['#../lib/windows/solid/lib']
-       solid_include = ['#extern/solid']
-       qhull_lib = ['qhull']
-       qhull_libpath = ['#../lib/windows/qhull/lib']
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = []                                                                                            # TODO
-       ode_libpath = ['#../lib/windows/ode/lib']
-       ode_include = ['#../lib/windows/ode/include']
-       # Python lib name
-       python_include = ['#../lib/windows/python/include/python2.3']
-       python_libpath = ['#../lib/windows/python/lib']
-       python_lib = ['python23']
-       python_linkflags = []
-       # International stuff
-       ftgl_lib = ['ftgl_static_ST']
-       ftgl_libpath = ['#../lib/windows/ftgl/lib']
-       ftgl_include = ['#../lib/windows/ftgl/include']
-       freetype_lib = ['freetype2ST']
-       freetype_libpath = ['#../lib/windows/freetype/lib']
-       freetype_include = ['#../lib/windows/freetype/include']
-       gettext_lib = ['gnu_gettext']
-       gettext_libpath = ['#../lib/windows/gettext/lib']
-       gettext_include = ['#../lib/windows/gettext/include']
-       # OpenAL library information
-       openal_lib = ['openal_static']
-       openal_libpath = ['#../lib/windows/openal/lib']
-       openal_include = ['#../lib/windows/openal/include']
-
-elif string.find (sys.platform, 'sunos') != -1:
-       use_international = 'true'
-       use_gameengine = 'false'
-       use_openal = 'false'
-       use_fmod = 'false'
-       use_quicktime = 'false'
-       use_sumo = 'false'
-       use_ode = 'false'
-       use_buildinfo = 'false'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'false'
-       build_blender_plugin = 'false'
-       release_flags = ['-O2']
-       debug_flags = ['-O2', '-g']
-       extra_flags = ['-pipe', '-fPIC', '-funsigned-char', '-DSUN_OGL_NO_VERTEX_MACROS']
-       cxxflags = []
-       defines = []
-       warn_flags = ['-Wall', '-W']
-       window_system = 'X11'
-       platform_libs = ['stdc++', 'dl', 'm']
-       platform_libpath = []
-       platform_linkflags = []
-       extra_includes = []
-       # z library information
-       z_lib = ['z']
-       z_libpath = []
-       z_include = []
-       # png library information
-       png_lib = ['png']
-       png_libpath = []
-       png_include = []
-       # jpeg library information
-       jpeg_lib = ['jpeg']
-       jpeg_libpath = []
-       jpeg_include = []
-       # OpenGL library information
-       opengl_lib = ['GL', 'GLU', 'X11']
-       opengl_static = []
-       opengl_libpath = ['/usr/openwin/include']
-       opengl_include = ['/usr/openwin/lib']
-       # SDL library information
-       sdl_env.ParseConfig ('sdl-config --cflags --libs')
-       sdl_cflags = sdl_env.Dictionary()['CCFLAGS']
-       sdl_include = sdl_env.Dictionary()['CPPPATH']
-       sdl_libpath = sdl_env.Dictionary()['LIBPATH']
-       sdl_lib = sdl_env.Dictionary()['LIBS']
-       # SOLID library information
-       solid_lib = []                                                                                    # TODO
-       solid_libpath = []                                                                                # TODO
-       solid_include = ['#extern/solid']
-       qhull_lib = []                                                                                    # TODO
-       qhull_libpath = []                                                                                # TODO
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = []                                                                                            # TODO
-       ode_libpath = []                                                                                        # TODO
-       ode_include = ['#extern/ode/dist/include/ode']
-       # Python variables.
-       python_lib = ['python%d.%d' % sys.version_info[0:2]]
-       python_libpath = [sysconfig.get_python_lib (0, 1) + '/config']
-       python_include = [sysconfig.get_python_inc ()]
-       python_linkflags = []
-       # International support information
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = ['#../lib/solaris-2.8-sparc/ftgl/lib']
-       ftgl_include = ['#../lib/solaris-2.8-sparc/ftgl/include']
-       freetype_lib = ['freetype']
-       freetype_libpath = ['#../lib/solaris-2.8-sparc/freetype/lib']
-       freetype_include = ['#../lib/solaris-2.8-sparc/freetype/include']
-       gettext_lib = []
-       gettext_libpath = []
-       gettext_include = []
-       # OpenAL library information
-       openal_lib = []
-       openal_libpath = []
-       openal_include = []
-
-elif string.find (sys.platform, 'irix') != -1:
-       use_international = 'false'
-       use_gameengine = 'false'
-       use_openal = 'false'
-       use_fmod = 'false'
-       use_quicktime = 'false'
-       use_sumo = 'false'
-       use_ode = 'false'
-       use_buildinfo = 'false'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'false'
-       build_blender_plugin = 'false'
-       irix_precomp = '#../lib/irix-6.5-mips'
-       extra_flags = ['-n32', '-mips3', '-Xcpluscomm']
-       cxxflags = ['-n32', '-mips3', '-Xcpluscomm', '-LANG:std']
-       cxxflags += ['-LANG:libc_in_namespace_std=off']
-       
-       window_system = 'X11'
-       release_flags = ['-O2', '-OPT:Olimit=0']
-       debug_flags = ['-O2', '-g']
-       defines = []
-       warn_flags = ['-fullwarn', '-woff', '1001,1110,1201,1209,1355,1424,1681,3201']
-       platform_libs = ['movieGL', 'Xmu', 'Xext', 'X11',
-                                        'c', 'm', 'dmedia', 'cl', 'audio',
-                                        'Cio', 'pthread']
-       platform_libpath = ['/usr/lib32/mips3',
-                                               '/lib/freeware/lib32',
-                                               '/usr/lib32']
-       platform_linkflags = ['-mips3', '-n32']
-       extra_includes = ['/usr/freeware/include',
-                                         '/usr/include']
-       # z library information
-       z_lib = ['z']
-       z_libpath = []
-       z_include = []
-       # png library information
-       png_lib = ['png']
-       png_libpath = [irix_precomp + '/png/lib']
-       png_include = [irix_precomp + '/png/include']
-       # jpeg library information
-       jpeg_lib = ['jpeg']
-       jpeg_libpath = [irix_precomp + '/jpeg/lib']
-       jpeg_include = [irix_precomp + '/jpeg/include']
-       # OpenGL library information
-       opengl_lib = ['GL', 'GLU']
-       opengl_static = []
-       opengl_libpath = []
-       opengl_include = []
-       # SDL library information
-       sdl_cflags = []
-       sdl_include = [irix_precomp + '/sdl/include/SDL']
-       sdl_libpath = [irix_precomp + '/sdl/lib']
-       sdl_lib = ['SDL', 'libSDL.a']
-       # SOLID library information
-       solid_lib = []                                                                                    # TODO
-       solid_libpath = []                                                                                # TODO
-       solid_include = [irix_precomp + '/solid/include']
-       qhull_lib = []                                                                                    # TODO
-       qhull_libpath = []                                                                                # TODO
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = []                                                                                            # TODO
-       ode_libpath = []                                                                                        # TODO
-       ode_include = [irix_precomp + '/ode/include']
-       # Python library information
-       python_libpath = [irix_precomp + '/python/lib/python2.2/config']
-       python_include = [irix_precomp + '/python/include/python2.2']
-       python_lib = ['python2.2']
-       python_linkflags = []
-       # International support information
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = [irix_precomp + '/ftgl/lib']
-       ftgl_include = [irix_precomp + '/ftgl/include']
-       freetype_lib = ['freetype']
-       freetype_libpath = [irix_precomp + '/freetype/lib']
-       freetype_include = [irix_precomp + '/freetype/include']
-       gettext_lib = []
-       gettext_libpath = []
-       gettext_include = []
-       # OpenAL library information
-       openal_lib = []
-       openal_libpath = []
-       openal_include = []
-
-elif string.find (sys.platform, 'hp-ux') != -1:
-       window_system = 'X11'
-       defines = []
-
-elif sys.platform=='openbsd3':
-       print "Building for OpenBSD 3.x"
-       use_international = 'false'
-       use_gameengine = 'false'
-       use_openal = 'false'
-       use_fmod = 'false'
-       use_quicktime = 'false'
-       use_sumo = 'false'
-       use_ode = 'false'
-       use_buildinfo = 'true'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'false'
-       build_blender_plugin = 'false'
-       release_flags = ['-O2']
-       debug_flags = ['-O2', '-g']
-       extra_flags = ['-pipe', '-fPIC', '-funsigned-char']
-       cxxflags = []
-       defines = []
-       warn_flags = ['-Wall','-W']
-       window_system = 'X11'
-       platform_libs = ['m', 'stdc++', 'pthread', 'util']
-       platform_libpath = []
-       platform_linkflags = []
-       extra_includes = []
-       z_lib = ['z']
-       z_libpath = ['/usr/lib']
-       z_include = ['/usr/include']
-       # png library information
-       png_lib = ['png']
-       png_libpath = ['/usr/local/lib']
-       png_include = ['/usr/local/include']
-       # jpeg library information
-       jpeg_lib = ['jpeg']
-       jpeg_libpath = ['/usr/local/lib']
-       jpeg_include = ['/usr/local/include']
-       # OpenGL library information
-       opengl_lib = ['GL', 'GLU']
-       opengl_static = ['/usr/lib/libGL.a', '/usr/lib/libGLU.a']
-       opengl_libpath = ['/usr/lib', '/usr/X11R6/lib']
-       opengl_include = ['/usr/X11R6/include/']
-       # SDL library information
-       sdl_env.ParseConfig ('sdl-config --cflags --libs')
-       sdl_cflags = sdl_env.Dictionary()['CCFLAGS']
-       sdl_include = sdl_env.Dictionary()['CPPPATH']
-       sdl_libpath = sdl_env.Dictionary()['LIBPATH']
-       sdl_lib = sdl_env.Dictionary()['LIBS']
-       # SOLID library information
-       solid_lib = []                                   # TODO
-       solid_libpath = []              # TODO
-       solid_include = ['#extern/solid']
-       qhull_lib = []     # TODO
-       qhull_libpath = []  # TODO
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = ['ode']
-       ode_libpath = ['#../lib/linux-glibc2.2.5-i386/ode/lib']
-       ode_include = ['#../lib/linux-glibc2.2.5-i386/ode/include']
-       # Python library information
-       python_lib = ['python%d.%d' % sys.version_info[0:2]]
-       python_libpath = [sysconfig.get_python_lib (0, 1) + '/config']
-       python_include = [sysconfig.get_python_inc ()]
-       python_linkflags = []
-       # International support information
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = ['#../lib/linux-glibc2.2.5-i386/ftgl/lib']
-       ftgl_include = ['#../lib/linux-glibc2.2.5-i386/ftgl/include']
-       freetype_env.ParseConfig('pkg-config --cflags --libs freetype2')
-       freetype_lib = freetype_env.Dictionary()['LIBS']
-       freetype_libpath = freetype_env.Dictionary()['LIBPATH']
-       freetype_include = freetype_env.Dictionary()['CPPPATH']
-       gettext_lib = []
-       gettext_libpath = []
-       gettext_include = []
-       # OpenAL library information
-       openal_lib = ['openal']
-       openal_libpath = ['/usr/lib']
-       openal_include = ['/usr/include']
-       
-elif sys.platform=='freebsd4' or sys.platform=='freebsd5':
-       print "Building for FreeBSD"
-       use_international = 'false'
-       use_gameengine = 'false'
-       use_openal = 'false'
-       use_fmod = 'false'
-       use_quicktime = 'false'
-       use_sumo = 'false'
-       use_ode = 'false'
-       use_buildinfo = 'true'
-       build_blender_dynamic = 'true'
-       build_blender_static = 'false'
-       build_blender_player = 'false'
-       build_blender_plugin = 'false'
-       release_flags = ['-O2']
-       debug_flags = ['-O2', '-g']
-       extra_flags = ['-pipe', '-fPIC', '-funsigned-char']
-       cxxflags = []
-       defines = []
-       warn_flags = ['-Wall','-W']
-       window_system = 'X11'
-       platform_libs = ['m', 'stdc++', 'util']
-       platform_libpath = []
-       platform_linkflags = ['-pthread']
-       extra_includes = []
-       z_lib = ['z']
-       z_libpath = ['/usr/lib']
-       z_include = ['/usr/include']
-       # png library information
-       png_lib = ['png']
-       png_libpath = ['/usr/local/lib']
-       png_include = ['/usr/local/include']
-       # jpeg library information
-       jpeg_lib = ['jpeg']
-       jpeg_libpath = ['/usr/local/lib']
-       jpeg_include = ['/usr/local/include']
-       # OpenGL library information
-       opengl_lib = ['GL', 'GLU']
-       opengl_static = ['/usr/lib/libGL.a', '/usr/lib/libGLU.a']
-       opengl_libpath = ['/usr/lib', '/usr/X11R6/lib']
-       opengl_include = ['/usr/X11R6/include/']
-       # SDL library information
-       sdl_env.ParseConfig ('sdl11-config --cflags --libs')
-       sdl_cflags = sdl_env.Dictionary()['CCFLAGS']
-       sdl_include = sdl_env.Dictionary()['CPPPATH']
-       sdl_libpath = ['/usr/local/include/SDL11']
-       sdl_lib = sdl_env.Dictionary()['LIBS']
-       # SOLID library information
-       solid_lib = []                                   # TODO
-       solid_libpath = []              # TODO
-       solid_include = ['#extern/solid']
-       qhull_lib = []     # TODO
-       qhull_libpath = []  # TODO
-       qhull_include = ['#extern/qhull/include']
-       # ODE library information
-       ode_lib = ['ode']
-       ode_libpath = ['#../lib/linux-glibc2.2.5-i386/ode/lib']
-       ode_include = ['#../lib/linux-glibc2.2.5-i386/ode/include']
-       # Python library information
-       python_lib = ['python%d.%d' % sys.version_info[0:2]]
-       python_libpath = [sysconfig.get_python_lib (0, 1) + '/config']
-       python_include = [sysconfig.get_python_inc ()]
-       python_linkflags = []
-       # International support information
-       ftgl_lib = ['ftgl']
-       ftgl_libpath = ['#../lib/linux-glibc2.2.5-i386/ftgl/lib']
-       ftgl_include = ['#../lib/linux-glibc2.2.5-i386/ftgl/include']
-       freetype_env.ParseConfig('pkg-config --cflags --libs freetype2')
-       freetype_lib = freetype_env.Dictionary()['LIBS']
-       freetype_libpath = freetype_env.Dictionary()['LIBPATH']
-       freetype_include = freetype_env.Dictionary()['CPPPATH']
-       gettext_lib = []
-       gettext_libpath = []
-       gettext_include = []
-       # OpenAL library information
-       openal_lib = ['openal']
-       openal_libpath = ['/usr/lib']
-       openal_include = ['/usr/include']
+cc = B.arguments.get('CC', None)
+cxx = B.arguments.get('CXX', None)
+if cc:
+    env['CC'] = cc
+if cxx:
+    env['CXX'] = cxx
+
+if env['CC'] in ['cl', 'cl.exe'] and sys.platform=='win32':
+    platform = 'win32-vc'
+elif env['CC'] in ['gcc'] and sys.platform=='win32':
+    platform = 'win32-mingw'
+
+env.SConscriptChdir(0)
+
+crossbuild = B.arguments.get('BF_CROSS', None)
+if crossbuild and platform!='win32':
+    platform = 'linuxcross'
 
+env['OURPLATFORM'] = platform
+
+configfile = B.arguments.get('BF_CONFIG', 'config'+os.sep+platform+'-config.py')
+
+if os.path.exists(configfile):
+    print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + configfile
 else:
-       print "Unknown platform %s"%sys.platform
-       exit
-
-#-----------------------------------------------------------------------------
-# End of platform specific section
-#-----------------------------------------------------------------------------
-
-#-----------------------------------------------------------------------------
-# User configurable options to be saved in a config file.
-#-----------------------------------------------------------------------------
-# Checking for an existing config file - use that one if it exists,
-# otherwise create one.
-my_defines = []
-my_ccflags = []
-my_cxxflags = []
-my_ldflags = []
-if os.path.exists (bs_globals.config_file):
-       print "Using config file: " + bs_globals.config_file
+    print B.bc.FAIL + configfile + " doesn't exist" + B.bc.ENDC
+
+if crossbuild and env['PLATFORM'] != 'win32':
+    print B.bc.HEADER+"Preparing for crossbuild"+B.bc.ENDC
+    env.Tool('crossmingw', ['tools'])
+    # todo: determine proper libs/includes etc.
+    # Needed for gui programs, console programs should do without it
+    env.Append(LINKFLAGS=['-mwindows'])
+
+# first read platform config. B.arguments will override
+optfiles = [configfile]
+if os.path.exists('user-config.py'):
+    print B.bc.OKGREEN + "Using config file: " + B.bc.ENDC + 'user-config.py'
+    optfiles += ['user-config.py']
 else:
-       print "Creating new config file: " + bs_globals.config_file
-       env_dict = env.Dictionary()
-       config=open (bs_globals.config_file, 'w')
-       config.write ("# Configuration file containing user definable options.\n")
-       config.write ("VERSION = %r\n"%(version))
-       config.write ("BUILD_BINARY = 'release'\n")
-       config.write ("USE_BUILDINFO = %r\n"%(use_buildinfo))
-       config.write ("BUILD_BLENDER_DYNAMIC = %r\n"%(build_blender_dynamic))
-       config.write ("BUILD_BLENDER_STATIC = %r\n"%(build_blender_static))
-       config.write ("BUILD_BLENDER_PLAYER = %r\n"%(build_blender_player))
-       config.write ("BUILD_BLENDER_PLUGIN = %r\n"%(build_blender_plugin))
-       config.write ("BUILD_DIR = %r\n"%(bs_globals.root_build_dir))
-       
-       config.write ("\n# Extra compiler flags can be defined here.\n")
-       config.write ("DEFINES = %s\n"%(my_defines))
-       config.write ("CCFLAGS = %s\n"%(my_ccflags))
-       config.write ("CXXFLAGS = %s\n"%(my_cxxflags))
-       config.write ("LDFLAGS = %s\n"%(my_ldflags))
-
-       config.write ("USE_INTERNATIONAL = %r\n"%(use_international))
-       config.write ("BUILD_GAMEENGINE = %r\n"%(use_gameengine))
-       if use_ode == 'true':
-               config.write ("USE_PHYSICS = 'ode'\n")
-       else:
-               config.write ("USE_PHYSICS = 'solid'\n")
-       config.write ("USE_OPENAL = %r\n"%(use_openal))
-       config.write ("USE_FMOD = %r\n"%(use_fmod))
-       config.write ("USE_QUICKTIME = %r\n"%(use_quicktime))
-       config.write ("\n# Compiler information.\n")
-       config.write ("HOST_CC = %r\n"%(env_dict['CC']))
-       config.write ("HOST_CXX = %r\n"%(env_dict['CXX']))
-       config.write ("TARGET_CC = %r\n"%(env_dict['CC']))
-       config.write ("TARGET_CXX = %r\n"%(env_dict['CXX']))
-       config.write ("TARGET_AR = %r\n"%(env_dict['AR']))
-       config.write ("PATH = %r\n"%(os.environ['PATH']))
-       config.write ("\n# External library information.\n")
-       config.write ("PLATFORM_LIBS = %r\n"%(platform_libs))
-       config.write ("PLATFORM_LIBPATH = %r\n"%(platform_libpath))
-       config.write ("PLATFORM_LINKFLAGS = %r\n"%(platform_linkflags))
-       config.write ("PYTHON_INCLUDE = %r\n"%(python_include))
-       config.write ("PYTHON_LIBPATH = %r\n"%(python_libpath))
-       config.write ("PYTHON_LIBRARY = %r\n"%(python_lib))
-       config.write ("PYTHON_LINKFLAGS = %r\n"%(python_linkflags))
-       config.write ("SDL_CFLAGS = %r\n"%(sdl_cflags))
-       config.write ("SDL_INCLUDE = %r\n"%(sdl_include))
-       config.write ("SDL_LIBPATH = %r\n"%(sdl_libpath))
-       config.write ("SDL_LIBRARY = %r\n"%(sdl_lib))
-       config.write ("Z_INCLUDE = %r\n"%(z_include))
-       config.write ("Z_LIBPATH = %r\n"%(z_libpath))
-       config.write ("Z_LIBRARY = %r\n"%(z_lib))
-       config.write ("PNG_INCLUDE = %r\n"%(png_include))
-       config.write ("PNG_LIBPATH = %r\n"%(png_libpath))
-       config.write ("PNG_LIBRARY = %r\n"%(png_lib))
-       config.write ("JPEG_INCLUDE = %r\n"%(jpeg_include))
-       config.write ("JPEG_LIBPATH = %r\n"%(jpeg_libpath))
-       config.write ("JPEG_LIBRARY = %r\n"%(jpeg_lib))
-       config.write ("OPENGL_INCLUDE = %r\n"%(opengl_include))
-       config.write ("OPENGL_LIBPATH = %r\n"%(opengl_libpath))
-       config.write ("OPENGL_LIBRARY = %r\n"%(opengl_lib))
-       config.write ("OPENGL_STATIC = %r\n"%(opengl_static))
-       config.write ("\n# The following information is only necessary when you've enabled support for\n")
-       config.write ("# the game engine.\n")
-       config.write ("SOLID_INCLUDE = %r\n"%(solid_include))
-       config.write ("SOLID_LIBPATH = %r\n"%(solid_libpath))
-       config.write ("SOLID_LIBRARY = %r\n"%(solid_lib))
-       config.write ("QHULL_INCLUDE = %r\n"%(qhull_include))
-       config.write ("QHULL_LIBPATH = %r\n"%(qhull_libpath))
-       config.write ("QHULL_LIBRARY = %r\n"%(qhull_lib))
-       config.write ("ODE_INCLUDE = %r\n"%(ode_include))
-       config.write ("ODE_LIBPATH = %r\n"%(ode_libpath))
-       config.write ("ODE_LIBRARY = %r\n"%(ode_lib))
-       config.write ("OPENAL_INCLUDE = %r\n"%(openal_include))
-       config.write ("OPENAL_LIBPATH = %r\n"%(openal_libpath))
-       config.write ("OPENAL_LIBRARY = %r\n"%(openal_lib))
-       config.write ("\n# The following information is only necessary when building with\n")
-       config.write ("# internationalization support.\n");
-       config.write ("FTGL_INCLUDE = %r\n"%(ftgl_include))
-       config.write ("FTGL_LIBPATH = %r\n"%(ftgl_libpath))
-       config.write ("FTGL_LIBRARY = %r\n"%(ftgl_lib))
-       config.write ("FREETYPE_INCLUDE = %r\n"%(freetype_include))
-       config.write ("FREETYPE_LIBPATH = %r\n"%(freetype_libpath))
-       config.write ("FREETYPE_LIBRARY = %r\n"%(freetype_lib))
-       config.write ("GETTEXT_INCLUDE = %r\n"%(gettext_include))
-       config.write ("GETTEXT_LIBPATH = %r\n"%(gettext_libpath))
-       config.write ("GETTEXT_LIBRARY = %r\n"%(gettext_lib))
-       config.close ()
-
-#-----------------------------------------------------------------------------
-# Read the options from the config file and update the various necessary flags
-#-----------------------------------------------------------------------------
-list_opts = []
-user_options = Options (bs_globals.config_file)
-user_options_env = Environment (options = user_options)
-user_options.AddOptions (
-               ('VERSION', 'Blender version', version),
-               (EnumOption ('BUILD_BINARY', 'release',
-                                       'Select a release or debug binary.',
-                                        allowed_values = ('release', 'debug'))),
-               (BoolOption ('USE_BUILDINFO',
-                                       'Set to 1 if you want to add build information.',
-                                       'false')),
-               (BoolOption ('BUILD_BLENDER_DYNAMIC',
-                                       'Set to 1 if you want to build blender with hardware accellerated OpenGL support.',
-                                       'true')),
-               (BoolOption ('BUILD_BLENDER_STATIC',
-                                       'Set to 1 if you want to build blender with software OpenGL support.',
-                                       'false')),
-               (BoolOption ('BUILD_BLENDER_PLAYER',
-                                       'Set to 1 if you want to build the blender player.',
-                                       'false')),
-               (BoolOption ('BUILD_BLENDER_PLUGIN',
-                                       'Set to 1 if you want to build the blender plugin.',
-                                       'false')),
-               ('BUILD_DIR', 'Target directory for intermediate files.',
-                                       bs_globals.root_build_dir),
-               (BoolOption ('USE_INTERNATIONAL',
-                                       'Set to 1 to have international support.',
-                                       'false')),
-               (EnumOption ('USE_PHYSICS', 'solid',
-                                       'Select which physics engine to use.',
-                                       allowed_values = ('ode', 'solid'))),
-               (BoolOption ('BUILD_GAMEENGINE',
-                                       'Set to 1 to build blender with game engine support.',
-                                       'false')),
-               (BoolOption ('USE_OPENAL',
-                                       'Set to 1 to build the game engine with OpenAL support.',
-                                       'false')),
-               (BoolOption ('USE_FMOD',
-                                       'Set to 1 to build the game engine with FMod support.',
-                                       'false')),
-               (BoolOption ('USE_QUICKTIME',
-                                       'Set to 1 to add support for QuickTime.',
-                                       'false')),
-               ('HOST_CC', 'C compiler for the host platfor. This is the same as target platform when not cross compiling.'),
-               ('HOST_CXX', 'C++ compiler for the host platform. This is the same as target platform when not cross compiling.'),
-               ('TARGET_CC', 'C compiler for the target platform.'),
-               ('TARGET_CXX', 'C++ compiler for the target platform.'),
-               ('TARGET_AR', 'Linker command for linking libraries.'),
-               ('PATH', 'Standard search path'),
-               ('PLATFORM_LIBS', 'Platform specific libraries.'),
-               ('PLATFORM_LIBPATH', 'Platform specific library link path.'),
-               ('PLATFORM_LINKFLAGS', 'Platform specific linkflags'),
-               ('PYTHON_INCLUDE', 'Include directory for Python header files.'),
-               ('PYTHON_LIBPATH', 'Library path where the Python lib is located.'),
-               ('PYTHON_LIBRARY', 'Python library name.'),
-               ('PYTHON_LINKFLAGS', 'Python specific linkflags.'),
-               ('SDL_CFLAGS', 'Necessary CFLAGS when using sdl functionality.'),
-               ('SDL_INCLUDE', 'Include directory for SDL header files.'),
-               ('SDL_LIBPATH', 'Library path where the SDL library is located.'),
-               ('SDL_LIBRARY', 'SDL library name.'),
-               ('Z_INCLUDE', 'Include directory for zlib header files.'),
-               ('Z_LIBPATH', 'Library path where the zlib library is located.'),
-               ('Z_LIBRARY', 'Z library name.'),
-               ('PNG_INCLUDE', 'Include directory for png header files.'),
-               ('PNG_LIBPATH', 'Library path where the png library is located.'),
-               ('PNG_LIBRARY', 'png library name.'),
-               ('JPEG_INCLUDE', 'Include directory for jpeg header files.'),
-               ('JPEG_LIBPATH', 'Library path where the jpeg library is located.'),
-               ('JPEG_LIBRARY', 'jpeg library name.'),
-               ('OPENGL_INCLUDE', 'Include directory for OpenGL header files.'),
-               ('OPENGL_LIBPATH', 'Library path where the OpenGL libraries are located.'),
-               ('OPENGL_LIBRARY', 'OpenGL library names.'),
-               ('OPENGL_STATIC', 'Linker flags for static linking of Open GL.'),
-               ('SOLID_INCLUDE', 'Include directory for SOLID header files.'),
-               ('SOLID_LIBPATH', 'Library path where the SOLID library is located.'),
-               ('SOLID_LIBRARY', 'SOLID library name.'),
-               ('QHULL_INCLUDE', 'Include directory for QHULL header files.'),
-               ('QHULL_LIBPATH', 'Library path where the QHULL library is located.'),
-               ('QHULL_LIBRARY', 'QHULL library name.'),
-               ('ODE_INCLUDE', 'Include directory for ODE header files.'),
-               ('ODE_LIBPATH', 'Library path where the ODE library is located.'),
-               ('ODE_LIBRARY', 'ODE library name.'),
-               ('OPENAL_INCLUDE', 'Include directory for OpenAL header files.'),
-               ('OPENAL_LIBPATH', 'Library path where the OpenAL library is located.'),
-               ('OPENAL_LIBRARY', 'OpenAL library name.'),
-               ('FTGL_INCLUDE', 'Include directory for ftgl header files.'),
-               ('FTGL_LIBPATH', 'Library path where the ftgl library is located.'),
-               ('FTGL_LIBRARY', 'ftgl library name.'),
-               ('FREETYPE_INCLUDE', 'Include directory for freetype2 header files.'),
-               ('FREETYPE_LIBPATH', 'Library path where the freetype2 library is located.'),
-               ('FREETYPE_LIBRARY', 'Freetype2 library name.'),
-               ('GETTEXT_INCLUDE', 'Include directory for gettext header files.'),
-               ('GETTEXT_LIBPATH', 'Library path where the gettext library is located.'),
-               ('GETTEXT_LIBRARY', 'gettext library name.'),
-               ('DEFINES', 'Extra Preprocessor defines.'),
-               ('CCFLAGS', 'Extra C Compiler flags.'),
-               ('CXXFLAGS','Extra C++ Compiler flags.'),
-               ('LDFLAGS', 'Extra Linker flags.')
-       )
-user_options.Update (user_options_env)
-user_options_dict = user_options_env.Dictionary()
-Help(user_options.GenerateHelpText(user_options_env))
-bs_globals.root_build_dir = user_options_dict['BUILD_DIR']
-# SET MODULE VARS #
-init_env = Environment()
-
-bs_globals.user_options_dict = user_options_dict
-bs_globals.init_env = init_env
-bs_globals.version = version
-bs_globals.shortversion = shortversion
-bs_globals.appname = appname
-bs_globals.playername = playername
-bs_globals.config_guess = config_guess
-# END SET MODULE VARS #
-
-if user_options_dict['BUILD_GAMEENGINE'] == 1:
-       defines += ['GAMEBLENDER=1']
-       if user_options_dict['USE_PHYSICS'] == 'ode':
-               defines += ['USE_ODE']
-       else:
-               defines += ['USE_SUMO_SOLID']
+    print B.bc.WARNING + 'user-config.py' + " not found, no user overrides" + B.bc.ENDC
+
+opts = btools.read_opts(optfiles, B.arguments)
+opts.Update(env)
+
+# disable elbeem (fluidsim) compilation?
+if env['BF_NO_ELBEEM'] == 1:
+    env['CPPFLAGS'].append('-DDISABLE_ELBEEM')
+    env['CXXFLAGS'].append('-DDISABLE_ELBEEM')
+    env['CCFLAGS'].append('-DDISABLE_ELBEEM')
+
+#check for additional debug libnames
+
+if env.has_key('BF_DEBUG_LIBS'):
+    B.quickdebug += env['BF_DEBUG_LIBS']
+
+printdebug = B.arguments.get('BF_LISTDEBUG', 0)
+
+# see if this linux distro has libalut
+
+if env['OURPLATFORM'] == 'linux2' :
+    if env['WITH_BF_OPENAL']:
+        mylib_test_source_file = """
+        #include "AL/alut.h"
+        int main(int argc, char **argv)
+        {
+            alutGetMajorVersion();
+            return 0;
+        }
+        """
+
+        def CheckFreeAlut(context,env):
+            context.Message( B.bc.OKGREEN + "Linux platform detected:\n  checking for FreeAlut... " + B.bc.ENDC )
+            env['LIBS'] = 'alut'
+            result = context.TryLink(mylib_test_source_file, '.c')
+            context.Result(result)
+            return result
+
+        env2 = env.Copy( LIBPATH = env['BF_OPENAL'] ) 
+        conf = Configure( env2, {'CheckFreeAlut' : CheckFreeAlut}, '.sconf_temp', '/dev/null' )
+        if conf.CheckFreeAlut( env2 ):
+            env['BF_OPENAL_LIB'] += ' alut'
+        del env2
+        for root, dirs, files in os.walk('.sconf_temp', topdown=False):
+            for name in files:
+                os.remove(os.path.join(root, name))
+            for name in dirs:
+                os.rmdir(os.path.join(root, name))
+        os.rmdir(root)
+
+if len(B.quickdebug) > 0 and printdebug != 0:
+    print B.bc.OKGREEN + "Buildings these libs with debug symbols:" + B.bc.ENDC
+    for l in B.quickdebug:
+        print "\t" + l
+
+# check target for blenderplayer. Set WITH_BF_PLAYER if found on cmdline
+if 'blenderplayer' in B.targets:
+    env['WITH_BF_PLAYER'] = True
+
+if 'blendernogame' in B.targets:
+    env['WITH_BF_GAMEENGINE'] = False
+
+# lastly we check for root_build_dir ( we should not do before, otherwise we might do wrong builddir
+#B.root_build_dir = B.arguments.get('BF_BUILDDIR', '..'+os.sep+'build'+os.sep+platform+os.sep)
+B.root_build_dir = env['BF_BUILDDIR']
+env['BUILDDIR'] = B.root_build_dir
+if not B.root_build_dir[-1]==os.sep:
+    B.root_build_dir += os.sep
+    
+# We do a shortcut for clean when no quicklist is given: just delete
+# builddir without reading in SConscripts
+do_clean = None
+if 'clean' in B.targets:
+    do_clean = True
+
+if not quickie and do_clean:
+    if os.path.exists(B.root_build_dir):
+        print B.bc.HEADER+'Cleaning...'+B.bc.ENDC
+        dirs = os.listdir(B.root_build_dir)
+        for dir in dirs:
+            if os.path.isdir(B.root_build_dir + dir) == 1:
+                print "clean dir %s"%(B.root_build_dir+dir)
+                shutil.rmtree(B.root_build_dir+dir)
+        print B.bc.OKGREEN+'...done'+B.bc.ENDC
+    else:
+        print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
+    Exit()
+
+if not os.path.isdir ( B.root_build_dir):
+    os.makedirs ( B.root_build_dir )
+    os.makedirs ( B.root_build_dir + 'source' )
+    os.makedirs ( B.root_build_dir + 'intern' )
+    os.makedirs ( B.root_build_dir + 'extern' )
+    os.makedirs ( B.root_build_dir + 'lib' )
+    os.makedirs ( B.root_build_dir + 'bin' )
+
+Help(opts.GenerateHelpText(env))
+
+# default is new quieter output, but if you need to see the 
+# commands, do 'scons BF_QUIET=0'
+bf_quietoutput = B.arguments.get('BF_QUIET', '1')
+if bf_quietoutput=='1':
+    B.set_quiet_output(env)
 else:
-       defines += ['GAMEBLENDER=0']
-
-if user_options_dict['BUILD_BINARY'] == 'release':
-       cflags = extra_flags + release_flags + warn_flags
-       defines += ['NDEBUG']
+    if toolset=='msvc':
+        B.msvc_hack(env)
+
+print B.bc.HEADER+'Building in '+B.bc.ENDC+B.root_build_dir
+env.SConsignFile(B.root_build_dir+'scons-signatures')
+B.init_lib_dict()
+
+##### END SETUP ##########
+
+Export('env')
+
+BuildDir(B.root_build_dir+'/intern', 'intern', duplicate=0)
+SConscript(B.root_build_dir+'/intern/SConscript')
+BuildDir(B.root_build_dir+'/extern', 'extern', duplicate=0)
+SConscript(B.root_build_dir+'/extern/SConscript')
+BuildDir(B.root_build_dir+'/source', 'source', duplicate=0)
+SConscript(B.root_build_dir+'/source/SConscript')
+
+# now that we have read all SConscripts, we know what
+# libraries will be built. Create list of
+# libraries to give as objects to linking phase
+mainlist = []
+for tp in B.possible_types:
+    if not tp == 'player' and not tp == 'player2':
+        mainlist += B.create_blender_liblist(env, tp)
+
+if B.arguments.get('BF_PRIORITYLIST', '0')=='1':
+    B.propose_priorities()
+
+dobj = B.buildinfo(env, "dynamic") + B.resources
+thestatlibs, thelibincs = B.setup_staticlibs(env)
+thesyslibs = B.setup_syslibs(env)
+
+env.BlenderProg(B.root_build_dir, "blender", dobj + mainlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blender')
+if env['WITH_BF_PLAYER']:
+    playerlist = B.create_blender_liblist(env, 'player')
+    env.BlenderProg(B.root_build_dir, "blenderplayer", dobj + playerlist + thestatlibs, [], thesyslibs, [B.root_build_dir+'/lib'] + thelibincs, 'blenderplayer')
+
+##### Now define some targets
+
+
+#------------ INSTALL
+
+#-- binaries
+blenderinstall = []
+if  env['OURPLATFORM']=='darwin':
+    for prg in B.program_list:
+        bundle = '%s.app' % prg[0]
+        bundledir = os.path.dirname(bundle)
+        for dp, dn, df in os.walk(bundle):
+            if 'CVS' in dn:
+                dn.remove('CVS')
+            if '.svn' in dn:
+                dn.remove('.svn')
+            dir=env['BF_INSTALLDIR']+dp[len(bundledir):]
+            source=[dp+os.sep+f for f in df]
+            blenderinstall.append(env.Install(dir=dir,source=source))
 else:
-       cflags = extra_flags + debug_flags + warn_flags
-       if sys.platform == 'win32':
-               platform_linkflags = ['/DEBUG','/PDB:blender.pdb'] + platform_linkflags
-
-defines += user_options_dict['DEFINES']
-cflags += user_options_dict['CCFLAGS']
-cxxflags += user_options_dict['CXXFLAGS']
-platform_linkflags += user_options_dict['LDFLAGS'] 
-
-user_options_dict['PLATFORM_LINKFLAGS'] = platform_linkflags
-
-#-----------------------------------------------------------------------------
-# Generic library generation environment. This one is the basis for each
-# library.
-#-----------------------------------------------------------------------------
-library_env = env.Copy ()
-library_env.Replace (CC = user_options_dict['TARGET_CC'])
-library_env.Replace (CXX = user_options_dict['TARGET_CXX'])
-library_env.Replace (PATH = user_options_dict['PATH'])
-library_env.Replace (AR = user_options_dict['TARGET_AR'])
-library_env.Append (CCFLAGS = cflags)
-library_env.Append (CXXFLAGS = cxxflags)
-library_env.Append (CPPDEFINES = defines)
-library_env.SConsignFile (bs_globals.root_build_dir+'scons-signatures')
-
-#-----------------------------------------------------------------------------
-# Settings to be exported to other SConscript files
-#-----------------------------------------------------------------------------
-
-if bs_globals.enable_clean==0: # only read SConscripts when not cleaning, this to cut overhead
-       Export ('cflags')
-       Export ('defines')
-       Export ('window_system')
-       Export ('extra_includes')
-       Export ('user_options_dict')
-       Export ('library_env')
-       
-       BuildDir (bs_globals.root_build_dir+'/extern', 'extern', duplicate=0)
-       SConscript (bs_globals.root_build_dir+'extern/SConscript')
-       BuildDir (bs_globals.root_build_dir+'/intern', 'intern', duplicate=0)
-       SConscript (bs_globals.root_build_dir+'intern/SConscript')
-       BuildDir (bs_globals.root_build_dir+'/source', 'source', duplicate=0)
-       SConscript (bs_globals.root_build_dir+'source/SConscript')
-       
-       libpath = (['#'+bs_globals.root_build_dir+'/lib'])
-       
-       link_env = library_env.Copy ()
-       link_env.Append (LIBPATH=libpath)
-
-def buildinfo(env, build_type):
-       """
-       Generate a buildinfo object
-       """
-       build_date = time.strftime ("%Y-%m-%d")
-       build_time = time.strftime ("%H:%M:%S")
-       obj = []
-       if user_options_dict['USE_BUILDINFO'] == 1:
-               if sys.platform=='win32':
-                       build_info_file = open("source/creator/winbuildinfo.h", 'w')
-                       build_info_file.write("char *build_date=\"%s\";\n"%build_date)
-                       build_info_file.write("char *build_time=\"%s\";\n"%build_time)
-                       build_info_file.write("char *build_platform=\"win32\";\n")
-                       build_info_file.write("char *build_type=\"%s\";\n"%build_type)
-                       build_info_file.close()
-                       env.Append (CPPDEFINES = ['NAN_BUILDINFO', 'BUILD_DATE'])
-               else:
-                       env.Append (CPPDEFINES = ['BUILD_TIME=\'"%s"\''%(build_time),
-                                                       'BUILD_DATE=\'"%s"\''%(build_date),
-                                                       'BUILD_TYPE=\'"dynamic"\'',
-                                                       'NAN_BUILDINFO',
-                                                       'BUILD_PLATFORM=\'"%s"\''%(sys.platform)])
-               obj = [env.Object (bs_globals.root_build_dir+'source/creator/%s_buildinfo'%build_type,
-                                               [bs_globals.root_build_dir+'source/creator/buildinfo.c'])]
-       return obj
-
-if bs_globals.enable_clean == 0:
-       if user_options_dict['BUILD_BLENDER_DYNAMIC'] == 1:
-               dy_blender = link_env.Copy ()
-               if sys.platform=='win32':
-                       bs_libs.winblenderres(dy_blender)
-               bs_libs.blender_libs(dy_blender)
-               bs_libs.common_libs(dy_blender)
-               bs_libs.international_libs(dy_blender)
-               bs_libs.ketsji_libs(dy_blender)
-               bs_libs.system_libs(dy_blender)
-               dy_blender.Append (LIBS=user_options_dict['OPENGL_LIBRARY'])
-               dy_blender.Append (LIBPATH=user_options_dict['OPENGL_LIBPATH'])
-               dy_blender.Append (CPPPATH=user_options_dict['OPENGL_INCLUDE'])
-               d_obj = buildinfo(dy_blender, "dynamic")
-               if sys.platform == 'win32':
-                       dy_blender.Program (target='blender',
-                                               source=d_obj + ['source/icons/winblender.res'])
-               else:
-                       if sys.platform == 'cygwin':
-                               dy_blender.Replace (CC='g++')
-                       dy_blender.Program (target='blender', source=d_obj)
-       
-       if user_options_dict['BUILD_BLENDER_STATIC'] == 1:
-               st_blender = link_env.Copy ()
-               if sys.platform=='win32':
-                       bs_libs.winblenderres(st_blender)
-               bs_libs.blender_libs(st_blender)
-               bs_libs.common_libs(st_blender)
-               bs_libs.international_libs(st_blender)
-               bs_libs.ketsji_libs(st_blender)
-               bs_libs.system_libs(st_blender)
-               # The next line is to make sure that the LINKFLAGS are appended at the end
-               # of the link command. This 'trick' is needed because the GL and GLU static
-               # libraries need to be at the end of the command.
-               st_blender.Replace(LINKCOM="$LINK -o $TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $LINKFLAGS")
-               s_obj = buildinfo(st_blender, "static")
-               st_blender.Append (LINKFLAGS=user_options_dict['OPENGL_STATIC'])
-               st_blender.Append (CPPPATH=user_options_dict['OPENGL_INCLUDE'])
-               st_blender.Prepend (LIBPATH=['/usr/lib/opengl/xfree/lib'])
-               st_blender.Program (target='blenderstatic', source=s_obj)
-       
-       if sys.platform=='win32':
-               if user_options_dict['BUILD_BINARY']=='debug':
-                       browser = Environment()
-                       browser_tmp = bs_globals.root_build_dir+'bscmake.tmp'
-                       browser.Command ('blender.bsc', 'blender$PROGSUFFIX',
-                               ['dir /b/s '+bs_globals.root_build_dir+'*.sbr >'+browser_tmp,
-                                'bscmake /nologo /n /oblender.bsc @'+browser_tmp,
-                                'del '+browser_tmp])
-       
-       if user_options_dict['BUILD_BLENDER_PLAYER'] == 1 and user_options_dict['BUILD_GAMEENGINE'] == 1:
-               player_blender = link_env.Copy()
-               bs_libs.player_libs(player_blender)
-               bs_libs.common_libs(player_blender)
-               bs_libs.international_libs(player_blender)
-               bs_libs.ketsji_libs(player_blender)
-               bs_libs.player_libs2(player_blender)
-               bs_libs.system_libs(player_blender)
-               player_blender.Append (LIBS=user_options_dict['OPENGL_LIBRARY'])
-               player_blender.Append (LIBPATH=user_options_dict['OPENGL_LIBPATH'])
-               player_blender.Append (CPPPATH=user_options_dict['OPENGL_INCLUDE'])
-               d_obj = buildinfo(player_blender, "player")
-               if sys.platform == 'win32':
-                       player_blender.Program (target='blenderplayer',
-                                               source=d_obj + ['source/icons/winblender.res'])
-               else:
-                       if sys.platform == 'cygwin':
-                               player_blender.Replace (CC='g++')
-                       player_blender.Program (target='blenderplayer', source=d_obj)
-               if sys.platform=='win32':
-                       if user_options_dict['BUILD_BINARY']=='debug':
-                               browser = Environment()
-                               browser_tmp = bs_globals.root_build_dir+'bscmake.tmp'
-                               browser.Command ('blenderplayer.bsc', 'blenderplayer$PROGSUFFIX',
-                               ['dir /b/s '+bs_globals.root_build_dir+'*.sbr >'+browser_tmp,
-                               'bscmake /nologo /n /oblenderplayer.bsc @'+browser_tmp,
-                               'del '+browser_tmp])
-
-       release_target = env.Alias("release", bs_arc.BlenderRelease(appname))
-       default_target = env.Alias("default", bs_default.BlenderDefault(appname))
-       wininst_target = env.Alias("winist", bs_nsis.BlenderNSIS(appname))
-       if bs_globals.docopy == 1:
-               bincopy_target = env.Alias("bincopy", bs_bincopy.BlenderCopy(appname))
-               
-else: # only clean target to prevent any building
-       clean_target = env.Alias("clean", bs_clean.DoClean(bs_globals.root_build_dir))
-       Default("clean")
-
-if bs_globals.enable_clean == 0: # only set up dependencies when not cleaning
-       if sys.platform == 'darwin':
-               Default("release")
-       else:
-               Default("default")
-
-       if sys.platform == 'win32':
-               if user_options_dict['BUILD_BLENDER_PLAYER'] == 1:
-                       env.Depends(wininst_target, playername)
-               env.Depends(wininst_target, appname)
-       
-       if user_options_dict['BUILD_BLENDER_PLAYER'] == 1:
-               env.Depends(release_target, playername)
-               env.Depends(default_target, playername)
-               if bs_globals.docopy == 1:
-                       env.Depends(bincopy_target, playername)
-       env.Depends(release_target, appname)
-       env.Depends(default_target, appname)
-       if bs_globals.docopy == 1:
-               env.Depends(bincopy_target, appname)
+    blenderinstall = env.Install(dir=env['BF_INSTALLDIR'], source=B.program_list)
+
+#-- .blender
+dotblendlist = []
+dottargetlist = []
+for dp, dn, df in os.walk('bin/.blender'):
+    if 'CVS' in dn:
+        dn.remove('CVS')
+    if '.svn' in dn:
+        dn.remove('.svn')
+    for f in df:
+        dotblendlist.append(dp+os.sep+f)
+        dottargetlist.append(env['BF_INSTALLDIR']+dp[3:]+os.sep+f)
+
+dotblenderinstall = []
+for targetdir,srcfile in zip(dottargetlist, dotblendlist):
+    td, tf = os.path.split(targetdir)
+    dotblenderinstall.append(env.Install(dir=td, source=srcfile))
+
+#-- .blender/scripts
+scriptinstall = []
+scriptpath='release/scripts'
+for dp, dn, df in os.walk(scriptpath):
+    if 'CVS' in dn:
+        dn.remove('CVS')
+    if '.svn' in dn:
+        dn.remove('.svn')
+    dir=env['BF_INSTALLDIR']+'/.blender/scripts'+dp[len(scriptpath):]
+    source=[dp+os.sep+f for f in df]
+    scriptinstall.append(env.Install(dir=dir,source=source))
+
+#-- plugins
+pluglist = []
+plugtargetlist = []
+for tp, tn, tf in os.walk('release/plugins'):
+    if 'CVS' in tn:
+        tn.remove('CVS')
+    if '.svn' in tn:
+        tn.remove('.svn')
+    for f in tf:
+        pluglist.append(tp+os.sep+f)
+        plugtargetlist.append(env['BF_INSTALLDIR']+tp[7:]+os.sep+f)
+
+plugininstall = []
+for targetdir,srcfile in zip(plugtargetlist, pluglist):
+    td, tf = os.path.split(targetdir)
+    plugininstall.append(env.Install(dir=td, source=srcfile))
+
+textlist = []
+texttargetlist = []
+for tp, tn, tf in os.walk('release/text'):
+    if 'CVS' in tn:
+        tn.remove('CVS')
+    if '.svn' in tn:
+        tn.remove('.svn')
+    for f in tf:
+        textlist.append(tp+os.sep+f)
+
+textinstall = env.Install(dir=env['BF_INSTALLDIR'], source=textlist)
+
+allinstall = [blenderinstall, dotblenderinstall, scriptinstall, plugininstall, textinstall]
+
+if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
+    dllsources = ['${LCGDIR}/gettext/lib/gnu_gettext.dll',
+                        '${LCGDIR}/png/lib/libpng.dll',
+                        '#release/windows/extra/python25.zip',
+                        '#release/windows/extra/zlib.pyd',
+                        '${LCGDIR}/sdl/lib/SDL.dll',
+                        '${LCGDIR}/zlib/lib/zlib.dll',
+                        '${LCGDIR}/tiff/lib/libtiff.dll']
+    if env['BF_DEBUG']:
+        dllsources.append('${LCGDIR}/python/lib/${BF_PYTHON_LIB}.dll')
+    else:
+        dllsources.append('${LCGDIR}/python/lib/${BF_PYTHON_LIB}.dll')
+    if env['OURPLATFORM'] == 'win32-mingw':
+        dllsources += ['${LCGDIR}/pthreads/lib/pthreadGC2.dll']
+    else:
+        dllsources += ['${LCGDIR}/pthreads/lib/pthreadVC2.dll']
+    if env['WITH_BF_ICONV']:
+        dllsources += ['${LCGDIR}/iconv/lib/iconv.dll']
+    if env['WITH_BF_FFMPEG']:
+        dllsources += ['${LCGDIR}/ffmpeg/lib/avcodec-51.dll',
+                        '${LCGDIR}/ffmpeg/lib/avformat-51.dll',
+                        '${LCGDIR}/ffmpeg/lib/avutil-49.dll']
+    windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
+    allinstall += windlls
+
+installtarget = env.Alias('install', allinstall)
+bininstalltarget = env.Alias('install-bin', blenderinstall)
+
+nsisaction = env.Action(btools.NSIS_Installer, btools.NSIS_print)
+nsiscmd = env.Command('nsisinstaller', None, nsisaction)
+nsisalias = env.Alias('nsis', nsiscmd)
+
+if env['WITH_BF_PLAYER']:
+    blenderplayer = env.Alias('blenderplayer', B.program_list)
+    Depends(blenderplayer,installtarget)
+
+if not env['WITH_BF_GAMEENGINE']:
+    blendernogame = env.Alias('blendernogame', B.program_list)
+    Depends(blendernogame,installtarget)
+
+Depends(nsiscmd, allinstall)
+
+Default(B.program_list)
+
+if not env['WITHOUT_BF_INSTALL']:
+       Default(installtarget)
+
+#------------ RELEASE
+# TODO: zipup the installation
+
+#------------ BLENDERPLAYER
+# TODO: build stubs and link into blenderplayer
+
+#------------ EPYDOC
+# TODO: run epydoc
+