~ubuntu-branches/ubuntu/trusty/python3.4/trusty-proposed

« back to all changes in this revision

Viewing changes to Tools/freeze/parsesetup.py

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-11-25 09:44:27 UTC
  • Revision ID: package-import@ubuntu.com-20131125094427-lzxj8ap5w01lmo7f
Tags: upstream-3.4~b1
ImportĀ upstreamĀ versionĀ 3.4~b1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Parse Makefiles and Python Setup(.in) files.
 
2
 
 
3
import re
 
4
 
 
5
 
 
6
# Extract variable definitions from a Makefile.
 
7
# Return a dictionary mapping names to values.
 
8
# May raise IOError.
 
9
 
 
10
makevardef = re.compile('^([a-zA-Z0-9_]+)[ \t]*=(.*)')
 
11
 
 
12
def getmakevars(filename):
 
13
    variables = {}
 
14
    fp = open(filename)
 
15
    pendingline = ""
 
16
    try:
 
17
        while 1:
 
18
            line = fp.readline()
 
19
            if pendingline:
 
20
                line = pendingline + line
 
21
                pendingline = ""
 
22
            if not line:
 
23
                break
 
24
            if line.endswith('\\\n'):
 
25
                pendingline = line[:-2]
 
26
            matchobj = makevardef.match(line)
 
27
            if not matchobj:
 
28
                continue
 
29
            (name, value) = matchobj.group(1, 2)
 
30
            # Strip trailing comment
 
31
            i = value.find('#')
 
32
            if i >= 0:
 
33
                value = value[:i]
 
34
            value = value.strip()
 
35
            variables[name] = value
 
36
    finally:
 
37
        fp.close()
 
38
    return variables
 
39
 
 
40
 
 
41
# Parse a Python Setup(.in) file.
 
42
# Return two dictionaries, the first mapping modules to their
 
43
# definitions, the second mapping variable names to their values.
 
44
# May raise IOError.
 
45
 
 
46
setupvardef = re.compile('^([a-zA-Z0-9_]+)=(.*)')
 
47
 
 
48
def getsetupinfo(filename):
 
49
    modules = {}
 
50
    variables = {}
 
51
    fp = open(filename)
 
52
    pendingline = ""
 
53
    try:
 
54
        while 1:
 
55
            line = fp.readline()
 
56
            if pendingline:
 
57
                line = pendingline + line
 
58
                pendingline = ""
 
59
            if not line:
 
60
                break
 
61
            # Strip comments
 
62
            i = line.find('#')
 
63
            if i >= 0:
 
64
                line = line[:i]
 
65
            if line.endswith('\\\n'):
 
66
                pendingline = line[:-2]
 
67
                continue
 
68
            matchobj = setupvardef.match(line)
 
69
            if matchobj:
 
70
                (name, value) = matchobj.group(1, 2)
 
71
                variables[name] = value.strip()
 
72
            else:
 
73
                words = line.split()
 
74
                if words:
 
75
                    modules[words[0]] = words[1:]
 
76
    finally:
 
77
        fp.close()
 
78
    return modules, variables
 
79
 
 
80
 
 
81
# Test the above functions.
 
82
 
 
83
def test():
 
84
    import sys
 
85
    import os
 
86
    if not sys.argv[1:]:
 
87
        print('usage: python parsesetup.py Makefile*|Setup* ...')
 
88
        sys.exit(2)
 
89
    for arg in sys.argv[1:]:
 
90
        base = os.path.basename(arg)
 
91
        if base[:8] == 'Makefile':
 
92
            print('Make style parsing:', arg)
 
93
            v = getmakevars(arg)
 
94
            prdict(v)
 
95
        elif base[:5] == 'Setup':
 
96
            print('Setup style parsing:', arg)
 
97
            m, v = getsetupinfo(arg)
 
98
            prdict(m)
 
99
            prdict(v)
 
100
        else:
 
101
            print(arg, 'is neither a Makefile nor a Setup file')
 
102
            print('(name must begin with "Makefile" or "Setup")')
 
103
 
 
104
def prdict(d):
 
105
    keys = sorted(d.keys())
 
106
    for key in keys:
 
107
        value = d[key]
 
108
        print("%-15s" % key, str(value))
 
109
 
 
110
if __name__ == '__main__':
 
111
    test()