mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
	
	
		
			99 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			99 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								# Parse Makefiles and Python Setup(.in) files.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import regex
							 | 
						||
| 
								 | 
							
								import string
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Extract variable definitions from a Makefile.
							 | 
						||
| 
								 | 
							
								# Return a dictionary mapping names to values.
							 | 
						||
| 
								 | 
							
								# May raise IOError.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								makevardef = regex.compile('^\([a-zA-Z0-9_]+\)[ \t]*=\(.*\)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def getmakevars(filename):
							 | 
						||
| 
								 | 
							
									variables = {}
							 | 
						||
| 
								 | 
							
									fp = open(filename)
							 | 
						||
| 
								 | 
							
									try:
							 | 
						||
| 
								 | 
							
										while 1:
							 | 
						||
| 
								 | 
							
											line = fp.readline()
							 | 
						||
| 
								 | 
							
											if not line:
							 | 
						||
| 
								 | 
							
												break
							 | 
						||
| 
								 | 
							
											if makevardef.match(line) < 0:
							 | 
						||
| 
								 | 
							
												continue
							 | 
						||
| 
								 | 
							
											name, value = makevardef.group(1, 2)
							 | 
						||
| 
								 | 
							
											# Strip trailing comment
							 | 
						||
| 
								 | 
							
											i = string.find(value, '#')
							 | 
						||
| 
								 | 
							
											if i >= 0:
							 | 
						||
| 
								 | 
							
												value = value[:i]
							 | 
						||
| 
								 | 
							
											value = string.strip(value)
							 | 
						||
| 
								 | 
							
											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 = regex.compile('^\([a-zA-Z0-9_]+\)=\(.*\)')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def getsetupinfo(filename):
							 | 
						||
| 
								 | 
							
									modules = {}
							 | 
						||
| 
								 | 
							
									variables = {}
							 | 
						||
| 
								 | 
							
									fp = open(filename)
							 | 
						||
| 
								 | 
							
									try:
							 | 
						||
| 
								 | 
							
										while 1:
							 | 
						||
| 
								 | 
							
											line = fp.readline()
							 | 
						||
| 
								 | 
							
											if not line:
							 | 
						||
| 
								 | 
							
												break
							 | 
						||
| 
								 | 
							
											# Strip comments
							 | 
						||
| 
								 | 
							
											i = string.find(line, '#')
							 | 
						||
| 
								 | 
							
											if i >= 0:
							 | 
						||
| 
								 | 
							
												line = line[:i]
							 | 
						||
| 
								 | 
							
											if setupvardef.match(line) >= 0:
							 | 
						||
| 
								 | 
							
												name, value = setupvardef.group(1, 2)
							 | 
						||
| 
								 | 
							
												variables[name] = string.strip(value)
							 | 
						||
| 
								 | 
							
											else:
							 | 
						||
| 
								 | 
							
												words = string.split(line)
							 | 
						||
| 
								 | 
							
												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()
							 |