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.
abakus/configure

165 lines
4.5 KiB

#!/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 <michael.pyne@kdemail.net>
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