blob: 1d8231abc7660522f541e2a732664adb2ad820cc [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
Greg Ward9ddaaa11999-01-06 14:46:06 +000014import os
15import re
16import string
17import sys
Greg Ward1190ee31998-12-18 23:46:33 +000018
Greg Ward1190ee31998-12-18 23:46:33 +000019
Greg Ward9ddaaa11999-01-06 14:46:06 +000020def get_config_h_filename():
21 return os.path.join(sys.exec_prefix, "lib", "python" + sys.version[:3],
22 "config", "config.h")
Greg Ward1190ee31998-12-18 23:46:33 +000023
Greg Ward9ddaaa11999-01-06 14:46:06 +000024def get_makefile_filename():
25 return os.path.join(sys.exec_prefix, "lib", "python" + sys.version[:3],
26 "config", "Makefile")
Greg Ward1190ee31998-12-18 23:46:33 +000027
Greg Ward9ddaaa11999-01-06 14:46:06 +000028def parse_config_h(fp, g=None):
29 if g is None:
30 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +000031 define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n")
32 undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +000033 #
Greg Ward1190ee31998-12-18 23:46:33 +000034 while 1:
35 line = fp.readline()
36 if not line:
37 break
38 m = define_rx.match(line)
39 if m:
40 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +000041 try: v = string.atoi(v)
42 except ValueError: pass
43 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +000044 else:
45 m = undef_rx.match(line)
46 if m:
47 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +000048 return g
Greg Ward1190ee31998-12-18 23:46:33 +000049
Greg Ward9ddaaa11999-01-06 14:46:06 +000050def parse_makefile(fp, g=None):
51 if g is None:
52 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +000053 variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)\n")
54 done = {}
55 notdone = {}
Greg Ward9ddaaa11999-01-06 14:46:06 +000056 #
Greg Ward1190ee31998-12-18 23:46:33 +000057 while 1:
58 line = fp.readline()
59 if not line:
60 break
61 m = variable_rx.match(line)
62 if m:
63 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +000064 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +000065 if "$" in v:
66 notdone[n] = v
67 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +000068 try: v = string.atoi(v)
69 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +000070 done[n] = v
71
72 # do variable interpolation here
73 findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
74 findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
75 while notdone:
76 for name in notdone.keys():
77 value = notdone[name]
78 m = findvar1_rx.search(value)
79 if not m:
80 m = findvar2_rx.search(value)
81 if m:
82 n = m.group(1)
83 if done.has_key(n):
84 after = value[m.end():]
85 value = value[:m.start()] + done[n] + after
86 if "$" in after:
87 notdone[name] = value
88 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +000089 try: value = string.atoi(value)
90 except ValueError: pass
91 done[name] = string.strip(value)
Greg Ward1190ee31998-12-18 23:46:33 +000092 del notdone[name]
93 elif notdone.has_key(n):
94 # get it on a subsequent round
95 pass
96 else:
97 done[n] = ""
98 after = value[m.end():]
99 value = value[:m.start()] + after
100 if "$" in after:
101 notdone[name] = value
102 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000103 try: value = string.atoi(value)
104 except ValueError: pass
105 done[name] = string.strip(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000106 del notdone[name]
107 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000108 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000109 del notdone[name]
110
111 # save the results in the global dictionary
112 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000113 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000114
115
Greg Ward9ddaaa11999-01-06 14:46:06 +0000116def _init_posix():
117 g = globals()
118 # load the installed config.h:
119 parse_config_h(open(get_config_h_filename()), g)
120 # load the installed Makefile.pre.in:
121 parse_makefile(open(get_makefile_filename()), g)
122
123
124
125try:
126 exec "_init_" + os.name
127except NameError:
128 # not needed for this platform
129 pass
130else:
131 exec "_init_%s()" % os.name
132
Greg Ward1190ee31998-12-18 23:46:33 +0000133del _init_posix