gallium: Add SCons as alternative build system for Gallium.
diff --git a/SConstruct b/SConstruct
new file mode 100644
index 0000000..db6161e
--- /dev/null
+++ b/SConstruct
@@ -0,0 +1,214 @@
+#######################################################################
+# Top-level SConstruct
+
+import os
+import sys
+
+
+#######################################################################
+# Configuration options
+#
+# For example, invoke scons as 
+#
+#   scons debug=1 dri=0 x86=1
+#
+# to set configuration variables. Or you can write those options to a file
+# named config.py:
+#
+#   # config.py
+#   debug=1
+#   dri=0
+#   x86=1
+# 
+# Invoke
+#
+#   scons -h
+#
+# to get the full list of options. See scons manpage for more info.
+#  
+
+# TODO: auto-detect defaults
+opts = Options('config.py')
+opts.Add(BoolOption('debug', 'build debug version', False))
+opts.Add(BoolOption('dri', 'build dri drivers', False))
+opts.Add(EnumOption('machine', 'use machine-specific assembly code', 'x86',
+                     allowed_values=('generic', 'x86', 'x86-64')))
+
+env = Environment(options = opts)
+Help(opts.GenerateHelpText(env))
+
+# for debugging
+#print env.Dump()
+
+if 1:
+	# platform will be typically 'posix' or 'win32' 
+	platform = env['PLATFORM']
+else:
+	# platform will be one of 'linux', 'freebsd', 'win32', 'darwin', etc.
+	platform = sys.platform
+	if platform == 'linux2':
+		platform = 'linux' 
+
+# replicate options values in local variables
+debug = env['debug']
+dri = env['dri']
+machine = env['machine']
+
+# derived options
+x86 = machine == 'x86'
+gcc = platform == 'posix'
+msvc = platform == 'win32'
+
+Export([
+	'debug', 
+	'x86', 
+	'dri', 
+	'platform',
+	'gcc',
+	'msvc',
+])
+
+
+#######################################################################
+# Environment setup
+#
+# TODO: put the compiler specific settings in seperate files
+# TODO: auto-detect as much as possible
+
+         
+# Optimization flags
+if gcc:
+	if debug:
+		env.Append(CFLAGS = '-O0 -g3')
+		env.Append(CXXFLAGS = '-O0 -g3')
+	else:
+		env.Append(CFLAGS = '-O3 -g3')
+		env.Append(CXXFLAGS = '-O3 -g3')
+
+	env.Append(CFLAGS = '-Wall -Wmissing-prototypes -std=c99 -ffast-math -pedantic')
+	env.Append(CXXFLAGS = '-Wall -pedantic')
+	
+	# Be nice to Eclipse
+	env.Append(CFLAGS = '-fmessage-length=0')
+	env.Append(CXXFLAGS = '-fmessage-length=0')
+
+# Defines
+env.Append(CPPDEFINES = [
+	'_POSIX_SOURCE',
+	('_POSIX_C_SOURCE', '199309L'), 
+	'_SVID_SOURCE',
+	'_BSD_SOURCE', 
+	'_GNU_SOURCE',
+	
+	'PTHREADS',
+	'HAVE_ALIAS', 
+	'HAVE_POSIX_MEMALIGN',
+])
+
+if debug:
+	env.Append(CPPDEFINES = ['DEBUG'])
+else:
+	env.Append(CPPDEFINES = ['NDEBUG'])
+
+
+# Includes
+env.Append(CPPPATH = [
+	'#/include',
+	'#/src/mesa',
+	'#/src/mesa/main',
+	'#/src/mesa/pipe',
+	
+	'/usr/X11R6/include',
+])
+
+
+# x86 assembly
+if x86:
+	env.Append(CPPDEFINES = [
+		'USE_X86_ASM', 
+		'USE_MMX_ASM',
+		'USE_3DNOW_ASM',
+		'USE_SSE_ASM',
+	])
+	if gcc:	
+		env.Append(CFLAGS = '-m32')
+		env.Append(CXXFLAGS = '-m32')
+
+env.Append(LIBPATH = ['/usr/X11R6/lib'])
+
+env.Append(LIBS = [
+	'm',
+	'pthread',
+	'expat',
+	'dl',
+])
+
+# DRI
+if dri:
+	env.ParseConfig('pkg-config --cflags --libs libdrm')
+	env.Append(CPPDEFINES = [
+		('USE_EXTERNAL_DXTN_LIB', '1'), 
+		'IN_DRI_DRIVER',
+		'GLX_DIRECT_RENDERING',
+		'GLX_INDIRECT_RENDERING',
+	])
+
+# libGL
+if 1:
+	env.Append(LIBS = [
+		'X11',
+		'Xext',
+		'Xxf86vm',
+		'Xdamage',
+		'Xfixes',
+	])
+
+Export('env')
+
+
+#######################################################################
+# Convenience Library Builder
+# based on the stock StaticLibrary and SharedLibrary builders
+
+def createConvenienceLibBuilder(env):
+    """This is a utility function that creates the ConvenienceLibrary
+    Builder in an Environment if it is not there already.
+
+    If it is already there, we return the existing one.
+    """
+
+    try:
+        convenience_lib = env['BUILDERS']['ConvenienceLibrary']
+    except KeyError:
+        action_list = [ Action("$ARCOM", "$ARCOMSTR") ]
+        if env.Detect('ranlib'):
+            ranlib_action = Action("$RANLIBCOM", "$RANLIBCOMSTR")
+            action_list.append(ranlib_action)
+
+        convenience_lib = Builder(action = action_list,
+                                  emitter = '$LIBEMITTER',
+                                  prefix = '$LIBPREFIX',
+                                  suffix = '$LIBSUFFIX',
+                                  src_suffix = '$SHOBJSUFFIX',
+                                  src_builder = 'SharedObject')
+        env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
+        env['BUILDERS']['Library'] = convenience_lib
+
+    return convenience_lib
+
+createConvenienceLibBuilder(env)
+
+
+#######################################################################
+# Invoke SConscripts
+
+# Put build output in a separate dir
+# TODO: make build_dir depend on platform and build type (check  
+#       http://www.scons.org/wiki/AdvancedBuildExample for an example)
+build_dir = 'build'
+
+SConscript(
+	'src/mesa/SConscript',
+	build_dir = build_dir,
+	duplicate = 0 # http://www.scons.org/doc/0.97/HTML/scons-user/x2261.html
+)