1*cda5da8dSAndroid Build Coastguard Worker"""Provide access to Python's configuration information. The specific 2*cda5da8dSAndroid Build Coastguard Workerconfiguration variables available depend heavily on the platform and 3*cda5da8dSAndroid Build Coastguard Workerconfiguration. The values may be retrieved using 4*cda5da8dSAndroid Build Coastguard Workerget_config_var(name), and the list of variables is available via 5*cda5da8dSAndroid Build Coastguard Workerget_config_vars().keys(). Additional convenience functions are also 6*cda5da8dSAndroid Build Coastguard Workeravailable. 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard WorkerWritten by: Fred L. Drake, Jr. 9*cda5da8dSAndroid Build Coastguard WorkerEmail: <[email protected]> 10*cda5da8dSAndroid Build Coastguard Worker""" 11*cda5da8dSAndroid Build Coastguard Worker 12*cda5da8dSAndroid Build Coastguard Workerimport _imp 13*cda5da8dSAndroid Build Coastguard Workerimport os 14*cda5da8dSAndroid Build Coastguard Workerimport re 15*cda5da8dSAndroid Build Coastguard Workerimport sys 16*cda5da8dSAndroid Build Coastguard Workerimport warnings 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Workerfrom functools import partial 19*cda5da8dSAndroid Build Coastguard Worker 20*cda5da8dSAndroid Build Coastguard Workerfrom .errors import DistutilsPlatformError 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard Workerfrom sysconfig import ( 23*cda5da8dSAndroid Build Coastguard Worker _PREFIX as PREFIX, 24*cda5da8dSAndroid Build Coastguard Worker _BASE_PREFIX as BASE_PREFIX, 25*cda5da8dSAndroid Build Coastguard Worker _EXEC_PREFIX as EXEC_PREFIX, 26*cda5da8dSAndroid Build Coastguard Worker _BASE_EXEC_PREFIX as BASE_EXEC_PREFIX, 27*cda5da8dSAndroid Build Coastguard Worker _PROJECT_BASE as project_base, 28*cda5da8dSAndroid Build Coastguard Worker _PYTHON_BUILD as python_build, 29*cda5da8dSAndroid Build Coastguard Worker _init_posix as sysconfig_init_posix, 30*cda5da8dSAndroid Build Coastguard Worker parse_config_h as sysconfig_parse_config_h, 31*cda5da8dSAndroid Build Coastguard Worker 32*cda5da8dSAndroid Build Coastguard Worker _init_non_posix, 33*cda5da8dSAndroid Build Coastguard Worker 34*cda5da8dSAndroid Build Coastguard Worker _variable_rx, 35*cda5da8dSAndroid Build Coastguard Worker _findvar1_rx, 36*cda5da8dSAndroid Build Coastguard Worker _findvar2_rx, 37*cda5da8dSAndroid Build Coastguard Worker 38*cda5da8dSAndroid Build Coastguard Worker expand_makefile_vars, 39*cda5da8dSAndroid Build Coastguard Worker is_python_build, 40*cda5da8dSAndroid Build Coastguard Worker get_config_h_filename, 41*cda5da8dSAndroid Build Coastguard Worker get_config_var, 42*cda5da8dSAndroid Build Coastguard Worker get_config_vars, 43*cda5da8dSAndroid Build Coastguard Worker get_makefile_filename, 44*cda5da8dSAndroid Build Coastguard Worker get_python_version, 45*cda5da8dSAndroid Build Coastguard Worker) 46*cda5da8dSAndroid Build Coastguard Worker 47*cda5da8dSAndroid Build Coastguard Worker# This is better than 48*cda5da8dSAndroid Build Coastguard Worker# from sysconfig import _CONFIG_VARS as _config_vars 49*cda5da8dSAndroid Build Coastguard Worker# because it makes sure that the global dictionary is initialized 50*cda5da8dSAndroid Build Coastguard Worker# which might not be true in the time of import. 51*cda5da8dSAndroid Build Coastguard Worker_config_vars = get_config_vars() 52*cda5da8dSAndroid Build Coastguard Worker 53*cda5da8dSAndroid Build Coastguard Workerwarnings.warn( 54*cda5da8dSAndroid Build Coastguard Worker 'The distutils.sysconfig module is deprecated, use sysconfig instead', 55*cda5da8dSAndroid Build Coastguard Worker DeprecationWarning, 56*cda5da8dSAndroid Build Coastguard Worker stacklevel=2 57*cda5da8dSAndroid Build Coastguard Worker) 58*cda5da8dSAndroid Build Coastguard Worker 59*cda5da8dSAndroid Build Coastguard Worker 60*cda5da8dSAndroid Build Coastguard Worker# Following functions are the same as in sysconfig but with different API 61*cda5da8dSAndroid Build Coastguard Workerdef parse_config_h(fp, g=None): 62*cda5da8dSAndroid Build Coastguard Worker return sysconfig_parse_config_h(fp, vars=g) 63*cda5da8dSAndroid Build Coastguard Worker 64*cda5da8dSAndroid Build Coastguard Worker 65*cda5da8dSAndroid Build Coastguard Worker_python_build = partial(is_python_build, check_home=True) 66*cda5da8dSAndroid Build Coastguard Worker_init_posix = partial(sysconfig_init_posix, _config_vars) 67*cda5da8dSAndroid Build Coastguard Worker_init_nt = partial(_init_non_posix, _config_vars) 68*cda5da8dSAndroid Build Coastguard Worker 69*cda5da8dSAndroid Build Coastguard Worker 70*cda5da8dSAndroid Build Coastguard Worker# Similar function is also implemented in sysconfig as _parse_makefile 71*cda5da8dSAndroid Build Coastguard Worker# but without the parsing capabilities of distutils.text_file.TextFile. 72*cda5da8dSAndroid Build Coastguard Workerdef parse_makefile(fn, g=None): 73*cda5da8dSAndroid Build Coastguard Worker """Parse a Makefile-style file. 74*cda5da8dSAndroid Build Coastguard Worker A dictionary containing name/value pairs is returned. If an 75*cda5da8dSAndroid Build Coastguard Worker optional dictionary is passed in as the second argument, it is 76*cda5da8dSAndroid Build Coastguard Worker used instead of a new dictionary. 77*cda5da8dSAndroid Build Coastguard Worker """ 78*cda5da8dSAndroid Build Coastguard Worker from distutils.text_file import TextFile 79*cda5da8dSAndroid Build Coastguard Worker fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1, errors="surrogateescape") 80*cda5da8dSAndroid Build Coastguard Worker 81*cda5da8dSAndroid Build Coastguard Worker if g is None: 82*cda5da8dSAndroid Build Coastguard Worker g = {} 83*cda5da8dSAndroid Build Coastguard Worker done = {} 84*cda5da8dSAndroid Build Coastguard Worker notdone = {} 85*cda5da8dSAndroid Build Coastguard Worker 86*cda5da8dSAndroid Build Coastguard Worker while True: 87*cda5da8dSAndroid Build Coastguard Worker line = fp.readline() 88*cda5da8dSAndroid Build Coastguard Worker if line is None: # eof 89*cda5da8dSAndroid Build Coastguard Worker break 90*cda5da8dSAndroid Build Coastguard Worker m = re.match(_variable_rx, line) 91*cda5da8dSAndroid Build Coastguard Worker if m: 92*cda5da8dSAndroid Build Coastguard Worker n, v = m.group(1, 2) 93*cda5da8dSAndroid Build Coastguard Worker v = v.strip() 94*cda5da8dSAndroid Build Coastguard Worker # `$$' is a literal `$' in make 95*cda5da8dSAndroid Build Coastguard Worker tmpv = v.replace('$$', '') 96*cda5da8dSAndroid Build Coastguard Worker 97*cda5da8dSAndroid Build Coastguard Worker if "$" in tmpv: 98*cda5da8dSAndroid Build Coastguard Worker notdone[n] = v 99*cda5da8dSAndroid Build Coastguard Worker else: 100*cda5da8dSAndroid Build Coastguard Worker try: 101*cda5da8dSAndroid Build Coastguard Worker v = int(v) 102*cda5da8dSAndroid Build Coastguard Worker except ValueError: 103*cda5da8dSAndroid Build Coastguard Worker # insert literal `$' 104*cda5da8dSAndroid Build Coastguard Worker done[n] = v.replace('$$', '$') 105*cda5da8dSAndroid Build Coastguard Worker else: 106*cda5da8dSAndroid Build Coastguard Worker done[n] = v 107*cda5da8dSAndroid Build Coastguard Worker 108*cda5da8dSAndroid Build Coastguard Worker # Variables with a 'PY_' prefix in the makefile. These need to 109*cda5da8dSAndroid Build Coastguard Worker # be made available without that prefix through sysconfig. 110*cda5da8dSAndroid Build Coastguard Worker # Special care is needed to ensure that variable expansion works, even 111*cda5da8dSAndroid Build Coastguard Worker # if the expansion uses the name without a prefix. 112*cda5da8dSAndroid Build Coastguard Worker renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') 113*cda5da8dSAndroid Build Coastguard Worker 114*cda5da8dSAndroid Build Coastguard Worker # do variable interpolation here 115*cda5da8dSAndroid Build Coastguard Worker while notdone: 116*cda5da8dSAndroid Build Coastguard Worker for name in list(notdone): 117*cda5da8dSAndroid Build Coastguard Worker value = notdone[name] 118*cda5da8dSAndroid Build Coastguard Worker m = re.search(_findvar1_rx, value) or re.search(_findvar2_rx, value) 119*cda5da8dSAndroid Build Coastguard Worker if m: 120*cda5da8dSAndroid Build Coastguard Worker n = m.group(1) 121*cda5da8dSAndroid Build Coastguard Worker found = True 122*cda5da8dSAndroid Build Coastguard Worker if n in done: 123*cda5da8dSAndroid Build Coastguard Worker item = str(done[n]) 124*cda5da8dSAndroid Build Coastguard Worker elif n in notdone: 125*cda5da8dSAndroid Build Coastguard Worker # get it on a subsequent round 126*cda5da8dSAndroid Build Coastguard Worker found = False 127*cda5da8dSAndroid Build Coastguard Worker elif n in os.environ: 128*cda5da8dSAndroid Build Coastguard Worker # do it like make: fall back to environment 129*cda5da8dSAndroid Build Coastguard Worker item = os.environ[n] 130*cda5da8dSAndroid Build Coastguard Worker 131*cda5da8dSAndroid Build Coastguard Worker elif n in renamed_variables: 132*cda5da8dSAndroid Build Coastguard Worker if name.startswith('PY_') and name[3:] in renamed_variables: 133*cda5da8dSAndroid Build Coastguard Worker item = "" 134*cda5da8dSAndroid Build Coastguard Worker 135*cda5da8dSAndroid Build Coastguard Worker elif 'PY_' + n in notdone: 136*cda5da8dSAndroid Build Coastguard Worker found = False 137*cda5da8dSAndroid Build Coastguard Worker 138*cda5da8dSAndroid Build Coastguard Worker else: 139*cda5da8dSAndroid Build Coastguard Worker item = str(done['PY_' + n]) 140*cda5da8dSAndroid Build Coastguard Worker else: 141*cda5da8dSAndroid Build Coastguard Worker done[n] = item = "" 142*cda5da8dSAndroid Build Coastguard Worker if found: 143*cda5da8dSAndroid Build Coastguard Worker after = value[m.end():] 144*cda5da8dSAndroid Build Coastguard Worker value = value[:m.start()] + item + after 145*cda5da8dSAndroid Build Coastguard Worker if "$" in after: 146*cda5da8dSAndroid Build Coastguard Worker notdone[name] = value 147*cda5da8dSAndroid Build Coastguard Worker else: 148*cda5da8dSAndroid Build Coastguard Worker try: value = int(value) 149*cda5da8dSAndroid Build Coastguard Worker except ValueError: 150*cda5da8dSAndroid Build Coastguard Worker done[name] = value.strip() 151*cda5da8dSAndroid Build Coastguard Worker else: 152*cda5da8dSAndroid Build Coastguard Worker done[name] = value 153*cda5da8dSAndroid Build Coastguard Worker del notdone[name] 154*cda5da8dSAndroid Build Coastguard Worker 155*cda5da8dSAndroid Build Coastguard Worker if name.startswith('PY_') \ 156*cda5da8dSAndroid Build Coastguard Worker and name[3:] in renamed_variables: 157*cda5da8dSAndroid Build Coastguard Worker 158*cda5da8dSAndroid Build Coastguard Worker name = name[3:] 159*cda5da8dSAndroid Build Coastguard Worker if name not in done: 160*cda5da8dSAndroid Build Coastguard Worker done[name] = value 161*cda5da8dSAndroid Build Coastguard Worker else: 162*cda5da8dSAndroid Build Coastguard Worker # bogus variable reference; just drop it since we can't deal 163*cda5da8dSAndroid Build Coastguard Worker del notdone[name] 164*cda5da8dSAndroid Build Coastguard Worker 165*cda5da8dSAndroid Build Coastguard Worker fp.close() 166*cda5da8dSAndroid Build Coastguard Worker 167*cda5da8dSAndroid Build Coastguard Worker # strip spurious spaces 168*cda5da8dSAndroid Build Coastguard Worker for k, v in done.items(): 169*cda5da8dSAndroid Build Coastguard Worker if isinstance(v, str): 170*cda5da8dSAndroid Build Coastguard Worker done[k] = v.strip() 171*cda5da8dSAndroid Build Coastguard Worker 172*cda5da8dSAndroid Build Coastguard Worker # save the results in the global dictionary 173*cda5da8dSAndroid Build Coastguard Worker g.update(done) 174*cda5da8dSAndroid Build Coastguard Worker return g 175*cda5da8dSAndroid Build Coastguard Worker 176*cda5da8dSAndroid Build Coastguard Worker 177*cda5da8dSAndroid Build Coastguard Worker# Following functions are deprecated together with this module and they 178*cda5da8dSAndroid Build Coastguard Worker# have no direct replacement 179*cda5da8dSAndroid Build Coastguard Worker 180*cda5da8dSAndroid Build Coastguard Worker# Calculate the build qualifier flags if they are defined. Adding the flags 181*cda5da8dSAndroid Build Coastguard Worker# to the include and lib directories only makes sense for an installation, not 182*cda5da8dSAndroid Build Coastguard Worker# an in-source build. 183*cda5da8dSAndroid Build Coastguard Workerbuild_flags = '' 184*cda5da8dSAndroid Build Coastguard Workertry: 185*cda5da8dSAndroid Build Coastguard Worker if not python_build: 186*cda5da8dSAndroid Build Coastguard Worker build_flags = sys.abiflags 187*cda5da8dSAndroid Build Coastguard Workerexcept AttributeError: 188*cda5da8dSAndroid Build Coastguard Worker # It's not a configure-based build, so the sys module doesn't have 189*cda5da8dSAndroid Build Coastguard Worker # this attribute, which is fine. 190*cda5da8dSAndroid Build Coastguard Worker pass 191*cda5da8dSAndroid Build Coastguard Worker 192*cda5da8dSAndroid Build Coastguard Worker 193*cda5da8dSAndroid Build Coastguard Workerdef customize_compiler(compiler): 194*cda5da8dSAndroid Build Coastguard Worker """Do any platform-specific customization of a CCompiler instance. 195*cda5da8dSAndroid Build Coastguard Worker 196*cda5da8dSAndroid Build Coastguard Worker Mainly needed on Unix, so we can plug in the information that 197*cda5da8dSAndroid Build Coastguard Worker varies across Unices and is stored in Python's Makefile. 198*cda5da8dSAndroid Build Coastguard Worker """ 199*cda5da8dSAndroid Build Coastguard Worker if compiler.compiler_type == "unix": 200*cda5da8dSAndroid Build Coastguard Worker if sys.platform == "darwin": 201*cda5da8dSAndroid Build Coastguard Worker # Perform first-time customization of compiler-related 202*cda5da8dSAndroid Build Coastguard Worker # config vars on OS X now that we know we need a compiler. 203*cda5da8dSAndroid Build Coastguard Worker # This is primarily to support Pythons from binary 204*cda5da8dSAndroid Build Coastguard Worker # installers. The kind and paths to build tools on 205*cda5da8dSAndroid Build Coastguard Worker # the user system may vary significantly from the system 206*cda5da8dSAndroid Build Coastguard Worker # that Python itself was built on. Also the user OS 207*cda5da8dSAndroid Build Coastguard Worker # version and build tools may not support the same set 208*cda5da8dSAndroid Build Coastguard Worker # of CPU architectures for universal builds. 209*cda5da8dSAndroid Build Coastguard Worker if not _config_vars.get('CUSTOMIZED_OSX_COMPILER'): 210*cda5da8dSAndroid Build Coastguard Worker import _osx_support 211*cda5da8dSAndroid Build Coastguard Worker _osx_support.customize_compiler(_config_vars) 212*cda5da8dSAndroid Build Coastguard Worker _config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True' 213*cda5da8dSAndroid Build Coastguard Worker 214*cda5da8dSAndroid Build Coastguard Worker (cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \ 215*cda5da8dSAndroid Build Coastguard Worker get_config_vars('CC', 'CXX', 'CFLAGS', 216*cda5da8dSAndroid Build Coastguard Worker 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') 217*cda5da8dSAndroid Build Coastguard Worker 218*cda5da8dSAndroid Build Coastguard Worker if 'CC' in os.environ: 219*cda5da8dSAndroid Build Coastguard Worker newcc = os.environ['CC'] 220*cda5da8dSAndroid Build Coastguard Worker if (sys.platform == 'darwin' 221*cda5da8dSAndroid Build Coastguard Worker and 'LDSHARED' not in os.environ 222*cda5da8dSAndroid Build Coastguard Worker and ldshared.startswith(cc)): 223*cda5da8dSAndroid Build Coastguard Worker # On OS X, if CC is overridden, use that as the default 224*cda5da8dSAndroid Build Coastguard Worker # command for LDSHARED as well 225*cda5da8dSAndroid Build Coastguard Worker ldshared = newcc + ldshared[len(cc):] 226*cda5da8dSAndroid Build Coastguard Worker cc = newcc 227*cda5da8dSAndroid Build Coastguard Worker if 'CXX' in os.environ: 228*cda5da8dSAndroid Build Coastguard Worker cxx = os.environ['CXX'] 229*cda5da8dSAndroid Build Coastguard Worker if 'LDSHARED' in os.environ: 230*cda5da8dSAndroid Build Coastguard Worker ldshared = os.environ['LDSHARED'] 231*cda5da8dSAndroid Build Coastguard Worker if 'CPP' in os.environ: 232*cda5da8dSAndroid Build Coastguard Worker cpp = os.environ['CPP'] 233*cda5da8dSAndroid Build Coastguard Worker else: 234*cda5da8dSAndroid Build Coastguard Worker cpp = cc + " -E" # not always 235*cda5da8dSAndroid Build Coastguard Worker if 'LDFLAGS' in os.environ: 236*cda5da8dSAndroid Build Coastguard Worker ldshared = ldshared + ' ' + os.environ['LDFLAGS'] 237*cda5da8dSAndroid Build Coastguard Worker if 'CFLAGS' in os.environ: 238*cda5da8dSAndroid Build Coastguard Worker cflags = cflags + ' ' + os.environ['CFLAGS'] 239*cda5da8dSAndroid Build Coastguard Worker ldshared = ldshared + ' ' + os.environ['CFLAGS'] 240*cda5da8dSAndroid Build Coastguard Worker if 'CPPFLAGS' in os.environ: 241*cda5da8dSAndroid Build Coastguard Worker cpp = cpp + ' ' + os.environ['CPPFLAGS'] 242*cda5da8dSAndroid Build Coastguard Worker cflags = cflags + ' ' + os.environ['CPPFLAGS'] 243*cda5da8dSAndroid Build Coastguard Worker ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] 244*cda5da8dSAndroid Build Coastguard Worker if 'AR' in os.environ: 245*cda5da8dSAndroid Build Coastguard Worker ar = os.environ['AR'] 246*cda5da8dSAndroid Build Coastguard Worker if 'ARFLAGS' in os.environ: 247*cda5da8dSAndroid Build Coastguard Worker archiver = ar + ' ' + os.environ['ARFLAGS'] 248*cda5da8dSAndroid Build Coastguard Worker else: 249*cda5da8dSAndroid Build Coastguard Worker archiver = ar + ' ' + ar_flags 250*cda5da8dSAndroid Build Coastguard Worker 251*cda5da8dSAndroid Build Coastguard Worker cc_cmd = cc + ' ' + cflags 252*cda5da8dSAndroid Build Coastguard Worker compiler.set_executables( 253*cda5da8dSAndroid Build Coastguard Worker preprocessor=cpp, 254*cda5da8dSAndroid Build Coastguard Worker compiler=cc_cmd, 255*cda5da8dSAndroid Build Coastguard Worker compiler_so=cc_cmd + ' ' + ccshared, 256*cda5da8dSAndroid Build Coastguard Worker compiler_cxx=cxx, 257*cda5da8dSAndroid Build Coastguard Worker linker_so=ldshared, 258*cda5da8dSAndroid Build Coastguard Worker linker_exe=cc, 259*cda5da8dSAndroid Build Coastguard Worker archiver=archiver) 260*cda5da8dSAndroid Build Coastguard Worker 261*cda5da8dSAndroid Build Coastguard Worker compiler.shared_lib_extension = shlib_suffix 262*cda5da8dSAndroid Build Coastguard Worker 263*cda5da8dSAndroid Build Coastguard Worker 264*cda5da8dSAndroid Build Coastguard Workerdef get_python_inc(plat_specific=0, prefix=None): 265*cda5da8dSAndroid Build Coastguard Worker """Return the directory containing installed Python header files. 266*cda5da8dSAndroid Build Coastguard Worker 267*cda5da8dSAndroid Build Coastguard Worker If 'plat_specific' is false (the default), this is the path to the 268*cda5da8dSAndroid Build Coastguard Worker non-platform-specific header files, i.e. Python.h and so on; 269*cda5da8dSAndroid Build Coastguard Worker otherwise, this is the path to platform-specific header files 270*cda5da8dSAndroid Build Coastguard Worker (namely pyconfig.h). 271*cda5da8dSAndroid Build Coastguard Worker 272*cda5da8dSAndroid Build Coastguard Worker If 'prefix' is supplied, use it instead of sys.base_prefix or 273*cda5da8dSAndroid Build Coastguard Worker sys.base_exec_prefix -- i.e., ignore 'plat_specific'. 274*cda5da8dSAndroid Build Coastguard Worker """ 275*cda5da8dSAndroid Build Coastguard Worker if prefix is None: 276*cda5da8dSAndroid Build Coastguard Worker prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX 277*cda5da8dSAndroid Build Coastguard Worker if os.name == "posix": 278*cda5da8dSAndroid Build Coastguard Worker if python_build: 279*cda5da8dSAndroid Build Coastguard Worker # Assume the executable is in the build directory. The 280*cda5da8dSAndroid Build Coastguard Worker # pyconfig.h file should be in the same directory. Since 281*cda5da8dSAndroid Build Coastguard Worker # the build directory may not be the source directory, we 282*cda5da8dSAndroid Build Coastguard Worker # must use "srcdir" from the makefile to find the "Include" 283*cda5da8dSAndroid Build Coastguard Worker # directory. 284*cda5da8dSAndroid Build Coastguard Worker if plat_specific: 285*cda5da8dSAndroid Build Coastguard Worker return project_base 286*cda5da8dSAndroid Build Coastguard Worker else: 287*cda5da8dSAndroid Build Coastguard Worker incdir = os.path.join(get_config_var('srcdir'), 'Include') 288*cda5da8dSAndroid Build Coastguard Worker return os.path.normpath(incdir) 289*cda5da8dSAndroid Build Coastguard Worker python_dir = 'python' + get_python_version() + build_flags 290*cda5da8dSAndroid Build Coastguard Worker return os.path.join(prefix, "include", python_dir) 291*cda5da8dSAndroid Build Coastguard Worker elif os.name == "nt": 292*cda5da8dSAndroid Build Coastguard Worker if python_build: 293*cda5da8dSAndroid Build Coastguard Worker # Include both the include and PC dir to ensure we can find 294*cda5da8dSAndroid Build Coastguard Worker # pyconfig.h 295*cda5da8dSAndroid Build Coastguard Worker return (os.path.join(prefix, "include") + os.path.pathsep + 296*cda5da8dSAndroid Build Coastguard Worker os.path.join(prefix, "PC")) 297*cda5da8dSAndroid Build Coastguard Worker return os.path.join(prefix, "include") 298*cda5da8dSAndroid Build Coastguard Worker else: 299*cda5da8dSAndroid Build Coastguard Worker raise DistutilsPlatformError( 300*cda5da8dSAndroid Build Coastguard Worker "I don't know where Python installs its C header files " 301*cda5da8dSAndroid Build Coastguard Worker "on platform '%s'" % os.name) 302*cda5da8dSAndroid Build Coastguard Worker 303*cda5da8dSAndroid Build Coastguard Worker 304*cda5da8dSAndroid Build Coastguard Workerdef get_python_lib(plat_specific=0, standard_lib=0, prefix=None): 305*cda5da8dSAndroid Build Coastguard Worker """Return the directory containing the Python library (standard or 306*cda5da8dSAndroid Build Coastguard Worker site additions). 307*cda5da8dSAndroid Build Coastguard Worker 308*cda5da8dSAndroid Build Coastguard Worker If 'plat_specific' is true, return the directory containing 309*cda5da8dSAndroid Build Coastguard Worker platform-specific modules, i.e. any module from a non-pure-Python 310*cda5da8dSAndroid Build Coastguard Worker module distribution; otherwise, return the platform-shared library 311*cda5da8dSAndroid Build Coastguard Worker directory. If 'standard_lib' is true, return the directory 312*cda5da8dSAndroid Build Coastguard Worker containing standard Python library modules; otherwise, return the 313*cda5da8dSAndroid Build Coastguard Worker directory for site-specific modules. 314*cda5da8dSAndroid Build Coastguard Worker 315*cda5da8dSAndroid Build Coastguard Worker If 'prefix' is supplied, use it instead of sys.base_prefix or 316*cda5da8dSAndroid Build Coastguard Worker sys.base_exec_prefix -- i.e., ignore 'plat_specific'. 317*cda5da8dSAndroid Build Coastguard Worker """ 318*cda5da8dSAndroid Build Coastguard Worker if prefix is None: 319*cda5da8dSAndroid Build Coastguard Worker if standard_lib: 320*cda5da8dSAndroid Build Coastguard Worker prefix = plat_specific and BASE_EXEC_PREFIX or BASE_PREFIX 321*cda5da8dSAndroid Build Coastguard Worker else: 322*cda5da8dSAndroid Build Coastguard Worker prefix = plat_specific and EXEC_PREFIX or PREFIX 323*cda5da8dSAndroid Build Coastguard Worker 324*cda5da8dSAndroid Build Coastguard Worker if os.name == "posix": 325*cda5da8dSAndroid Build Coastguard Worker if plat_specific or standard_lib: 326*cda5da8dSAndroid Build Coastguard Worker # Platform-specific modules (any module from a non-pure-Python 327*cda5da8dSAndroid Build Coastguard Worker # module distribution) or standard Python library modules. 328*cda5da8dSAndroid Build Coastguard Worker libdir = sys.platlibdir 329*cda5da8dSAndroid Build Coastguard Worker else: 330*cda5da8dSAndroid Build Coastguard Worker # Pure Python 331*cda5da8dSAndroid Build Coastguard Worker libdir = "lib" 332*cda5da8dSAndroid Build Coastguard Worker libpython = os.path.join(prefix, libdir, 333*cda5da8dSAndroid Build Coastguard Worker "python" + get_python_version()) 334*cda5da8dSAndroid Build Coastguard Worker if standard_lib: 335*cda5da8dSAndroid Build Coastguard Worker return libpython 336*cda5da8dSAndroid Build Coastguard Worker else: 337*cda5da8dSAndroid Build Coastguard Worker return os.path.join(libpython, "site-packages") 338*cda5da8dSAndroid Build Coastguard Worker elif os.name == "nt": 339*cda5da8dSAndroid Build Coastguard Worker if standard_lib: 340*cda5da8dSAndroid Build Coastguard Worker return os.path.join(prefix, "Lib") 341*cda5da8dSAndroid Build Coastguard Worker else: 342*cda5da8dSAndroid Build Coastguard Worker return os.path.join(prefix, "Lib", "site-packages") 343*cda5da8dSAndroid Build Coastguard Worker else: 344*cda5da8dSAndroid Build Coastguard Worker raise DistutilsPlatformError( 345*cda5da8dSAndroid Build Coastguard Worker "I don't know where Python installs its library " 346*cda5da8dSAndroid Build Coastguard Worker "on platform '%s'" % os.name) 347