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)