Mercurial > fife-parpg
diff SConstruct @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | d2f1e81fbe2c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SConstruct Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,170 @@ +import os, sys +from utils.util_scripts.path import path as upath + +opts = Options('options.py', ARGUMENTS) +opts.Add(BoolOption('debug', 'Build with debuginfos and without optimisations', 1)) +opts.Add(BoolOption('tests', 'Build testcases in unit_tests', 0)) +opts.Add(BoolOption('noengine', 'Prevents building of engine, use e.g. for util/test tweaking', 0)) +opts.Add(BoolOption('opengl', 'Compile OpenGL support', 1)) +opts.Add(EnumOption('script', 'Selects generated scripting language bindings', 'python', allowed_values=('python', 'lua'))) +opts.Add(BoolOption('profile', 'Build with profiling information', 0)) +opts.Add(BoolOption('projectfiles_only', "Creates IDE project files only. If defined, won't build code. " + + "Note that normal builds generate these files also automatically.", 0)) +opts.Add(BoolOption('utils', 'Build utilities', 0)) +opts.Add(BoolOption('ext', 'Build external dependencies', 0)) +opts.Add(BoolOption('docs', "Generates static analysis documentation into doc-folder. If defined, won't build code", 0)) +opts.Add(BoolOption('zip', 'Enable ZIP archive support', 1)) +opts.Add(BoolOption('log', 'Enables logging for the engine', 1)) + +opts.Add(BoolOption('rend_camzone', 'Enables camera zone renderer', 0)) +opts.Add(BoolOption('rend_grid', 'Enables grid renderer', 0)) + +# Platform-specific prefix directories +if sys.platform == 'linux2': + opts.Add(PathOption('PREFIX', 'Directory to install under', '/usr')) + +env = Environment(options = opts, ENV = {'PATH' : os.environ['PATH']}) +env.Replace(SCONS_ROOT_PATH=str(upath('.').abspath())) +rootp = env['SCONS_ROOT_PATH'] + +Help(opts.GenerateHelpText(env)) + +# helper functions +def tryConfigCommand(context, cmd): + ret = context.TryAction(cmd)[0] + context.Result(ret) + if ret: + context.env.ParseConfig(cmd) + return ret + +def importConfig(config): + module = __import__(config) + parts = config.split('.') + for part in parts[1:]: + module = getattr(module, part) + return module + +def getPlatformConfig(): + pathparts = ('build', '%s-config' % sys.platform) + filename = os.path.join(*pathparts) + sconsfilename = '.'.join(pathparts) + if os.path.exists(filename + '.py'): + return importConfig(sconsfilename) + else: + print 'no custom platform-config found (searched: %s.py)' % filename + filename += '-dist' + sconsfilename += '-dist' + if os.path.exists(filename + '.py'): + return importConfig(sconsfilename) + print 'no platform-config found (searched: %s.py)' % filename + Exit(1) + +# custom checks +def checkPKG(context, name): + context.Message('Checking for %s (using pkg-config)... ' % name) + return tryConfigCommand(context, 'pkg-config --libs --cflags \'%s\'' % name) + +def checkConf(context, name): + binary = '%s-config' % name.lower() + context.Message('Checking for %s (using %s)... ' % (name, binary)) + configcall = '%s --libs --cflags' %binary + return tryConfigCommand(context, configcall) + +def checkSimpleLib(context, liblist, header = '', lang = 'c', required = 1): + for lib in liblist: + ret = checkPKG(context, lib) + if ret: + return ret + + ret = checkConf(context, lib) + if ret: + return ret + + if len(header): + ret = conf.CheckLibWithHeader(lib, header, lang) + else: + ret = conf.CheckLib(lib) + + if ret: +# print "ret: " + ret + if not lib in conf.env['LIBS']: + conf.env.Append(LIBS = [lib]) + return ret + + if required: + print 'required lib %s not found :(' % lib + Exit(1) + + return False + +if env['projectfiles_only']: + Export('env') + SConscript(['engine/SConscript']) +elif env['docs']: + _jp = os.path.join + # should prolly be done using scons builders... + try: + print "removing old documentation directories" + upath('doc/doxygen/html').rmtree() + except OSError: + pass + print "generating new doxygen documentation" + os.system('doxygen ' + _jp('doc', 'doxygen', 'doxyfile')) + print "doxygen documentation created succesfully" + +elif env['ext']: + Export('env') + SConscript('ext/SConscript') +else: + platformConfig = getPlatformConfig() + env = platformConfig.initEnvironment(env) + conf = Configure(env, + custom_tests = {'checkConf': checkConf, 'checkPKG': checkPKG, 'checkSimpleLib': checkSimpleLib}, + conf_dir = '#/build/.sconf_temp', + log_file = '#/build/config.log') + + platformConfig.addExtras(conf) + env = conf.Finish() + + if sys.platform == "win32": + env.Append(CPPFLAGS = ['-Wall']) + else: + env.Append(CPPFLAGS = ['-Wall']) # removed old style cast warnings for now (swig creates these) + + if env['debug'] == 1: + env.Append(CPPFLAGS = ['-ggdb', '-O0']) + else: + if os.getenv('CXXFLAGS'): + env.Append(CPPFLAGS = Split(os.environ['CXXFLAGS'])) + else: + env.Append(CPPFLAGS = ['-O2']) + + if env['profile']: + env.Append(CPPFLAGS = ['-pg']) + env.Append(LINKFLAGS = ['-pg']) + + definemap = { + 'opengl': 'HAVE_OPENGL', + 'zip': 'HAVE_ZIP', + 'log': 'LOG_ENABLED', + 'rend_camzone': 'RENDER_CAMZONES', + 'rend_grid': 'RENDER_GRID', + } + for k, v in definemap.items(): + if env[k]: + env.Append(CPPDEFINES = [v]) + + Export('env') + + if not env['noengine']: + SConscript('engine/SConscript') + + env.Append(LIBPATH = ['#/engine']) + + if env['tests']: + SConscript('tests/core_tests/SConscript') + + if env['utils']: + SConscript([str(p) for p in upath('utils').walkfiles('SConscript')]) + +# vim: set filetype=python: