blob: 3eee9b350713ed76e12372730878ff7f583df4a9 [file] [log] [blame]
Greg Ward1190ee31998-12-18 23:46:33 +00001"""Prototype sysconfig module that loads information when run as a script,
2but only defines constants when imported.
3
4This should be run as a script as one of the last steps of the Python
5installation process.
6
7Written by: Fred L. Drake, Jr.
8Email: <fdrake@acm.org>
9Initial date: 17-Dec-1998
10"""
11
12__version__ = "$Revision$"
13
14
15def _init_posix():
16 import os
17 import re
Greg Ward3c8e54b1998-12-22 12:42:04 +000018 import string
Greg Ward1190ee31998-12-18 23:46:33 +000019 import sys
20
21 g = globals()
22
23 version = sys.version[:3]
24 config_dir = os.path.join(
25 sys.exec_prefix, "lib", "python" + version, "config")
26
27 # load the installed config.h:
28 define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n")
29 undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n")
30 fp = open(os.path.join(config_dir, "config.h"))
31
32 while 1:
33 line = fp.readline()
34 if not line:
35 break
36 m = define_rx.match(line)
37 if m:
38 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +000039 try: v = string.atoi(v)
40 except ValueError: pass
41 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +000042 else:
43 m = undef_rx.match(line)
44 if m:
45 g[m.group(1)] = 0
46
47 # load the installed Makefile.pre.in:
48 variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)\n")
49 done = {}
50 notdone = {}
51 fp = open(os.path.join(config_dir, "Makefile"))
52
53 while 1:
54 line = fp.readline()
55 if not line:
56 break
57 m = variable_rx.match(line)
58 if m:
59 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +000060 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +000061 if "$" in v:
62 notdone[n] = v
63 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +000064 try: v = string.atoi(v)
65 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +000066 done[n] = v
67
68 # do variable interpolation here
69 findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
70 findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
71 while notdone:
72 for name in notdone.keys():
73 value = notdone[name]
74 m = findvar1_rx.search(value)
75 if not m:
76 m = findvar2_rx.search(value)
77 if m:
78 n = m.group(1)
79 if done.has_key(n):
80 after = value[m.end():]
81 value = value[:m.start()] + done[n] + after
82 if "$" in after:
83 notdone[name] = value
84 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +000085 try: value = string.atoi(value)
86 except ValueError: pass
87 done[name] = string.strip(value)
Greg Ward1190ee31998-12-18 23:46:33 +000088 del notdone[name]
89 elif notdone.has_key(n):
90 # get it on a subsequent round
91 pass
92 else:
93 done[n] = ""
94 after = value[m.end():]
95 value = value[:m.start()] + after
96 if "$" in after:
97 notdone[name] = value
98 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +000099 try: value = string.atoi(value)
100 except ValueError: pass
101 done[name] = string.strip(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000102 del notdone[name]
103 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000104 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000105 del notdone[name]
106
107 # save the results in the global dictionary
108 g.update(done)
109
110
111import os
112exec "_init_%s()" % os.name
113del os
114del _init_posix