| 
									
										
										
										
											1999-01-06 16:28:34 +00:00
										 |  |  | """Provide access to Python's configuration information.  The specific names
 | 
					
						
							|  |  |  | defined in the module depend heavily on the platform and configuration. | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Written by:   Fred L. Drake, Jr. | 
					
						
							|  |  |  | Email:        <fdrake@acm.org> | 
					
						
							|  |  |  | Initial date: 17-Dec-1998 | 
					
						
							|  |  |  | """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-03 00:44:30 +00:00
										 |  |  | __revision__ = "$Id$" | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import re | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import sys | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  | from errors import DistutilsPlatformError | 
					
						
							| 
									
										
										
										
											2000-02-02 00:05:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  | # These are needed in a couple of spots, so just compute them once. | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  | PREFIX = os.path.normpath(sys.prefix) | 
					
						
							|  |  |  | EXEC_PREFIX = os.path.normpath(sys.exec_prefix) | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-04-10 01:17:49 +00:00
										 |  |  | def get_python_inc(plat_specific=0, prefix=None): | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |     """Return the directory containing installed Python header files.
 | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     If 'plat_specific' is false (the default), this is the path to the | 
					
						
							|  |  |  |     non-platform-specific header files, i.e. Python.h and so on; | 
					
						
							|  |  |  |     otherwise, this is the path to platform-specific header files | 
					
						
							|  |  |  |     (namely config.h). | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-04-10 01:17:49 +00:00
										 |  |  |     If 'prefix' is supplied, use it instead of sys.prefix or | 
					
						
							|  |  |  |     sys.exec_prefix -- i.e., ignore 'plat_specific'. | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     """    
 | 
					
						
							| 
									
										
										
										
											2000-04-10 01:17:49 +00:00
										 |  |  |     if prefix is None: | 
					
						
							|  |  |  |         prefix = (plat_specific and EXEC_PREFIX or PREFIX) | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |     if os.name == "posix": | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |         return os.path.join(prefix, "include", "python" + sys.version[:3]) | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |     elif os.name == "nt": | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |         return os.path.join(prefix, "Include") # include or Include? | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |     elif os.name == "mac": | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |         return os.path.join(prefix, "Include") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |     else: | 
					
						
							|  |  |  |         raise DistutilsPlatformError, \ | 
					
						
							|  |  |  |               ("I don't know where Python installs its C header files " + | 
					
						
							|  |  |  |                "on platform '%s'") % os.name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-04-10 01:17:49 +00:00
										 |  |  | def get_python_lib(plat_specific=0, standard_lib=0, prefix=None): | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |     """Return the directory containing the Python library (standard or
 | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     site additions). | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     If 'plat_specific' is true, return the directory containing | 
					
						
							|  |  |  |     platform-specific modules, i.e. any module from a non-pure-Python | 
					
						
							|  |  |  |     module distribution; otherwise, return the platform-shared library | 
					
						
							|  |  |  |     directory.  If 'standard_lib' is true, return the directory | 
					
						
							|  |  |  |     containing standard Python library modules; otherwise, return the | 
					
						
							|  |  |  |     directory for site-specific modules. | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-04-10 01:17:49 +00:00
										 |  |  |     If 'prefix' is supplied, use it instead of sys.prefix or | 
					
						
							|  |  |  |     sys.exec_prefix -- i.e., ignore 'plat_specific'. | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2000-04-10 01:17:49 +00:00
										 |  |  |     if prefix is None: | 
					
						
							|  |  |  |         prefix = (plat_specific and EXEC_PREFIX or PREFIX) | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |         | 
					
						
							|  |  |  |     if os.name == "posix": | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |         libpython = os.path.join(prefix, | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |                                  "lib", "python" + sys.version[:3]) | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |         if standard_lib: | 
					
						
							|  |  |  |             return libpython | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |             return os.path.join(libpython, "site-packages") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     elif os.name == "nt": | 
					
						
							|  |  |  |         if standard_lib: | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |             return os.path.join(PREFIX, "Lib") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |             return prefix | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     elif os.name == "mac": | 
					
						
							| 
									
										
										
										
											2000-08-02 01:49:40 +00:00
										 |  |  |         if plat_specific: | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |             if standard_lib: | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |                 return os.path.join(EXEC_PREFIX, "Mac", "Plugins") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 raise DistutilsPlatformError, \ | 
					
						
							|  |  |  |                       "OK, where DO site-specific extensions go on the Mac?" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             if standard_lib: | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |                 return os.path.join(PREFIX, "Lib") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 raise DistutilsPlatformError, \ | 
					
						
							|  |  |  |                       "OK, where DO site-specific modules go on the Mac?" | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         raise DistutilsPlatformError, \ | 
					
						
							|  |  |  |               ("I don't know where Python installs its library " + | 
					
						
							|  |  |  |                "on platform '%s'") % os.name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  | # get_python_lib() | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  |          | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-25 02:09:14 +00:00
										 |  |  | def customize_compiler (compiler): | 
					
						
							|  |  |  |     """Do any platform-specific customization of the CCompiler instance
 | 
					
						
							|  |  |  |     'compiler'.  Mainly needed on Unix, so we can plug in the information | 
					
						
							|  |  |  |     that varies across Unices and is stored in Python's Makefile. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     if compiler.compiler_type == "unix": | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |         (cc, opt, ccshared, ldshared, so_ext) = \ | 
					
						
							|  |  |  |             get_config_vars('CC', 'OPT', 'CCSHARED', 'LDSHARED', 'SO') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cc_cmd = cc + ' ' + opt | 
					
						
							| 
									
										
										
										
											2000-06-25 02:09:14 +00:00
										 |  |  |         compiler.set_executables( | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |             preprocessor=cc + " -E",    # not always! | 
					
						
							| 
									
										
										
										
											2000-06-25 02:09:14 +00:00
										 |  |  |             compiler=cc_cmd, | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |             compiler_so=cc_cmd + ' ' + ccshared, | 
					
						
							|  |  |  |             linker_so=ldshared, | 
					
						
							|  |  |  |             linker_exe=cc) | 
					
						
							| 
									
										
										
										
											2000-06-25 02:09:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |         compiler.shared_lib_extension = so_ext | 
					
						
							| 
									
										
										
										
											2000-06-25 02:09:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | def get_config_h_filename(): | 
					
						
							| 
									
										
										
										
											1999-01-06 16:28:34 +00:00
										 |  |  |     """Return full pathname of installed config.h file.""" | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     inc_dir = get_python_inc(plat_specific=1) | 
					
						
							|  |  |  |     return os.path.join(inc_dir, "config.h") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | def get_makefile_filename(): | 
					
						
							| 
									
										
										
										
											1999-01-06 16:28:34 +00:00
										 |  |  |     """Return full pathname of installed Makefile from the Python build.""" | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     lib_dir = get_python_lib(plat_specific=1, standard_lib=1) | 
					
						
							|  |  |  |     return os.path.join(lib_dir, "config", "Makefile") | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | def parse_config_h(fp, g=None): | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     """Parse a config.h-style file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A dictionary containing name/value pairs is returned.  If an | 
					
						
							|  |  |  |     optional dictionary is passed in as the second argument, it is | 
					
						
							|  |  |  |     used instead of a new dictionary. | 
					
						
							| 
									
										
										
										
											1999-01-06 16:28:34 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  |     if g is None: | 
					
						
							|  |  |  |         g = {} | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |     define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n") | 
					
						
							|  |  |  |     undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n") | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  |     # | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |     while 1: | 
					
						
							|  |  |  |         line = fp.readline() | 
					
						
							|  |  |  |         if not line: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |         m = define_rx.match(line) | 
					
						
							|  |  |  |         if m: | 
					
						
							|  |  |  |             n, v = m.group(1, 2) | 
					
						
							| 
									
										
										
										
											1998-12-22 12:42:04 +00:00
										 |  |  |             try: v = string.atoi(v) | 
					
						
							|  |  |  |             except ValueError: pass | 
					
						
							|  |  |  |             g[n] = v | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |         else: | 
					
						
							|  |  |  |             m = undef_rx.match(line) | 
					
						
							|  |  |  |             if m: | 
					
						
							|  |  |  |                 g[m.group(1)] = 0 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  |     return g | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Regexes needed for parsing Makefile (and similar syntaxes, | 
					
						
							|  |  |  | # like old-style Setup files). | 
					
						
							|  |  |  | _variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") | 
					
						
							|  |  |  | _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") | 
					
						
							|  |  |  | _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 00:03:13 +00:00
										 |  |  | def parse_makefile(fn, g=None): | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     """Parse a Makefile-style file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A dictionary containing name/value pairs is returned.  If an | 
					
						
							|  |  |  |     optional dictionary is passed in as the second argument, it is | 
					
						
							|  |  |  |     used instead of a new dictionary. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 16:28:34 +00:00
										 |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2000-09-15 00:03:13 +00:00
										 |  |  |     from distutils.text_file import TextFile | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  |     fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1) | 
					
						
							| 
									
										
										
										
											2000-09-15 00:03:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  |     if g is None: | 
					
						
							|  |  |  |         g = {} | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |     done = {} | 
					
						
							|  |  |  |     notdone = {} | 
					
						
							| 
									
										
										
										
											2000-09-15 00:03:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |     while 1: | 
					
						
							|  |  |  |         line = fp.readline() | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  |         if line is None:                # eof | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |             break | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  |         m = _variable_rx.match(line) | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |         if m: | 
					
						
							|  |  |  |             n, v = m.group(1, 2) | 
					
						
							| 
									
										
										
										
											1998-12-22 12:42:04 +00:00
										 |  |  |             v = string.strip(v) | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |             if "$" in v: | 
					
						
							|  |  |  |                 notdone[n] = v | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											1998-12-22 12:42:04 +00:00
										 |  |  |                 try: v = string.atoi(v) | 
					
						
							|  |  |  |                 except ValueError: pass | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |                 done[n] = v | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # do variable interpolation here | 
					
						
							|  |  |  |     while notdone: | 
					
						
							|  |  |  |         for name in notdone.keys(): | 
					
						
							|  |  |  |             value = notdone[name] | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  |             m = _findvar1_rx.search(value) or _findvar2_rx.search(value) | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |             if m: | 
					
						
							|  |  |  |                 n = m.group(1) | 
					
						
							|  |  |  |                 if done.has_key(n): | 
					
						
							|  |  |  |                     after = value[m.end():] | 
					
						
							|  |  |  |                     value = value[:m.start()] + done[n] + after | 
					
						
							|  |  |  |                     if "$" in after: | 
					
						
							|  |  |  |                         notdone[name] = value | 
					
						
							|  |  |  |                     else: | 
					
						
							| 
									
										
										
										
											1998-12-22 12:42:04 +00:00
										 |  |  |                         try: value = string.atoi(value) | 
					
						
							|  |  |  |                         except ValueError: pass | 
					
						
							|  |  |  |                         done[name] = string.strip(value) | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |                         del notdone[name] | 
					
						
							|  |  |  |                 elif notdone.has_key(n): | 
					
						
							|  |  |  |                     # get it on a subsequent round | 
					
						
							|  |  |  |                     pass | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     done[n] = "" | 
					
						
							|  |  |  |                     after = value[m.end():] | 
					
						
							|  |  |  |                     value = value[:m.start()] + after | 
					
						
							|  |  |  |                     if "$" in after: | 
					
						
							|  |  |  |                         notdone[name] = value | 
					
						
							|  |  |  |                     else: | 
					
						
							| 
									
										
										
										
											1998-12-22 12:42:04 +00:00
										 |  |  |                         try: value = string.atoi(value) | 
					
						
							|  |  |  |                         except ValueError: pass | 
					
						
							|  |  |  |                         done[name] = string.strip(value) | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |                         del notdone[name] | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											1998-12-22 12:42:04 +00:00
										 |  |  |                 # bogus variable reference; just drop it since we can't deal | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |                 del notdone[name] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  |     fp.close() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  |     # save the results in the global dictionary | 
					
						
							|  |  |  |     g.update(done) | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  |     return g | 
					
						
							| 
									
										
										
										
											1998-12-18 23:46:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-17 00:53:02 +00:00
										 |  |  | def expand_makefile_vars(s, vars): | 
					
						
							|  |  |  |     """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
 | 
					
						
							|  |  |  |     'string' according to 'vars' (a dictionary mapping variable names to | 
					
						
							|  |  |  |     values).  Variables not present in 'vars' are silently expanded to the | 
					
						
							|  |  |  |     empty string.  The variable values in 'vars' should not contain further | 
					
						
							|  |  |  |     variable expansions; if 'vars' is the output of 'parse_makefile()', | 
					
						
							|  |  |  |     you're fine.  Returns a variable-expanded version of 's'. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # This algorithm does multiple expansion, so if vars['foo'] contains | 
					
						
							|  |  |  |     # "${bar}", it will expand ${foo} to ${bar}, and then expand | 
					
						
							|  |  |  |     # ${bar}... and so forth.  This is fine as long as 'vars' comes from | 
					
						
							|  |  |  |     # 'parse_makefile()', which takes care of such expansions eagerly, | 
					
						
							|  |  |  |     # according to make's variable expansion semantics. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while 1: | 
					
						
							|  |  |  |         m = _findvar1_rx.search(s) or _findvar2_rx.search(s) | 
					
						
							|  |  |  |         if m: | 
					
						
							|  |  |  |             name = m.group(1) | 
					
						
							|  |  |  |             (beg, end) = m.span() | 
					
						
							|  |  |  |             s = s[0:beg] + vars.get(m.group(1)) + s[end:] | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             break | 
					
						
							|  |  |  |     return s | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  | _config_vars = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | def _init_posix(): | 
					
						
							| 
									
										
										
										
											1999-01-06 16:28:34 +00:00
										 |  |  |     """Initialize the module as appropriate for POSIX systems.""" | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |     g = {} | 
					
						
							| 
									
										
										
										
											2000-02-02 00:05:14 +00:00
										 |  |  |     # load the installed Makefile: | 
					
						
							| 
									
										
										
										
											2000-05-23 23:14:00 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         filename = get_makefile_filename() | 
					
						
							| 
									
										
										
										
											2000-09-15 00:03:13 +00:00
										 |  |  |         parse_makefile(filename, g) | 
					
						
							| 
									
										
										
										
											2000-05-23 23:14:00 +00:00
										 |  |  |     except IOError, msg: | 
					
						
							|  |  |  |         my_msg = "invalid Python installation: unable to open %s" % filename | 
					
						
							|  |  |  |         if hasattr(msg, "strerror"): | 
					
						
							|  |  |  |             my_msg = my_msg + " (%s)" % msg.strerror | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         raise DistutilsPlatformError, my_msg | 
					
						
							|  |  |  |                | 
					
						
							| 
									
										
										
										
											2000-06-27 01:59:06 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     # On AIX, there are wrong paths to the linker scripts in the Makefile | 
					
						
							|  |  |  |     # -- these paths are relative to the Python source, but when installed | 
					
						
							|  |  |  |     # the scripts are in another directory. | 
					
						
							| 
									
										
										
										
											2000-06-27 01:59:43 +00:00
										 |  |  |     if sys.platform == 'aix4':          # what about AIX 3.x ? | 
					
						
							| 
									
										
										
										
											2000-06-27 01:59:06 +00:00
										 |  |  |         # Linker script is in the config directory, not in Modules as the | 
					
						
							|  |  |  |         # Makefile says. | 
					
						
							|  |  |  |         python_lib = get_python_lib(standard_lib=1) | 
					
						
							|  |  |  |         ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix') | 
					
						
							|  |  |  |         python_exp = os.path.join(python_lib, 'config', 'python.exp') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp) | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |     elif sys.platform == 'beos': | 
					
						
							| 
									
										
										
										
											2000-09-01 01:23:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Linker script is in the config directory.  In the Makefile it is | 
					
						
							|  |  |  |         # relative to the srcdir, which after installation no longer makes | 
					
						
							|  |  |  |         # sense. | 
					
						
							|  |  |  |         python_lib = get_python_lib(standard_lib=1) | 
					
						
							|  |  |  |         linkerscript_name = os.path.basename(string.split(g['LDSHARED'])[0]) | 
					
						
							|  |  |  |         linkerscript = os.path.join(python_lib, 'config', linkerscript_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # XXX this isn't the right place to do this: adding the Python | 
					
						
							|  |  |  |         # library to the link, if needed, should be in the "build_ext" | 
					
						
							|  |  |  |         # command.  (It's also needed for non-MS compilers on Windows, and | 
					
						
							|  |  |  |         # it's taken care of for them by the 'build_ext.get_libraries()' | 
					
						
							|  |  |  |         # method.) | 
					
						
							|  |  |  |         g['LDSHARED'] = ("%s -L%s/lib -lpython%s" % | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |                          (linkerscript, PREFIX, sys.version[0:3])) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     global _config_vars | 
					
						
							|  |  |  |     _config_vars = g | 
					
						
							| 
									
										
										
										
											2000-09-01 01:23:26 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-06-08 01:58:36 +00:00
										 |  |  | def _init_nt(): | 
					
						
							|  |  |  |     """Initialize the module as appropriate for NT""" | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |     g = {} | 
					
						
							| 
									
										
										
										
											1999-06-08 01:58:36 +00:00
										 |  |  |     # set basic install directories | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1) | 
					
						
							|  |  |  |     g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1) | 
					
						
							| 
									
										
										
										
											1999-06-08 01:58:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-08-29 18:22:13 +00:00
										 |  |  |     # XXX hmmm.. a normal install puts include files here | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     g['INCLUDEPY'] = get_python_inc(plat_specific=0) | 
					
						
							| 
									
										
										
										
											1999-08-29 18:22:13 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-08 15:55:42 +00:00
										 |  |  |     g['SO'] = '.pyd' | 
					
						
							| 
									
										
										
										
											2000-06-03 00:44:30 +00:00
										 |  |  |     g['EXE'] = ".exe" | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     global _config_vars | 
					
						
							|  |  |  |     _config_vars = g | 
					
						
							| 
									
										
										
										
											2000-06-03 00:44:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-02-08 15:55:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-03-07 03:30:09 +00:00
										 |  |  | def _init_mac(): | 
					
						
							|  |  |  |     """Initialize the module as appropriate for Macintosh systems""" | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |     g = {} | 
					
						
							| 
									
										
										
										
											2000-03-07 03:30:09 +00:00
										 |  |  |     # set basic install directories | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1) | 
					
						
							|  |  |  |     g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1) | 
					
						
							| 
									
										
										
										
											2000-03-07 03:30:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # XXX hmmm.. a normal install puts include files here | 
					
						
							| 
									
										
										
										
											2000-03-09 15:54:52 +00:00
										 |  |  |     g['INCLUDEPY'] = get_python_inc(plat_specific=0) | 
					
						
							| 
									
										
										
										
											2000-03-07 03:30:09 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     g['SO'] = '.ppc.slb' | 
					
						
							| 
									
										
										
										
											2000-03-09 03:16:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # XXX are these used anywhere? | 
					
						
							| 
									
										
										
										
											2000-04-10 01:15:06 +00:00
										 |  |  |     g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib") | 
					
						
							|  |  |  |     g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib") | 
					
						
							| 
									
										
										
										
											2000-03-07 03:30:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |     global _config_vars | 
					
						
							|  |  |  |     _config_vars = g | 
					
						
							| 
									
										
										
										
											2000-03-07 03:30:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-01-06 14:46:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  | def get_config_vars(*args): | 
					
						
							|  |  |  |     """With no arguments, return a dictionary of all configuration
 | 
					
						
							|  |  |  |     variables relevant for the current platform.  Generally this includes | 
					
						
							|  |  |  |     everything needed to build extensions and install both pure modules and | 
					
						
							|  |  |  |     extensions.  On Unix, this means every variable defined in Python's | 
					
						
							|  |  |  |     installed Makefile; on Windows and Mac OS it's a much smaller set. | 
					
						
							| 
									
										
										
										
											2000-02-08 15:55:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-15 01:15:08 +00:00
										 |  |  |     With arguments, return a list of values that result from looking up | 
					
						
							|  |  |  |     each argument in the configuration variable dictionary. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     global _config_vars | 
					
						
							|  |  |  |     if _config_vars is None: | 
					
						
							|  |  |  |         from pprint import pprint | 
					
						
							|  |  |  |         func = globals().get("_init_" + os.name) | 
					
						
							|  |  |  |         if func: | 
					
						
							|  |  |  |             func() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             _config_vars = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Normalized versions of prefix and exec_prefix are handy to have; | 
					
						
							|  |  |  |         # in fact, these are the standard versions used most places in the | 
					
						
							|  |  |  |         # Distutils. | 
					
						
							|  |  |  |         _config_vars['prefix'] = PREFIX | 
					
						
							|  |  |  |         _config_vars['exec_prefix'] = EXEC_PREFIX | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if args: | 
					
						
							|  |  |  |         vals = [] | 
					
						
							|  |  |  |         for name in args: | 
					
						
							|  |  |  |             vals.append(_config_vars.get(name)) | 
					
						
							|  |  |  |         return vals | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         return _config_vars | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_config_var(name): | 
					
						
							|  |  |  |     """Return the value of a single variable using the dictionary
 | 
					
						
							|  |  |  |     returned by 'get_config_vars()'.  Equivalent to | 
					
						
							|  |  |  |       get_config_vars().get(name) | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return get_config_vars().get(name) |