diff options
Diffstat (limited to 'configure')
-rwxr-xr-x | configure | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/configure b/configure new file mode 100755 index 0000000..9a62bdd --- /dev/null +++ b/configure @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# Configure script for abakus. I think it's better than the sample that came +# with bksys. Feel free to do with it what you want. +# By Michael Pyne <[email protected]> + +import sys +import re + +BOLD="\033[1m" +RED="\033[91m" +GREEN="\033[92m" +YELLOW="\033[93m" +CYAN="\033[96m" +NORMAL="\033[0m" + +PROGRAM_NAME='abakus' + +# First let's see if they asked for help. +if '--help' in sys.argv: + print '''This is a configure script to prepare %s for building. + +You can pass the command line argument debug=1 to enable debugging for the +application, which can be useful if you have problems. + +Otherwise, just run ./configure, and if you don't already have scons, a mini +version will be installed suitable for building %s. +'''.replace('%s', PROGRAM_NAME) + sys.exit(0) + +# Check that we have the minimum version of Python needs to run SCons. +if sys.hexversion < 0x02030000: + # Use regexp for compatibility with ancient Python + version = re.split(' ', sys.version)[0] + + print RED + 'Sorry, your version of Python is too old.' + NORMAL + print PROGRAM_NAME + ' requires Python 2.3 or greater to build.' + print "\nYou have Python " + version + sys.exit(1) + +import os + +# Check if scons is installed. We can use cool Python features now that we +# know we aren't using an ancient version of Python. +result = os.system('scons -v > /dev/null 2>&1') +scons = 'scons' + +if os.WEXITSTATUS(result) == 0: + print GREEN + "scons already installed." + NORMAL +else: + # If we didn't find scons, don't whine to the user about it, just fix it. + print YELLOW + 'scons not installed, installing local copy.' + NORMAL + + # Split this into two steps since some tars don't use j to mean bzip2 + # compressed. + result = os.system('bzcat bksys/scons-mini.tar.bz2 | tar x') + + if os.WEXITSTATUS(result) != 0: + print RED + 'Unable to extract scons' + NORMAL + sys.exit(2) + + scons = '%s/scons' % os.getcwd() + +# Now we now where scons is. Let's create a Makefile (after we configure) so +# that all the user has to do is type 'make'. Allow the user to pass command +# line arguments, which will be passed to the configure process. +if len(sys.argv) < 2: + options = '' +else: + options = " ".join(sys.argv[1:]) + # reduce is pretty cool +# options = reduce(lambda x, y: x + '\n' + y, sys.argv[1:]) + +result = os.system(scons + ' configure ' + options) +if os.WEXITSTATUS(result) != 0: + print RED + 'Unable to configure scons' + NORMAL + sys.exit(3) + +# Recursive generates a makefile for a directory. If topDir is True, the +# Makefile is slightly different. +def generate_makefile(dir, topDir = False): + + file = name + "/Makefile" + + # Write out Makefile. + try: + makefile = open(file, 'w') + except IOError: + print RED + "Unable to open " + file + NORMAL + sys.exit(4) + + text = ''' +## Makefile automatically generated by configure + +SCONS=$scons + +# $scons : compile +# $scons -c : clean +# $scons install : install +# $scons -c install : uninstall and clean + +# Default target: use scons to build the program +all: + @$(SCONS) -Q + +# Debugging possibilies: +# $scons --debug=explain, $scons --debug=tree + +# To optimize the runtime: +# $scons --max-drift=1 --implicit-deps-unchanged +debug: + @$(SCONS) -Q --debug=tree + +clean: + @$(SCONS) -c + +install: + @$(SCONS) install + +uninstall: + @$(SCONS) uninstall + +# This target creates a tarball of the project (in theory) +dist: + @$(SCONS) dist +''' + + if topDir: + text = text.replace('$scons', scons) + else: + text = text.replace('$scons', scons + ' -u') + + try: + print "Generating " + GREEN + file + NORMAL + makefile.write(text) + makefile.close() + except IOError: + print RED + "Unable to write to the Makefile!" + NORMAL + sys.exit(5) + +# Recursively generate Makefiles for convienience. +for name, dirs, files in os.walk('.'): + # Don't try to build hidden directories. + remove = filter(lambda x: x[0] == '.', dirs) + for i in remove: + dirs.remove(i) + + if 'SConstruct' in files: + # We're in the very top directory. + generate_makefile(name, topDir = True) + + for dir in ['cache', 'bksys']: + if dir in dirs: + dirs.remove(dir) + elif 'SConscript' in files: + generate_makefile(name) + +# The Makefile has been written, we're pretty much done. +message = ''' +The Makefile(s) have been generated. Type: + `make' to build %s, and + `make install' to install %s. +'''.replace('%s', PROGRAM_NAME) + +print GREEN + message + NORMAL |