summaryrefslogtreecommitdiffstats
path: root/bksys/abakus.py
diff options
context:
space:
mode:
Diffstat (limited to 'bksys/abakus.py')
-rw-r--r--bksys/abakus.py178
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: