Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / tools / src / nas,5.n2.os.2 / lib / python / lib / python2.4 / site.py
CommitLineData
86530b38
AT
1"""Append module search paths for third-party packages to sys.path.
2
3****************************************************************
4* This module is automatically imported during initialization. *
5****************************************************************
6
7In earlier versions of Python (up to 1.5a3), scripts or modules that
8needed to use site-specific modules would place ``import site''
9somewhere near the top of their code. Because of the automatic
10import, this is no longer necessary (but code that does it still
11works).
12
13This will append site-specific paths to the module search path. On
14Unix, it starts with sys.prefix and sys.exec_prefix (if different) and
15appends lib/python<version>/site-packages as well as lib/site-python.
16On other platforms (mainly Mac and Windows), it uses just sys.prefix
17(and sys.exec_prefix, if different, but this is unlikely). The
18resulting directories, if they exist, are appended to sys.path, and
19also inspected for path configuration files.
20
21A path configuration file is a file whose name has the form
22<package>.pth; its contents are additional directories (one per line)
23to be added to sys.path. Non-existing directories (or
24non-directories) are never added to sys.path; no directory is added to
25sys.path more than once. Blank lines and lines beginning with
26'#' are skipped. Lines starting with 'import' are executed.
27
28For example, suppose sys.prefix and sys.exec_prefix are set to
29/usr/local and there is a directory /usr/local/lib/python1.5/site-packages
30with three subdirectories, foo, bar and spam, and two path
31configuration files, foo.pth and bar.pth. Assume foo.pth contains the
32following:
33
34 # foo package configuration
35 foo
36 bar
37 bletch
38
39and bar.pth contains:
40
41 # bar package configuration
42 bar
43
44Then the following directories are added to sys.path, in this order:
45
46 /usr/local/lib/python1.5/site-packages/bar
47 /usr/local/lib/python1.5/site-packages/foo
48
49Note that bletch is omitted because it doesn't exist; bar precedes foo
50because bar.pth comes alphabetically before foo.pth; and spam is
51omitted because it is not mentioned in either path configuration file.
52
53After these path manipulations, an attempt is made to import a module
54named sitecustomize, which can perform arbitrary additional
55site-specific customizations. If this import fails with an
56ImportError exception, it is silently ignored.
57
58"""
59
60import sys
61import os
62import __builtin__
63
64
65def makepath(*paths):
66 dir = os.path.abspath(os.path.join(*paths))
67 return dir, os.path.normcase(dir)
68
69def abs__file__():
70 """Set all module' __file__ attribute to an absolute path"""
71 for m in sys.modules.values():
72 try:
73 m.__file__ = os.path.abspath(m.__file__)
74 except AttributeError:
75 continue
76
77def removeduppaths():
78 """ Remove duplicate entries from sys.path along with making them
79 absolute"""
80 # This ensures that the initial path provided by the interpreter contains
81 # only absolute pathnames, even if we're running from the build directory.
82 L = []
83 known_paths = set()
84 for dir in sys.path:
85 # Filter out duplicate paths (on case-insensitive file systems also
86 # if they only differ in case); turn relative paths into absolute
87 # paths.
88 dir, dircase = makepath(dir)
89 if not dircase in known_paths:
90 L.append(dir)
91 known_paths.add(dircase)
92 sys.path[:] = L
93 return known_paths
94
95# XXX This should not be part of site.py, since it is needed even when
96# using the -S option for Python. See http://www.python.org/sf/586680
97def addbuilddir():
98 """Append ./build/lib.<platform> in case we're running in the build dir
99 (especially for Guido :-)"""
100 from distutils.util import get_platform
101 s = "build/lib.%s-%.3s" % (get_platform(), sys.version)
102 s = os.path.join(os.path.dirname(sys.path[-1]), s)
103 sys.path.append(s)
104
105def _init_pathinfo():
106 """Return a set containing all existing directory entries from sys.path"""
107 d = set()
108 for dir in sys.path:
109 try:
110 if os.path.isdir(dir):
111 dir, dircase = makepath(dir)
112 d.add(dircase)
113 except TypeError:
114 continue
115 return d
116
117def addpackage(sitedir, name, known_paths):
118 """Add a new path to known_paths by combining sitedir and 'name' or execute
119 sitedir if it starts with 'import'"""
120 if known_paths is None:
121 _init_pathinfo()
122 reset = 1
123 else:
124 reset = 0
125 fullname = os.path.join(sitedir, name)
126 try:
127 f = open(fullname, "rU")
128 except IOError:
129 return
130 try:
131 for line in f:
132 if line.startswith("#"):
133 continue
134 if line.startswith("import"):
135 exec line
136 continue
137 line = line.rstrip()
138 dir, dircase = makepath(sitedir, line)
139 if not dircase in known_paths and os.path.exists(dir):
140 sys.path.append(dir)
141 known_paths.add(dircase)
142 finally:
143 f.close()
144 if reset:
145 known_paths = None
146 return known_paths
147
148def addsitedir(sitedir, known_paths=None):
149 """Add 'sitedir' argument to sys.path if missing and handle .pth files in
150 'sitedir'"""
151 if known_paths is None:
152 known_paths = _init_pathinfo()
153 reset = 1
154 else:
155 reset = 0
156 sitedir, sitedircase = makepath(sitedir)
157 if not sitedircase in known_paths:
158 sys.path.append(sitedir) # Add path component
159 try:
160 names = os.listdir(sitedir)
161 except os.error:
162 return
163 names.sort()
164 for name in names:
165 if name.endswith(os.extsep + "pth"):
166 addpackage(sitedir, name, known_paths)
167 if reset:
168 known_paths = None
169 return known_paths
170
171def addsitepackages(known_paths):
172 """Add site-packages (and possibly site-python) to sys.path"""
173 prefixes = [sys.prefix]
174 if sys.exec_prefix != sys.prefix:
175 prefixes.append(sys.exec_prefix)
176 for prefix in prefixes:
177 if prefix:
178 if sys.platform in ('os2emx', 'riscos'):
179 sitedirs = [os.path.join(prefix, "Lib", "site-packages")]
180 elif os.sep == '/':
181 sitedirs = [os.path.join(prefix,
182 "lib",
183 "python" + sys.version[:3],
184 "site-packages"),
185 os.path.join(prefix, "lib", "site-python")]
186 else:
187 sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")]
188 if sys.platform == 'darwin':
189 # for framework builds *only* we add the standard Apple
190 # locations. Currently only per-user, but /Library and
191 # /Network/Library could be added too
192 if 'Python.framework' in prefix:
193 home = os.environ.get('HOME')
194 if home:
195 sitedirs.append(
196 os.path.join(home,
197 'Library',
198 'Python',
199 sys.version[:3],
200 'site-packages'))
201 for sitedir in sitedirs:
202 if os.path.isdir(sitedir):
203 addsitedir(sitedir, known_paths)
204 return None
205
206
207def setBEGINLIBPATH():
208 """The OS/2 EMX port has optional extension modules that do double duty
209 as DLLs (and must use the .DLL file extension) for other extensions.
210 The library search path needs to be amended so these will be found
211 during module import. Use BEGINLIBPATH so that these are at the start
212 of the library search path.
213
214 """
215 dllpath = os.path.join(sys.prefix, "Lib", "lib-dynload")
216 libpath = os.environ['BEGINLIBPATH'].split(';')
217 if libpath[-1]:
218 libpath.append(dllpath)
219 else:
220 libpath[-1] = dllpath
221 os.environ['BEGINLIBPATH'] = ';'.join(libpath)
222
223
224def setquit():
225 """Define new built-ins 'quit' and 'exit'.
226 These are simply strings that display a hint on how to exit.
227
228 """
229 if os.sep == ':':
230 exit = 'Use Cmd-Q to quit.'
231 elif os.sep == '\\':
232 exit = 'Use Ctrl-Z plus Return to exit.'
233 else:
234 exit = 'Use Ctrl-D (i.e. EOF) to exit.'
235 __builtin__.quit = __builtin__.exit = exit
236
237
238class _Printer(object):
239 """interactive prompt objects for printing the license text, a list of
240 contributors and the copyright notice."""
241
242 MAXLINES = 23
243
244 def __init__(self, name, data, files=(), dirs=()):
245 self.__name = name
246 self.__data = data
247 self.__files = files
248 self.__dirs = dirs
249 self.__lines = None
250
251 def __setup(self):
252 if self.__lines:
253 return
254 data = None
255 for dir in self.__dirs:
256 for filename in self.__files:
257 filename = os.path.join(dir, filename)
258 try:
259 fp = file(filename, "rU")
260 data = fp.read()
261 fp.close()
262 break
263 except IOError:
264 pass
265 if data:
266 break
267 if not data:
268 data = self.__data
269 self.__lines = data.split('\n')
270 self.__linecnt = len(self.__lines)
271
272 def __repr__(self):
273 self.__setup()
274 if len(self.__lines) <= self.MAXLINES:
275 return "\n".join(self.__lines)
276 else:
277 return "Type %s() to see the full %s text" % ((self.__name,)*2)
278
279 def __call__(self):
280 self.__setup()
281 prompt = 'Hit Return for more, or q (and Return) to quit: '
282 lineno = 0
283 while 1:
284 try:
285 for i in range(lineno, lineno + self.MAXLINES):
286 print self.__lines[i]
287 except IndexError:
288 break
289 else:
290 lineno += self.MAXLINES
291 key = None
292 while key is None:
293 key = raw_input(prompt)
294 if key not in ('', 'q'):
295 key = None
296 if key == 'q':
297 break
298
299def setcopyright():
300 """Set 'copyright' and 'credits' in __builtin__"""
301 __builtin__.copyright = _Printer("copyright", sys.copyright)
302 if sys.platform[:4] == 'java':
303 __builtin__.credits = _Printer(
304 "credits",
305 "Jython is maintained by the Jython developers (www.jython.org).")
306 else:
307 __builtin__.credits = _Printer("credits", """\
308 Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
309 for supporting Python development. See www.python.org for more information.""")
310 here = os.path.dirname(os.__file__)
311 __builtin__.license = _Printer(
312 "license", "See http://www.python.org/%.3s/license.html" % sys.version,
313 ["LICENSE.txt", "LICENSE"],
314 [os.path.join(here, os.pardir), here, os.curdir])
315
316
317class _Helper(object):
318 """Define the built-in 'help'.
319 This is a wrapper around pydoc.help (with a twist).
320
321 """
322
323 def __repr__(self):
324 return "Type help() for interactive help, " \
325 "or help(object) for help about object."
326 def __call__(self, *args, **kwds):
327 import pydoc
328 return pydoc.help(*args, **kwds)
329
330def sethelper():
331 __builtin__.help = _Helper()
332
333def aliasmbcs():
334 """On Windows, some default encodings are not provided by Python,
335 while they are always available as "mbcs" in each locale. Make
336 them usable by aliasing to "mbcs" in such a case."""
337 if sys.platform == 'win32':
338 import locale, codecs
339 enc = locale.getdefaultlocale()[1]
340 if enc.startswith('cp'): # "cp***" ?
341 try:
342 codecs.lookup(enc)
343 except LookupError:
344 import encodings
345 encodings._cache[enc] = encodings._unknown
346 encodings.aliases.aliases[enc] = 'mbcs'
347
348def setencoding():
349 """Set the string encoding used by the Unicode implementation. The
350 default is 'ascii', but if you're willing to experiment, you can
351 change this."""
352 encoding = "ascii" # Default value set by _PyUnicode_Init()
353 if 0:
354 # Enable to support locale aware default string encodings.
355 import locale
356 loc = locale.getdefaultlocale()
357 if loc[1]:
358 encoding = loc[1]
359 if 0:
360 # Enable to switch off string to Unicode coercion and implicit
361 # Unicode to string conversion.
362 encoding = "undefined"
363 if encoding != "ascii":
364 # On Non-Unicode builds this will raise an AttributeError...
365 sys.setdefaultencoding(encoding) # Needs Python Unicode build !
366
367
368def execsitecustomize():
369 """Run custom site specific code, if available."""
370 try:
371 import sitecustomize
372 except ImportError:
373 pass
374
375
376def main():
377 abs__file__()
378 paths_in_sys = removeduppaths()
379 if (os.name == "posix" and sys.path and
380 os.path.basename(sys.path[-1]) == "Modules"):
381 addbuilddir()
382 paths_in_sys = addsitepackages(paths_in_sys)
383 if sys.platform == 'os2emx':
384 setBEGINLIBPATH()
385 setquit()
386 setcopyright()
387 sethelper()
388 aliasmbcs()
389 setencoding()
390 execsitecustomize()
391 # Remove sys.setdefaultencoding() so that users cannot change the
392 # encoding after initialization. The test for presence is needed when
393 # this module is run as a script, because this code is executed twice.
394 if hasattr(sys, "setdefaultencoding"):
395 del sys.setdefaultencoding
396
397main()
398
399def _test():
400 print "sys.path = ["
401 for dir in sys.path:
402 print " %r," % (dir,)
403 print "]"
404
405if __name__ == '__main__':
406 _test()