NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

sysconfig.py (12704B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\sysconfig.py
      2 __revision__ = '$Id: sysconfig.py 87602 2011-01-01 04:24:26Z richard.tew $'
      3 import os
      4 import re
      5 import string
      6 import sys
      7 from distutils.errors import DistutilsPlatformError
      8 PREFIX = os.path.normpath(sys.prefix)
      9 EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
     10 project_base = os.path.dirname(os.path.abspath(sys.executable))
     11 if os.name == 'nt' and 'pcbuild' in project_base[-8:].lower():
     12     project_base = os.path.abspath(os.path.join(project_base, os.path.pardir))
     13 if os.name == 'nt' and '\\pc\\v' in project_base[-10:].lower():
     14     project_base = os.path.abspath(os.path.join(project_base, os.path.pardir, os.path.pardir))
     15 if os.name == 'nt' and '\\pcbuild\\amd64' in project_base[-14:].lower():
     16     project_base = os.path.abspath(os.path.join(project_base, os.path.pardir, os.path.pardir))
     17 
     18 def _python_build():
     19     for fn in ('Setup.dist', 'Setup.local'):
     20         if os.path.isfile(os.path.join(project_base, 'Modules', fn)):
     21             return True
     22 
     23     return False
     24 
     25 
     26 python_build = _python_build()
     27 
     28 def get_python_version():
     29     return sys.version[:3]
     30 
     31 
     32 def get_python_inc(plat_specific = 0, prefix = None):
     33     if prefix is None:
     34         prefix = plat_specific and EXEC_PREFIX or PREFIX
     35     if os.name == 'posix':
     36         if python_build:
     37             buildir = os.path.dirname(sys.executable)
     38             if plat_specific:
     39                 inc_dir = buildir
     40             else:
     41                 srcdir = os.path.abspath(os.path.join(buildir, get_config_var('srcdir')))
     42                 inc_dir = os.path.join(srcdir, 'Include')
     43             return inc_dir
     44         return os.path.join(prefix, 'include', 'python' + get_python_version())
     45     if os.name == 'nt':
     46         return os.path.join(prefix, 'include')
     47     if os.name == 'os2':
     48         return os.path.join(prefix, 'Include')
     49     raise DistutilsPlatformError("I don't know where Python installs its C header files on platform '%s'" % os.name)
     50 
     51 
     52 def get_python_lib(plat_specific = 0, standard_lib = 0, prefix = None):
     53     if prefix is None:
     54         prefix = plat_specific and EXEC_PREFIX or PREFIX
     55     if os.name == 'posix':
     56         libpython = os.path.join(prefix, 'lib', 'python' + get_python_version())
     57         if standard_lib:
     58             return libpython
     59         else:
     60             return os.path.join(libpython, 'site-packages')
     61     elif os.name == 'nt':
     62         if standard_lib:
     63             return os.path.join(prefix, 'Lib')
     64         elif get_python_version() < '2.2':
     65             return prefix
     66         else:
     67             return os.path.join(prefix, 'Lib', 'site-packages')
     68     elif os.name == 'os2':
     69         if standard_lib:
     70             return os.path.join(prefix, 'Lib')
     71         else:
     72             return os.path.join(prefix, 'Lib', 'site-packages')
     73     else:
     74         raise DistutilsPlatformError("I don't know where Python installs its library on platform '%s'" % os.name)
     75 
     76 
     77 def customize_compiler(compiler):
     78     if compiler.compiler_type == 'unix':
     79         cc, cxx, opt, cflags, ccshared, ldshared, so_ext = get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO')
     80         if 'CC' in os.environ:
     81             cc = os.environ['CC']
     82         if 'CXX' in os.environ:
     83             cxx = os.environ['CXX']
     84         if 'LDSHARED' in os.environ:
     85             ldshared = os.environ['LDSHARED']
     86         if 'CPP' in os.environ:
     87             cpp = os.environ['CPP']
     88         else:
     89             cpp = cc + ' -E'
     90         if 'LDFLAGS' in os.environ:
     91             ldshared = ldshared + ' ' + os.environ['LDFLAGS']
     92         if 'CFLAGS' in os.environ:
     93             cflags = opt + ' ' + os.environ['CFLAGS']
     94             ldshared = ldshared + ' ' + os.environ['CFLAGS']
     95         if 'CPPFLAGS' in os.environ:
     96             cpp = cpp + ' ' + os.environ['CPPFLAGS']
     97             cflags = cflags + ' ' + os.environ['CPPFLAGS']
     98             ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
     99         cc_cmd = cc + ' ' + cflags
    100         compiler.set_executables(preprocessor=cpp, compiler=cc_cmd, compiler_so=cc_cmd + ' ' + ccshared, compiler_cxx=cxx, linker_so=ldshared, linker_exe=cc)
    101         compiler.shared_lib_extension = so_ext
    102 
    103 
    104 def get_config_h_filename():
    105     if python_build:
    106         if os.name == 'nt':
    107             inc_dir = os.path.join(project_base, 'PC')
    108         else:
    109             inc_dir = project_base
    110     else:
    111         inc_dir = get_python_inc(plat_specific=1)
    112     if get_python_version() < '2.2':
    113         config_h = 'config.h'
    114     else:
    115         config_h = 'pyconfig.h'
    116     return os.path.join(inc_dir, config_h)
    117 
    118 
    119 def get_makefile_filename():
    120     if python_build:
    121         return os.path.join(os.path.dirname(sys.executable), 'Makefile')
    122     lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
    123     return os.path.join(lib_dir, 'config', 'Makefile')
    124 
    125 
    126 def parse_config_h(fp, g = None):
    127     if g is None:
    128         g = {}
    129     define_rx = re.compile('#define ([A-Z][A-Za-z0-9_]+) (.*)\n')
    130     undef_rx = re.compile('/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n')
    131     while 1:
    132         line = fp.readline()
    133         if not line:
    134             break
    135         m = define_rx.match(line)
    136         if m:
    137             n, v = m.group(1, 2)
    138             try:
    139                 v = int(v)
    140             except ValueError:
    141                 pass
    142 
    143             g[n] = v
    144         else:
    145             m = undef_rx.match(line)
    146             if m:
    147                 g[m.group(1)] = 0
    148 
    149     return g
    150 
    151 
    152 _variable_rx = re.compile('([a-zA-Z][a-zA-Z0-9_]+)\\s*=\\s*(.*)')
    153 _findvar1_rx = re.compile('\\$\\(([A-Za-z][A-Za-z0-9_]*)\\)')
    154 _findvar2_rx = re.compile('\\${([A-Za-z][A-Za-z0-9_]*)}')
    155 
    156 def parse_makefile(fn, g = None):
    157     from distutils.text_file import TextFile
    158     fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
    159     if g is None:
    160         g = {}
    161     done = {}
    162     notdone = {}
    163     while 1:
    164         line = fp.readline()
    165         if line is None:
    166             break
    167         m = _variable_rx.match(line)
    168         if m:
    169             n, v = m.group(1, 2)
    170             v = v.strip()
    171             tmpv = v.replace('$$', '')
    172             if '$' in tmpv:
    173                 notdone[n] = v
    174             else:
    175                 try:
    176                     v = int(v)
    177                 except ValueError:
    178                     done[n] = v.replace('$$', '$')
    179                 else:
    180                     done[n] = v
    181 
    182     while notdone:
    183         for name in notdone.keys():
    184             value = notdone[name]
    185             m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
    186             if m:
    187                 n = m.group(1)
    188                 found = True
    189                 if n in done:
    190                     item = str(done[n])
    191                 elif n in notdone:
    192                     found = False
    193                 elif n in os.environ:
    194                     item = os.environ[n]
    195                 else:
    196                     done[n] = item = ''
    197                 if found:
    198                     after = value[m.end():]
    199                     value = value[:m.start()] + item + after
    200                     if '$' in after:
    201                         notdone[name] = value
    202                     else:
    203                         try:
    204                             value = int(value)
    205                         except ValueError:
    206                             done[name] = value.strip()
    207                         else:
    208                             done[name] = value
    209 
    210                         del notdone[name]
    211             else:
    212                 del notdone[name]
    213 
    214     fp.close()
    215     for k, v in done.items():
    216         if isinstance(v, str):
    217             done[k] = v.strip()
    218 
    219     g.update(done)
    220     return g
    221 
    222 
    223 def expand_makefile_vars(s, vars):
    224     while 1:
    225         m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
    226         if m:
    227             beg, end = m.span()
    228             s = s[0:beg] + vars.get(m.group(1)) + s[end:]
    229         else:
    230             break
    231 
    232     return s
    233 
    234 
    235 _config_vars = None
    236 
    237 def _init_posix():
    238     global _config_vars
    239     g = {}
    240     try:
    241         filename = get_makefile_filename()
    242         parse_makefile(filename, g)
    243     except IOError as msg:
    244         my_msg = 'invalid Python installation: unable to open %s' % filename
    245         if hasattr(msg, 'strerror'):
    246             my_msg = my_msg + ' (%s)' % msg.strerror
    247         raise DistutilsPlatformError(my_msg)
    248 
    249     try:
    250         filename = get_config_h_filename()
    251         parse_config_h(file(filename), g)
    252     except IOError as msg:
    253         my_msg = 'invalid Python installation: unable to open %s' % filename
    254         if hasattr(msg, 'strerror'):
    255             my_msg = my_msg + ' (%s)' % msg.strerror
    256         raise DistutilsPlatformError(my_msg)
    257 
    258     if sys.platform == 'darwin' and 'MACOSX_DEPLOYMENT_TARGET' in g:
    259         cfg_target = g['MACOSX_DEPLOYMENT_TARGET']
    260         cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
    261         if cur_target == '':
    262             cur_target = cfg_target
    263             os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
    264         elif map(int, cfg_target.split('.')) > map(int, cur_target.split('.')):
    265             my_msg = '$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure' % (cur_target, cfg_target)
    266             raise DistutilsPlatformError(my_msg)
    267     if python_build:
    268         g['LDSHARED'] = g['BLDSHARED']
    269     elif get_python_version() < '2.1':
    270         if sys.platform == 'aix4':
    271             python_lib = get_python_lib(standard_lib=1)
    272             ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
    273             python_exp = os.path.join(python_lib, 'config', 'python.exp')
    274             g['LDSHARED'] = '%s %s -bI:%s' % (ld_so_aix, g['CC'], python_exp)
    275         elif sys.platform == 'beos':
    276             python_lib = get_python_lib(standard_lib=1)
    277             linkerscript_path = string.split(g['LDSHARED'])[0]
    278             linkerscript_name = os.path.basename(linkerscript_path)
    279             linkerscript = os.path.join(python_lib, 'config', linkerscript_name)
    280             g['LDSHARED'] = '%s -L%s/lib -lpython%s' % (linkerscript, PREFIX, get_python_version())
    281     _config_vars = g
    282 
    283 
    284 def _init_nt():
    285     global _config_vars
    286     g = {}
    287     g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
    288     g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
    289     g['INCLUDEPY'] = get_python_inc(plat_specific=0)
    290     g['SO'] = '.pyd'
    291     g['EXE'] = '.exe'
    292     g['VERSION'] = get_python_version().replace('.', '')
    293     g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
    294     _config_vars = g
    295 
    296 
    297 def _init_os2():
    298     global _config_vars
    299     g = {}
    300     g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
    301     g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
    302     g['INCLUDEPY'] = get_python_inc(plat_specific=0)
    303     g['SO'] = '.pyd'
    304     g['EXE'] = '.exe'
    305     _config_vars = g
    306 
    307 
    308 def get_config_vars(*args):
    309     global _config_vars
    310     if _config_vars is None:
    311         func = globals().get('_init_' + os.name)
    312         if func:
    313             func()
    314         else:
    315             _config_vars = {}
    316         _config_vars['prefix'] = PREFIX
    317         _config_vars['exec_prefix'] = EXEC_PREFIX
    318         if sys.platform == 'darwin':
    319             kernel_version = os.uname()[2]
    320             major_version = int(kernel_version.split('.')[0])
    321             if major_version < 8:
    322                 for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED', 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
    323                     flags = _config_vars[key]
    324                     flags = re.sub('-arch\\s+\\w+\\s', ' ', flags)
    325                     flags = re.sub('-isysroot [^ \t]*', ' ', flags)
    326                     _config_vars[key] = flags
    327 
    328             else:
    329                 if 'ARCHFLAGS' in os.environ:
    330                     arch = os.environ['ARCHFLAGS']
    331                     for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED', 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
    332                         flags = _config_vars[key]
    333                         flags = re.sub('-arch\\s+\\w+\\s', ' ', flags)
    334                         flags = flags + ' ' + arch
    335                         _config_vars[key] = flags
    336 
    337                 m = re.search('-isysroot\\s+(\\S+)', _config_vars['CFLAGS'])
    338                 if m is not None:
    339                     sdk = m.group(1)
    340                     if not os.path.exists(sdk):
    341                         for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED', 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
    342                             flags = _config_vars[key]
    343                             flags = re.sub('-isysroot\\s+\\S+(\\s|$)', ' ', flags)
    344                             _config_vars[key] = flags
    345 
    346     if args:
    347         vals = []
    348         for name in args:
    349             vals.append(_config_vars.get(name))
    350 
    351         return vals
    352     else:
    353         return _config_vars
    354 
    355 
    356 def get_config_var(name):
    357     return get_config_vars().get(name)