summaryrefslogtreecommitdiffstats
path: root/configure
blob: 9a62bddab266b6f49ed2e23d786d89657c0cec7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
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 <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