mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +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()
 |