Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Tools/freeze/parsesetup.py
12 views
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()
112
113