# Parse Makefiles and Python Setup(.in) files. import re # Extract variable definitions from a Makefile. # Return a dictionary mapping names to values. # May raise IOError. makevardef = re.compile('^([a-zA-Z0-9_]+)[ \t]*=(.*)') def getmakevars(filename): variables = {} fp = open(filename) pendingline = "" try: while 1: line = fp.readline() if pendingline: line = pendingline + line pendingline = "" if not line: break if line.endswith('\\\n'): pendingline = line[:-2] matchobj = makevardef.match(line) if not matchobj: continue (name, value) = matchobj.group(1, 2) # Strip trailing comment i = value.find('#') if i >= 0: value = value[:i] value = value.strip() variables[name] = value finally: fp.close() return variables # Parse a Python Setup(.in) file. # Return two dictionaries, the first mapping modules to their # definitions, the second mapping variable names to their values. # May raise IOError. setupvardef = re.compile('^([a-zA-Z0-9_]+)=(.*)') def getsetupinfo(filename): modules = {} variables = {} fp = open(filename) pendingline = "" try: while 1: line = fp.readline() if pendingline: line = pendingline + line pendingline = "" if not line: break # Strip comments i = line.find('#') if i >= 0: line = line[:i] if line.endswith('\\\n'): pendingline = line[:-2] continue matchobj = setupvardef.match(line) if matchobj: (name, value) = matchobj.group(1, 2) variables[name] = value.strip() else: words = line.split() if words: modules[words[0]] = words[1:] finally: fp.close() return modules, variables # Test the above functions. def test(): import sys import os if not sys.argv[1:]: print 'usage: python parsesetup.py Makefile*|Setup* ...' sys.exit(2) for arg in sys.argv[1:]: base = os.path.basename(arg) if base[:8] == 'Makefile': print 'Make style parsing:', arg v = getmakevars(arg) prdict(v) elif base[:5] == 'Setup': print 'Setup style parsing:', arg m, v = getsetupinfo(arg) prdict(m) prdict(v) else: print arg, 'is neither a Makefile nor a Setup file' print '(name must begin with "Makefile" or "Setup")' def prdict(d): keys = d.keys() keys.sort() for key in keys: value = d[key] print "%-15s" % key, str(value) if __name__ == '__main__': test()