]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/distutils/sysconfig.py
   1 """Provide access to Python's configuration information.  The specific 
   2 configuration variables available depend heavily on the platform and 
   3 configuration.  The values may be retrieved using 
   4 get_config_var(name), and the list of variables is available via 
   5 get_config_vars().keys().  Additional convenience functions are also 
   8 Written by:   Fred L. Drake, Jr. 
   9 Email:        <fdrake@acm.org> 
  19 from errors 
import DistutilsPlatformError
 
  21 # These are needed in a couple of spots, so just compute them once. 
  22 PREFIX 
= os
.path
.normpath(sys
.prefix
) 
  23 EXEC_PREFIX 
= os
.path
.normpath(sys
.exec_prefix
) 
  25 # python_build: (Boolean) if true, we're either building Python or 
  26 # building an extension with an un-installed Python, so we use 
  27 # different (hard-wired) directories. 
  29 argv0_path 
= os
.path
.dirname(os
.path
.abspath(sys
.executable
)) 
  30 landmark 
= os
.path
.join(argv0_path
, "Modules", "Setup") 
  32 python_build 
= os
.path
.isfile(landmark
) 
  34 del argv0_path
, landmark
 
  37 def get_python_version (): 
  38     """Return a string containing the major and minor Python version, 
  39     leaving off the patchlevel.  Sample return values could be '1.5' 
  42     return sys
.version
[:3] 
  45 def get_python_inc(plat_specific
=0, prefix
=None): 
  46     """Return the directory containing installed Python header files. 
  48     If 'plat_specific' is false (the default), this is the path to the 
  49     non-platform-specific header files, i.e. Python.h and so on; 
  50     otherwise, this is the path to platform-specific header files 
  53     If 'prefix' is supplied, use it instead of sys.prefix or 
  54     sys.exec_prefix -- i.e., ignore 'plat_specific'. 
  57         prefix 
= plat_specific 
and EXEC_PREFIX 
or PREFIX
 
  58     if os
.name 
== "posix": 
  60             base 
= os
.path
.dirname(os
.path
.abspath(sys
.executable
)) 
  64                 inc_dir 
= os
.path
.join(base
, "Include") 
  65                 if not os
.path
.exists(inc_dir
): 
  66                     inc_dir 
= os
.path
.join(os
.path
.dirname(base
), "Include") 
  68         return os
.path
.join(prefix
, "include", "python" + sys
.version
[:3]) 
  70         return os
.path
.join(prefix
, "include") 
  71     elif os
.name 
== "mac": 
  73                 return os
.path
.join(prefix
, "Mac", "Include") 
  75                 return os
.path
.join(prefix
, "Include") 
  76     elif os
.name 
== "os2": 
  77         return os
.path
.join(prefix
, "Include") 
  79         raise DistutilsPlatformError( 
  80             "I don't know where Python installs its C header files " 
  81             "on platform '%s'" % os
.name
) 
  84 def get_python_lib(plat_specific
=0, standard_lib
=0, prefix
=None): 
  85     """Return the directory containing the Python library (standard or 
  88     If 'plat_specific' is true, return the directory containing 
  89     platform-specific modules, i.e. any module from a non-pure-Python 
  90     module distribution; otherwise, return the platform-shared library 
  91     directory.  If 'standard_lib' is true, return the directory 
  92     containing standard Python library modules; otherwise, return the 
  93     directory for site-specific modules. 
  95     If 'prefix' is supplied, use it instead of sys.prefix or 
  96     sys.exec_prefix -- i.e., ignore 'plat_specific'. 
  99         prefix 
= plat_specific 
and EXEC_PREFIX 
or PREFIX
 
 101     if os
.name 
== "posix": 
 102         libpython 
= os
.path
.join(prefix
, 
 103                                  "lib", "python" + get_python_version()) 
 107             return os
.path
.join(libpython
, "site-packages") 
 109     elif os
.name 
== "nt": 
 111             return os
.path
.join(prefix
, "Lib") 
 113             if sys
.version 
< "2.2": 
 116                 return os
.path
.join(PREFIX
, "Lib", "site-packages") 
 118     elif os
.name 
== "mac": 
 121                 return os
.path
.join(prefix
, "Lib", "lib-dynload") 
 123                 return os
.path
.join(prefix
, "Lib", "site-packages") 
 126                 return os
.path
.join(prefix
, "Lib") 
 128                 return os
.path
.join(prefix
, "Lib", "site-packages") 
 130     elif os
.name 
== "os2": 
 132             return os
.path
.join(PREFIX
, "Lib") 
 134             return os
.path
.join(PREFIX
, "Lib", "site-packages") 
 137         raise DistutilsPlatformError( 
 138             "I don't know where Python installs its library " 
 139             "on platform '%s'" % os
.name
) 
 142 def customize_compiler(compiler
): 
 143     """Do any platform-specific customization of a CCompiler instance. 
 145     Mainly needed on Unix, so we can plug in the information that 
 146     varies across Unices and is stored in Python's Makefile. 
 148     if compiler
.compiler_type 
== "unix": 
 149         (cc
, cxx
, opt
, basecflags
, ccshared
, ldshared
, so_ext
) = \
 
 150             get_config_vars('CC', 'CXX', 'OPT', 'BASECFLAGS', 'CCSHARED', 'LDSHARED', 'SO') 
 152         if os
.environ
.has_key('CC'): 
 153             cc 
= os
.environ
['CC'] 
 154         if os
.environ
.has_key('CXX'): 
 155             cxx 
= os
.environ
['CXX'] 
 156         if os
.environ
.has_key('CPP'): 
 157             cpp 
= os
.environ
['CPP'] 
 159             cpp 
= cc 
+ " -E"           # not always 
 160         if os
.environ
.has_key('LDFLAGS'): 
 161             ldshared 
= ldshared 
+ ' ' + os
.environ
['LDFLAGS'] 
 163                 opt 
= basecflags 
+ ' ' + opt
 
 164         if os
.environ
.has_key('CFLAGS'): 
 165             opt 
= opt 
+ ' ' + os
.environ
['CFLAGS'] 
 166             ldshared 
= ldshared 
+ ' ' + os
.environ
['CFLAGS'] 
 167         if os
.environ
.has_key('CPPFLAGS'): 
 168             cpp 
= cpp 
+ ' ' + os
.environ
['CPPFLAGS'] 
 169             opt 
= opt 
+ ' ' + os
.environ
['CPPFLAGS'] 
 170             ldshared 
= ldshared 
+ ' ' + os
.environ
['CPPFLAGS'] 
 172         cc_cmd 
= cc 
+ ' ' + opt
 
 173         compiler
.set_executables( 
 176             compiler_so
=cc_cmd 
+ ' ' + ccshared
, 
 181         compiler
.shared_lib_extension 
= so_ext
 
 184 def get_config_h_filename(): 
 185     """Return full pathname of installed pyconfig.h file.""" 
 189         inc_dir 
= get_python_inc(plat_specific
=1) 
 190     if sys
.version 
< '2.2': 
 191         config_h 
= 'config.h' 
 193         # The name of the config.h file changed in 2.2 
 194         config_h 
= 'pyconfig.h' 
 195     return os
.path
.join(inc_dir
, config_h
) 
 198 def get_makefile_filename(): 
 199     """Return full pathname of installed Makefile from the Python build.""" 
 201         return os
.path
.join(os
.path
.dirname(sys
.executable
), "Makefile") 
 202     lib_dir 
= get_python_lib(plat_specific
=1, standard_lib
=1) 
 203     return os
.path
.join(lib_dir
, "config", "Makefile") 
 206 def parse_config_h(fp
, g
=None): 
 207     """Parse a config.h-style file. 
 209     A dictionary containing name/value pairs is returned.  If an 
 210     optional dictionary is passed in as the second argument, it is 
 211     used instead of a new dictionary. 
 215     define_rx 
= re
.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n") 
 216     undef_rx 
= re
.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n") 
 222         m 
= define_rx
.match(line
) 
 226             except ValueError: pass 
 229             m 
= undef_rx
.match(line
) 
 235 # Regexes needed for parsing Makefile (and similar syntaxes, 
 236 # like old-style Setup files). 
 237 _variable_rx 
= re
.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") 
 238 _findvar1_rx 
= re
.compile(r
"\$\(([A-Za-z][A-Za-z0-9_]*)\)") 
 239 _findvar2_rx 
= re
.compile(r
"\${([A-Za-z][A-Za-z0-9_]*)}") 
 241 def parse_makefile(fn
, g
=None): 
 242     """Parse a Makefile-style file. 
 244     A dictionary containing name/value pairs is returned.  If an 
 245     optional dictionary is passed in as the second argument, it is 
 246     used instead of a new dictionary. 
 248     from distutils
.text_file 
import TextFile
 
 249     fp 
= TextFile(fn
, strip_comments
=1, skip_blanks
=1, join_lines
=1) 
 258         if line 
is None:                # eof 
 260         m 
= _variable_rx
.match(line
) 
 268                 except ValueError: pass 
 271     # do variable interpolation here 
 273         for name 
in notdone
.keys(): 
 274             value 
= notdone
[name
] 
 275             m 
= _findvar1_rx
.search(value
) or _findvar2_rx
.search(value
) 
 279                     after 
= value
[m
.end():] 
 280                     value 
= value
[:m
.start()] + str(done
[n
]) + after
 
 282                         notdone
[name
] = value
 
 284                         try: value 
= int(value
) 
 286                             done
[name
] = string
.strip(value
) 
 290                 elif notdone
.has_key(n
): 
 291                     # get it on a subsequent round 
 295                     after 
= value
[m
.end():] 
 296                     value 
= value
[:m
.start()] + after
 
 298                         notdone
[name
] = value
 
 300                         try: value 
= int(value
) 
 302                             done
[name
] = string
.strip(value
) 
 307                 # bogus variable reference; just drop it since we can't deal 
 312     # save the results in the global dictionary 
 317 def expand_makefile_vars(s
, vars): 
 318     """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in 
 319     'string' according to 'vars' (a dictionary mapping variable names to 
 320     values).  Variables not present in 'vars' are silently expanded to the 
 321     empty string.  The variable values in 'vars' should not contain further 
 322     variable expansions; if 'vars' is the output of 'parse_makefile()', 
 323     you're fine.  Returns a variable-expanded version of 's'. 
 326     # This algorithm does multiple expansion, so if vars['foo'] contains 
 327     # "${bar}", it will expand ${foo} to ${bar}, and then expand 
 328     # ${bar}... and so forth.  This is fine as long as 'vars' comes from 
 329     # 'parse_makefile()', which takes care of such expansions eagerly, 
 330     # according to make's variable expansion semantics. 
 333         m 
= _findvar1_rx
.search(s
) or _findvar2_rx
.search(s
) 
 335             (beg
, end
) = m
.span() 
 336             s 
= s
[0:beg
] + vars.get(m
.group(1)) + s
[end
:] 
 345     """Initialize the module as appropriate for POSIX systems.""" 
 347     # load the installed Makefile: 
 349         filename 
= get_makefile_filename() 
 350         parse_makefile(filename
, g
) 
 352         my_msg 
= "invalid Python installation: unable to open %s" % filename
 
 353         if hasattr(msg
, "strerror"): 
 354             my_msg 
= my_msg 
+ " (%s)" % msg
.strerror
 
 356         raise DistutilsPlatformError(my_msg
) 
 359     # On AIX, there are wrong paths to the linker scripts in the Makefile 
 360     # -- these paths are relative to the Python source, but when installed 
 361     # the scripts are in another directory. 
 363         g
['LDSHARED'] = g
['BLDSHARED'] 
 365     elif sys
.version 
< '2.1': 
 366         # The following two branches are for 1.5.2 compatibility. 
 367         if sys
.platform 
== 'aix4':          # what about AIX 3.x ? 
 368             # Linker script is in the config directory, not in Modules as the 
 370             python_lib 
= get_python_lib(standard_lib
=1) 
 371             ld_so_aix 
= os
.path
.join(python_lib
, 'config', 'ld_so_aix') 
 372             python_exp 
= os
.path
.join(python_lib
, 'config', 'python.exp') 
 374             g
['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix
, g
['CC'], python_exp
) 
 376         elif sys
.platform 
== 'beos': 
 377             # Linker script is in the config directory.  In the Makefile it is 
 378             # relative to the srcdir, which after installation no longer makes 
 380             python_lib 
= get_python_lib(standard_lib
=1) 
 381             linkerscript_path 
= string
.split(g
['LDSHARED'])[0] 
 382             linkerscript_name 
= os
.path
.basename(linkerscript_path
) 
 383             linkerscript 
= os
.path
.join(python_lib
, 'config', 
 386             # XXX this isn't the right place to do this: adding the Python 
 387             # library to the link, if needed, should be in the "build_ext" 
 388             # command.  (It's also needed for non-MS compilers on Windows, and 
 389             # it's taken care of for them by the 'build_ext.get_libraries()' 
 391             g
['LDSHARED'] = ("%s -L%s/lib -lpython%s" % 
 392                              (linkerscript
, PREFIX
, sys
.version
[0:3])) 
 399     """Initialize the module as appropriate for NT""" 
 401     # set basic install directories 
 402     g
['LIBDEST'] = get_python_lib(plat_specific
=0, standard_lib
=1) 
 403     g
['BINLIBDEST'] = get_python_lib(plat_specific
=1, standard_lib
=1) 
 405     # XXX hmmm.. a normal install puts include files here 
 406     g
['INCLUDEPY'] = get_python_inc(plat_specific
=0) 
 416     """Initialize the module as appropriate for Macintosh systems""" 
 418     # set basic install directories 
 419     g
['LIBDEST'] = get_python_lib(plat_specific
=0, standard_lib
=1) 
 420     g
['BINLIBDEST'] = get_python_lib(plat_specific
=1, standard_lib
=1) 
 422     # XXX hmmm.. a normal install puts include files here 
 423     g
['INCLUDEPY'] = get_python_inc(plat_specific
=0) 
 426     if not hasattr(MacOS
, 'runtimemodel'): 
 429         g
['SO'] = '.%s.slb' % MacOS
.runtimemodel
 
 431     # XXX are these used anywhere? 
 432     g
['install_lib'] = os
.path
.join(EXEC_PREFIX
, "Lib") 
 433     g
['install_platlib'] = os
.path
.join(EXEC_PREFIX
, "Mac", "Lib") 
 435     # These are used by the extension module build 
 442     """Initialize the module as appropriate for OS/2""" 
 444     # set basic install directories 
 445     g
['LIBDEST'] = get_python_lib(plat_specific
=0, standard_lib
=1) 
 446     g
['BINLIBDEST'] = get_python_lib(plat_specific
=1, standard_lib
=1) 
 448     # XXX hmmm.. a normal install puts include files here 
 449     g
['INCLUDEPY'] = get_python_inc(plat_specific
=0) 
 458 def get_config_vars(*args
): 
 459     """With no arguments, return a dictionary of all configuration 
 460     variables relevant for the current platform.  Generally this includes 
 461     everything needed to build extensions and install both pure modules and 
 462     extensions.  On Unix, this means every variable defined in Python's 
 463     installed Makefile; on Windows and Mac OS it's a much smaller set. 
 465     With arguments, return a list of values that result from looking up 
 466     each argument in the configuration variable dictionary. 
 469     if _config_vars 
is None: 
 470         func 
= globals().get("_init_" + os
.name
) 
 476         # Normalized versions of prefix and exec_prefix are handy to have; 
 477         # in fact, these are the standard versions used most places in the 
 479         _config_vars
['prefix'] = PREFIX
 
 480         _config_vars
['exec_prefix'] = EXEC_PREFIX
 
 485             vals
.append(_config_vars
.get(name
)) 
 490 def get_config_var(name
): 
 491     """Return the value of a single variable using the dictionary 
 492     returned by 'get_config_vars()'.  Equivalent to 
 493     get_config_vars().get(name) 
 495     return get_config_vars().get(name
)