#
-# A simple SConstruct file.
-# See http://www.scons.org/ for more information about what SCons is and how it
-# may help you... :-)
-# I've never done anything with SCons before. Quite obviously this script is in
-# a non-working state!! Maybe someone with more knowledge of the materia who
-# thinks that SCons might be better suited than make can take over....
-# - Benjamin P. 'litespeed' Jung -
-#
+# SConstruct build file. See http://www.scons.org for details.
+import os
+import glob
+
+class ConfigHeader:
+ def __init__(self):
+ self.defines = { }
+ self.prefix = ""
+ self.postfix = ""
+
+ def SetPrefix(self, prefix):
+ self.prefix = prefix
+
+ def SetPostfix(self, postfix):
+ self.postfix = postfix
+
+ def Define(self, name, value = ""):
+ self.defines[name] = value
+
+ def Save(self, filename):
+ file = open(filename, 'w')
+ file.write("/* %s. Generated by SConstruct */\n" % (filename))
+ file.write("\n")
+ file.write(self.prefix + "\n")
+ for key, value in self.defines.iteritems():
+ file.write("#define %s \"%s\"\n" % (key, value))
+ file.write(self.postfix + "\n")
+ file.close()
+
+def Glob(pattern):
+ path = GetBuildPath('SConscript').replace('SConscript', '')
+
+ result = []
+ for i in glob.glob(path + pattern):
+ result.append(i.replace(path, ''))
+
+ return result
+
+def InstallData(files):
+ for file in files:
+ dir = os.path.dirname(file)
+ destdir = os.path.join(env.subst('$DESTDIR/$APPDATADIR'), dir)
+ env.Install(destdir, file)
+
+def InstallExec(files):
+ for file in files:
+ destfile = env.subst('$DESTDIR/$BINDIR/$PROGRAM_PREFIX') + file + \
+ env.subst('$PROGRAM_POSTFIX')
+ env.InstallAs(destfile, file)
+
+# thanks to Michael P Jung
+def CheckSDLConfig(context, minVersion):
+ context.Message('Checking for sdl-config >= %s... ' % minVersion)
+ from popen2 import Popen3
+ p = Popen3(['sdl-config', '--version'])
+ ret = p.wait()
+ out = p.fromchild.readlines()
+ if ret != 0:
+ context.Result(False)
+ return False
+ if len(out) != 1:
+ # unable to parse output!
+ context.Result(False)
+ return False
+ # TODO validate output and catch exceptions
+ version = map(int, out[0].strip().split('.'))
+ minVersion = map(int, minVersion.split('.'))
+ # TODO comparing versions that way only works for pure numeric version
+ # numbers and fails for custom extensions. I don't care about this at
+ # the moment as sdl-config never used such version numbers afaik.
+ ret = (version >= minVersion)
+ context.Result(ret)
+ return ret
+
+# User configurable options
+opts = Options('build_config.py')
+opts.Add('CXX', 'The C++ compiler', 'g++')
+opts.Add('CXXFLAGS', 'Additional C++ compiler flags', '')
+opts.Add('CPPPATH', 'Additional preprocessor paths', '')
+opts.Add('CPPFLAGS', 'Additional preprocessor flags', '')
+opts.Add('CPPDEFINES', 'defined constants', '')
+opts.Add('LIBPATH', 'Additional library paths', '')
+opts.Add('LIBS', 'Additional libraries', '')
+
+# installation path options
+opts.Add('PREFIX', 'prefix for architecture-independent files', '/usr/local')
+opts.Add('EPREFIX', 'prefix for architecture-dependent files', '$PREFIX')
+opts.Add('BINDIR', 'user executables directory', '$EPREFIX/bin')
+#opts.Add('SBINDIR', 'system admin executables directory', '$EPREFIX/sbin')
+#opts.Add('LIBEXECDIR', 'program executables directory', '$EPREFIX/libexec')
+opts.Add('DATADIR', 'read-only architecture-independent data directory',
+ '$PREFIX/share')
+#opts.Add('SYSCONFDIR', 'read-only single-machine data directory', '$PREFIX/etc')
+#opts.Add('SHAREDSTATEDIR', 'modifiable architecture-independent data directory',
+# '$PREFIX/com')
+#opts.Add('LOCALSTATEDIR', 'modifiable single-machine data directory',
+# '$PREFIX/var')
+opts.Add('LIBDIR', 'object code libraries directory', '$EPREFIX/lib')
+opts.Add('INCLUDEDIR', 'C header files directory', '$PREFIX/include')
+#opts.Add('OLDINCLUDEDIR', 'C header files for non-gcc directory',
+# '$PREFIX/include')
+#opts.Add('INFODIR', 'info documentation directory', '$PREFIX/info')
+#opts.Add('MANDIR', 'man documentation directory', '$PREFIX/man')
+opts.Add('DESTDIR', \
+ 'destination directory for installation. It is prepended to PREFIX', '')
+
+# misc options
+opts.Add('PROGRAM_PREFIX', 'prepend PREFIX to installed program names', '')
+opts.Add('PROGRAM_SUFFIX', 'append SUFFIX to installed program names', '')
+opts.Add(EnumOption('VARIANT', 'Build variant', 'optimize',
+ ['optimize', 'debug', 'profile']))
+
+env = Environment(options = opts)
+Help(opts.GenerateHelpText(env))
+
+# Package options
+env['PACKAGE_NAME'] = 'SuperTux'
+env['PACKAGE_VERSION'] = '0.2-cvs'
+env['PACKAGE_BUGREPORT'] = 'supertux-devel@lists.sourceforge.net'
+env['PACKAGE'] = env['PACKAGE_NAME'].lower()
+env['PACKAGE_STRING'] = env['PACKAGE_NAME'] + " " + env['PACKAGE_VERSION']
+
+# directories
+env['APPDATADIR'] = "$DATADIR/$PACKAGE"
+env['LOCALEDIR'] = "$DATADIR/locale"
+
+
+# Create build_config.py and config.h
+if not os.path.exists("build_config.py") or not os.path.exists("config.h"):
+ print "build_config.py or config.h don't exist - Generating new build config..."
+
+ header = ConfigHeader()
+ header.Define("PACKAGE", env['PACKAGE'])
+ header.Define("PACKAGE_NAME", env['PACKAGE_NAME'])
+ header.Define("PACKAGE_VERSION", env['PACKAGE_VERSION'])
+ header.Define("PACKAGE_BUGREPORT", env['PACKAGE_BUGREPORT'])
+ header.Define("PACKAGE_STRING", env['PACKAGE_STRING'])
+
+ conf = Configure(env, custom_tests = {
+ 'CheckSDLConfig' : CheckSDLConfig
+ })
+ if not conf.CheckSDLConfig('1.2.4'):
+ print "Couldn't find libSDL >= 1.2.4"
+ Exit(1)
+ if not conf.CheckLib('SDL_mixer'):
+ print "Couldn't find SDL_mixer library!"
+ Exit(1)
+ if not conf.CheckLib('SDL_image'):
+ print "Couldn't find SDL_image library!"
+ Exit(1)
+ if not conf.CheckLib('GL'):
+ print "Couldn't find OpenGL library!"
+ Exit(1)
+
+ env = conf.Finish()
+
+ env.ParseConfig('sdl-config --cflags --libs')
+ env.Append(CPPDEFINES = \
+ {'DATA_PREFIX':"'\"" + env.subst('$APPDATADIR') + "\"'" ,
+ 'LOCALEDIR' :"'\"" + env.subst('$LOCALEDIR') + "\"'"})
+ opts.Save("build_config.py", env)
+ header.Save("config.h")
+else:
+ print "Using build_config.py"
+
+if env['VARIANT'] == "optimize":
+ env.Append(CXXFLAGS = "-O2 -g -Wall")
+elif env['VARIANT'] == "debug":
+ env.Append(CXXFLAGS = "-O0 -g3 -Wall -Werror")
+ env.Append(CPPDEFINES = { "DEBUG":"1" })
+elif env['VARIANT'] == "profile":
+ env.Append(CXXFLAGS = "-pg -O2")
+
+build_dir="build/" + env['PLATFORM'] + "/" + env['VARIANT']
+
+# create some install aliases (only add paths here that are really used)
+env.Alias('install-data', env.subst('$DESTDIR/$APPDATADIR'))
+env.Alias('install-exec', env.subst('$DESTDIR/$BINDIR'))
+env.Alias('install', ['install-data', 'install-exec'])
+# append some include dirs and link libsupertux with main app
+env.Append(CPPPATH = ["#", "#/src", "#/lib"])
+env.Append(LIBS = ["supertux"])
+env.Append(LIBPATH=["#" + build_dir + "/lib"])
-# TODO: such a static entry is obviously not what we want.
-# Using 'sdl-config --prefix' to obtain parameters would be muuuuuch
-# better.
-SDL_INCLUDE_PATH='/usr/include/SDL'
-
-libsupertux_src=[
- 'lib/app/globals.cpp',
- 'lib/app/setup.cpp',
- 'lib/audio/musicref.cpp',
- 'lib/audio/sound_manager.cpp',
- 'lib/gui/button.cpp',
- 'lib/gui/menu.cpp',
- 'lib/gui/mousecursor.cpp',
- 'lib/math/physic.cpp',
- 'lib/math/vector.cpp',
- 'lib/special/game_object.cpp',
- 'lib/special/moving_object.cpp',
- 'lib/special/sprite.cpp',
- 'lib/special/sprite_manager.cpp',
- 'lib/special/timer.cpp',
- 'lib/special/frame_rate.cpp',
- 'lib/utils/configfile.cpp',
- 'lib/utils/lispreader.cpp',
- 'lib/utils/lispwriter.cpp',
- 'lib/video/drawing_context.cpp',
- 'lib/video/font.cpp',
- 'lib/video/screen.cpp',
- 'lib/video/surface.cpp'
-]
-
-supertux_src=[
- 'src/background.cpp',
- 'src/badguy.cpp',
- 'src/badguy_specs.cpp',
- 'src/bitmask.cpp',
- 'src/camera.cpp',
- 'src/collision.cpp',
- 'src/door.cpp',
- 'src/gameloop.cpp',
- 'src/gameobjs.cpp',
- 'src/high_scores.cpp',
- 'src/interactive_object.cpp',
- 'src/intro.cpp',
- 'src/level.cpp',
- 'src/level_subset.cpp',
- 'src/leveleditor.cpp',
- 'src/misc.cpp',
- 'src/particlesystem.cpp',
- 'src/player.cpp',
- 'src/resources.cpp',
- 'src/scene.cpp',
- 'src/sector.cpp',
- 'src/special.cpp',
- 'src/statistics.cpp',
- 'src/supertux.cpp',
- 'src/tile.cpp'
- 'src/tile_manager.cpp',
- 'src/tilemap.cpp',
- 'src/title.cpp',
- 'src/worldmap.cpp'
-]
-
-SharedLibrary(
- target="lib/supertux",
- source=libsupertux_src,
- CPPPATH=SDL_INCLUDE_PATH
-)
-
-Program(
- target="src/supertux",
- source=supertux_src,
- CPPPATH=[SDL_INCLUDE_PATH, 'lib', '.'],
- LIBS='lib/libsupertux'
-)
+env.Export(["env", "Glob", "InstallData", "InstallExec"])
+env.SConscript("lib/SConscript", build_dir=build_dir + "/lib", duplicate=0)
+env.SConscript("src/SConscript", build_dir=build_dir + "/src", duplicate=0)
+env.SConscript("data/SConscript", build_dir=build_dir + "/data", duplicate=0)
+env.SConscript("SConscript", build_dir=build_dir, duplicate=0)