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