You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.9 KiB
179 lines
4.9 KiB
#!/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:
|