mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # 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 = sorted(d.keys())
 | |
|     for key in keys:
 | |
|         value = d[key]
 | |
|         print("%-15s" % key, str(value))
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     test()
 | 
