diff options
author | lloyd <[email protected]> | 2009-07-01 18:07:22 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2009-07-01 18:07:22 +0000 |
commit | 91a88f702d4bf6e150c30de059286a954b617834 (patch) | |
tree | 14912f2f5b9e2dad9d17b5225635bd3666e436fc | |
parent | e0bf42e441f864312e6107a3e254d1969ed66971 (diff) |
A try at redoing the configuration system in Python. Only very basic stuff
right now, but it feels promising.
-rwxr-xr-x | configure.py | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/configure.py b/configure.py new file mode 100755 index 000000000..15ef5de6f --- /dev/null +++ b/configure.py @@ -0,0 +1,201 @@ +#!/usr/bin/python + +import sys +import re +import shlex +from os import walk as os_walk +from os.path import join as os_path_join +from optparse import OptionParser, SUPPRESS_HELP + +def process_command_line(args): + parser = OptionParser() + + parser.add_option("--cc", dest="compiler", + help="set the desired build compiler") + parser.add_option("--os", dest="os", + help="set the target operating system") + parser.add_option("--cpu", dest="cpu", + help="set the target processor type/model") + + parser.add_option("--prefix", dest="prefix", + help="set the base installation directory") + + compat_with_autoconf_options = [ + "bindir", + "datadir", + "datarootdir", + "docdir", + "dvidir", + "exec-prefix", + "htmldir", + "includedir", + "infodir", + "libdir", + "libexecdir", + "localedir", + "localstatedir", + "mandir", + "oldincludedir", + "pdfdir", + "psdir", + "sbindir", + "sharedstatedir", + "sysconfdir" + ] + + for opt in compat_with_autoconf_options: + parser.add_option("--" + opt, dest=opt, help=SUPPRESS_HELP) + + (options, args) = parser.parse_args(args) + + return (options, args) + + +class LexerError(Exception): + def __init__(self, msg, filename, line): + self.msg = msg + self.filename = filename + self.line = line + + def __str__(self): + return "%s at %s:%d" % (self.msg, self.filename, self.line) + + +def lex_me_harder(): + pass + + +""" +Represents the information about a particular module +""" +class ModuleInfo(object): + def __init__(self, infofile): + lex = shlex.shlex(open(infofile), infofile, posix=True) + + self.realname = "<UNKNOWN>" + self.load_on = "request" + self.define = None + self.modset = None + self.uses_tr1 = False + self.notes = '' + self.mp_bits = 0 + + self.requires = [] + self.add = [] + self.os = [] + self.arch = [] + self.cc = [] + self.libs = [] + + lex.wordchars += '.<>/,' + + token = lex.get_token() + while token != None: + match = re.match('<(.*)>', token) + + # Check for a grouping + if match is not None: + group = match.group(1) + + if group not in ['add','requires','os','arch','cc','libs']: + raise LexerError("Unknown group '%s'" % (group), infofile, lex.lineno) + + end_marker = '</' + group + '>' + + token = lex.get_token() + while token != None and token != end_marker: + self.__dict__[group].append(token) + token = lex.get_token() + # Or single name->value pairs + elif token in ['realname', 'define', 'load_on', 'modset', 'note', 'mp_bits', 'uses_tr1']: + self.__dict__[token] = lex.get_token() + else: # No match -> error + raise LexerError("Bad token '%s'" % (token), infofile, lex.lineno) + + token = lex.get_token() + + # Coerce to more useful types + self.mp_bits = int(self.mp_bits) + self.uses_tr1 == bool(self.uses_tr1) + + def __str__(self): + return "ModuleInfo('%s', '-D%s', add=%s, requires=%s)" % ( + self.realname, self.define, ','.join(self.add), + ','.join(self.requires)) + +class ArchInfo(object): + def __init__(self, infofile): + self.realname = "<UNKNOWN>" + self.default_submodel = None + self.endian = None + self.unaligned = 'no' + + self.submodels = [] + #self.aliases = [] + self.submodel_aliases = [] + + lex = shlex.shlex(open(infofile), infofile, posix=True) + + lex.wordchars += '.<>/,-' + + token = lex.get_token() + while token != None: + match = re.match('<(.*)>', token) + + # Check for a grouping + if match is not None: + group = match.group(1) + + if group not in ['aliases','submodels','submodel_aliases']: + raise LexerError("Unknown group '%s'" % (group), infofile, lex.lineno) + + end_marker = '</' + group + '>' + + token = lex.get_token() + while token != None and token != end_marker: + if group not in self.__dict__: + self.__dict__[group] = [] + #self.__dict__[group].append(token) + token = lex.get_token() + # Or single name->value pairs + elif token in ['realname', 'default_submodel', 'endian','unaligned']: + self.__dict__[token] = lex.get_token() + else: # No match -> error + raise LexerError("Bad token '%s'" % (token), infofile, lex.lineno) + + token = lex.get_token() + + def __str__(self): + return ','.join(self.aliases) + +def main(argv = None): + if argv is None: + argv = sys.argv + + """ + Walk through a directory and find all files named desired_name + """ + def find_files_named(desired_name, in_path): + for (dirpath, dirnames, filenames) in os_walk(in_path): + if desired_name in filenames: + yield os_path_join(dirpath, desired_name) + + def list_files_in(in_path): + for (dirpath, dirnames, filenames) in os_walk(in_path): + for filename in filenames: + yield os_path_join(dirpath, filename) + + try: + (options, args) = process_command_line(argv[1:]) + + modules = [ModuleInfo(info) for info in find_files_named('info.txt', 'src')] + + arches = [ArchInfo(info) for info in list_files_in('src/build-data/arch')] + + #print '\n'.join(map(str, modules)) + print '\n'.join(map(str, arches)) + except Exception,e: + print "Exception:", e + +if __name__ == '__main__': + sys.exit(main()) |