X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=SConstruct;h=abddd6450db8e6f90690bdad95f0ac4c4b69aca4;hb=2fd963388c2dae6a30f82c99b679a73e8bc5917d;hp=c871b8d2140378887d7753e037cb716d728961f7;hpb=79fd8ebfef5a6ad8c00e70cb6862b24b254aab3f;p=supertux.git diff --git a/SConstruct b/SConstruct index c871b8d21..abddd6450 100644 --- a/SConstruct +++ b/SConstruct @@ -1,55 +1,191 @@ # # SConstruct build file. See http://www.scons.org for details. +import os +import glob -# based on a script from chenlee@ustc.edu -def Glob(dirs, pattern = '*' ): - import os, fnmatch - files = [] - for dir in dirs: - for file in os.listdir( Dir(dir).srcnode().abspath ): - if fnmatch.fnmatch(file, pattern) : - files.append( os.path.join( dir, file ) ) - return files - -opts = Options('custom.py') +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', '') -opts.Add('PREFIX', 'Installation prefix', '/usr/local') + +# 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) -conf = Configure(env) - -# TODO check -config apps in the Configure context - -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(CPPPATH = ["#", "#/src", "#/lib"]) -env.Append(CPPDEFINES = \ - {'DATA_PREFIX':"'\"" + env['PREFIX'] + "/share/supertux\"'" , - 'LOCALEDIR' :"'\"" + env['PREFIX'] + "/locales\"'"}) +Help(opts.GenerateHelpText(env)) -env.Append(LIBS = ["supertux"]) -env.Append(LIBPATH=["#"]) +# 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() -build_dir="build/linux" + 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"]) -env.Export(["env", "Glob"]) +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)