diff options
Diffstat (limited to 'bksys/abakus.py')
-rw-r--r-- | bksys/abakus.py | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/bksys/abakus.py b/bksys/abakus.py new file mode 100644 index 0000000..7b6a20c --- /dev/null +++ b/bksys/abakus.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python + +""" +Run scons -h to display the associated help, or look below .. +""" + +BOLD ="\033[1m" +RED ="\033[91m" +GREEN ="\033[92m" +YELLOW ="\033[1m" #"\033[93m" # unreadable on white backgrounds +CYAN ="\033[96m" +NORMAL ="\033[0m" + +def exists(env): + return true + +def printColorCoded(msg): + msg = msg.replace(']', NORMAL) + msg = msg.replace('b[', BOLD) + msg = msg.replace('g[', GREEN) + msg = msg.replace('r[', RED) + msg = msg.replace('c[', CYAN) + msg = msg.replace('y[', YELLOW) + + print msg + +def generate(env): + import SCons.Util, os + + env.addHelpText("""b[hi] +b[*** abakus options *** +----------------------] +b[* bison=(no|yes): Enable parser support. Only needed for developers. +b[* flex=(no|yes): Enable lexer support. Only needed for developers. +b[* mpfr=(no|yes|check): Enable the MPFR library, which is faster and more + precise than abakus's high-precision code. + +ie: b[scons configure] +""") + + if env['HELP']: + # Don't even bother. + return env + + from SCons.Options import Options, PackageOption, EnumOption + import os + + def CheckFlags(context): + context.Message('Checking if ld supports --as-needed... ') + lastLINKFLAGS = context.env['LINKFLAGS'] + context.env.Append(LINKFLAGS = '-Wl,--as-needed') + + ret = context.TryLink(""" +#include <iostream> +using namespace std; +int main() +{ + cout << "Test" << endl; +} +""", ".cpp") + if not ret: + context.env.Replace(LINKFLAGS = lastLINKFLAGS) + context.Result(ret) + return ret + + def CheckPath(context, prog, versionFlag = ''): + if context.env[prog] == 'yes': + context.env[prog] = prog + + context.Message('Checking for %s... ' % prog) + + ret = True + + # If absolute path, just try this one. + if prog[0] == '/': + ret = context.TryAction('%s %s' % (context.env[prog], versionFlag))[0] + if ret: + context.Result(ret) + return True + + path = context.env.WhereIs(prog) + if ret and path != None: + context.env[prog] = path + context.Result(1) + else: + context.env[prog] = False + context.Result(0) + + print """ +The $foo program was not found! You asked to use it so we will stop here. It +is not required, you may use $foo=no on the command line to go without it.""".replace('$foo', prog) + + Exit(1) + + return False + + context.Result(1) + return True + + cachefile = env['CACHEDIR'] + '/abakus.cache.py' + + fixup = lambda x: "%s installed here (yes = search)" % x + + opts = None + if env.doConfigure(): + opts = Options(None, env['ARGS']) + else: + opts = Options(cachefile, env['ARGS']) + + opts.AddOptions( + PackageOption('bison', fixup('use the Bison parser generator'), 'yes'), + PackageOption('flex', fixup('use the Flex scanner generator'), 'yes'), + EnumOption ('mpfr', 'use the MPFR high-precision library', 'check', + allowed_values=('yes', 'no', 'check'), map={}, ignorecase=1), + ('ABAKUS_CONFIGURED', '', 0), + ('HAVE_ASNEEDED', '', 0) + ) + + # We must manually pass the ARGS in. + opts.Update(env, env['ARGS']) + + if env.doConfigure() or not env['ABAKUS_CONFIGURED']: + # Configure stuff + conf = env.Configure(custom_tests = {'CheckPath': CheckPath, 'CheckFlags' : CheckFlags}) + + if env['bison'] and env['bison'] != 'no': + conf.CheckPath('bison', '-V') + if env['flex'] and env['flex'] != 'no': + conf.CheckPath('flex', '-V') + if env['mpfr'] != 'no': + oldLibs = conf.env.get('LIBS', '') + conf.env.AppendUnique(LIBS = 'gmp') + + if conf.CheckLibWithHeader('mpfr', 'mpfr.h', 'c++', ''' +mpfr_t a; +mpfr_ptr ptr; +__mpfr_struct debug; + +mpfr_init(a); +''', autoadd = True): + env['mpfr'] = 'yes' + else: + conf.env.Replace(LIBS = oldLibs) + + if env['mpfr'] == 'yes': + print "Unable to find requested library mpfr!" + env.Exit(1) + else: + env['mpfr'] = 'no' + + env['HAVE_ASNEEDED'] = 0 + if conf.CheckFlags(): + env['HAVE_ASNEEDED'] = 1 + + env['ABAKUS_CONFIGURED'] = 1 + env = conf.Finish() + + try: + f = open("config.h", "w+") + f.write("""/* config.h -- Automatically generated by abakus.py + * Any changes you make to this file will be overwritten! + */ + +""") + f.write("/* HAVE_MPFR -- Defined if the MPFR library is being used. */\n") + if env['mpfr'] == 'yes': + f.write ("#define HAVE_MPFR 1\n") + else: + f.write ("/* #undef HAVE_MPFR */\n") + + f.close() + + except IOError: + print "Unable to write config.h!" + + opts.Save(cachefile, env) + +# vim: set et ts=8 sw=4: |