--- SConstruct.orig	Wed May  2 01:54:48 2007
+++ SConstruct	Wed May  2 01:59:33 2007
@@ -1,4 +1,4 @@
-import os, string, sys
+import os, string, sys, commands, fnmatch
 import SCons
 import SCons.Errors
 
@@ -6,7 +6,10 @@
 # Set configuration options
 #
 opts = Options('quake3.conf')
-opts.Add(EnumOption('arch', 'Choose architecture to build for', 'linux-i386', allowed_values=('linux-i386', 'linux-x86_64')))
+opts.Add('CC', 'C compiler')
+opts.Add('CCFLAGS', 'C compiler flags', Split(''))
+opts.Add('CPPPATH', 'Compiler include path', Split(''))
+opts.Add('LIBPATH', 'Linker library path', Split(''))
 opts.Add(EnumOption('warnings', 'Choose warnings level', '1', allowed_values=('0', '1', '2')))
 opts.Add(EnumOption('debug', 'Set to >= 1 to build for debug', '0', allowed_values=('0', '1', '2', '3')))
 opts.Add(EnumOption('optimize', 'Set to >= 1 to build with general optimizations', '2', allowed_values=('0', '1', '2', '3', '4', '5', '6')))
@@ -15,6 +18,7 @@
 opts.Add(BoolOption('lua', 'Set to 1 to compile qagame with Lua scripting support', 0))
 opts.Add(BoolOption('vm', 'Set to 1 to compile engine with virtual machine support', 1))
 opts.Add(BoolOption('smp', 'Set to 1 to compile engine with symetric multiprocessor support', 0))
+opts.Add(BoolOption('gamelibs', 'Set to 1 to compile .so game libraries (cgame, game and ui) when they are not needed (i.e. when "vm" is 1 and supported for current arch)', 0))
 
 #
 # Initialize compiler environment base
@@ -24,15 +28,33 @@
 else:
 	env = Environment(ENV = {'PATH' : os.environ['PATH']}, options = opts)
 
-Help(opts.GenerateHelpText(env))
+	# Some values need to be splitten
+	env['CCFLAGS'] = Split(env['CCFLAGS'])
+	env['CPPPATH'] = Split(env['CPPPATH'])
+	env['LIBPATH'] = Split(env['LIBPATH'])
 
+	# Supported VM architectures (Linux)
+	env['vm_archs'] = ['x86', 'x86_64', 'ppc']
+	env['arch'] = commands.getoutput('uname -m')
+
+	# Equivalent arch names in FreeBSD
+	if fnmatch.fnmatch(sys.platform, 'freebsd*'):
+		vm_archs_freebsd = {'i386' : 'x86', 'amd64' : 'x86_64', 'powerpc' : 'ppc'}
+		if vm_archs_freebsd.has_key(env['arch']):
+			env['arch'] = vm_archs_freebsd[env['arch']]
+
+	# Build game libraries if VM is not supported in current arch
+	if env['vm_archs'].count(env['arch']) == 0 or env['vm'] == 0:
+		env['gamelibs'] = 1
+
+Help(opts.GenerateHelpText(env))
 
 #
 # Set common compiler flags
 #
 print 'compiling for architecture ', env['arch']
 
-env.Append(CCFLAGS = '-pipe -fsigned-char')
+env.Append(CCFLAGS = Split('-pipe -fsigned-char'))
 
 if env['warnings'] == '1':
 	env.Append(CCFLAGS = '-Wall')
@@ -45,7 +67,7 @@
 	env.Append(CCFLAGS = '-DNDEBUG')
 
 if env['optimize'] != '0':
-	env.Append(CCFLAGS = '-O${optimize} -ffast-math -fno-strict-aliasing -funroll-loops')
+	env.Append(CCFLAGS = Split('-O${optimize} -ffast-math -fno-strict-aliasing -funroll-loops'))
 
 if env['simd'] == 'sse':
 	env.Append(CCFLAGS = '-DSIMD_SSE')
@@ -54,15 +76,12 @@
 
 conf = Configure(env)
 
-if sys.platform == 'linux2' or sys.platform == 'linux-i386':
+# The "dl" library is needed on Linux
+if fnmatch.fnmatch(sys.platform, 'linux*'):
 	if not conf.CheckLib('dl', autoadd=0):
 		print 'Did not find libdl.a, exiting!'
 		Exit(1)
 
-if not conf.CheckLib('m', autoadd=0):
-	print 'Did not find libm.a or m.lib, exiting!'
-	Exit(1)
-
 env = conf.Finish()
 
 # Save options
@@ -70,8 +89,10 @@
 
 Export('env')
 
-SConscript('SConscript_quake3-server', build_dir='build/quake3-server', duplicate=0)
 SConscript('SConscript_quake3', build_dir='build/quake3', duplicate=0)
-SConscript('SConscript_cgame', build_dir='build/cgame', duplicate=0)
-SConscript('SConscript_game', build_dir='build/game', duplicate=0)
-SConscript('SConscript_ui', build_dir='build/ui', duplicate=0)
+SConscript('SConscript_quake3-server', build_dir='build/quake3-server', duplicate=0)
+
+if env['gamelibs'] != 0:
+	SConscript('SConscript_cgame', build_dir='build/cgame', duplicate=0)
+	SConscript('SConscript_game', build_dir='build/game', duplicate=0)
+	SConscript('SConscript_ui', build_dir='build/ui', duplicate=0)
