# 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() |