#!/usr/bin/env python # ignore all lints for this file, since it is run by python2 as well # type: ignore # pylint: disable=deprecated-module import sys # do not inject mesonbuild.scripts # python -P would work too, but is exclusive to >=3.11 if sys.path[0].endswith('scripts'): del sys.path[0] import json, os, sysconfig def get_distutils_paths(scheme=None, prefix=None): import distutils.dist distribution = distutils.dist.Distribution() install_cmd = distribution.get_command_obj('install') if prefix is not None: install_cmd.prefix = prefix if scheme: install_cmd.select_scheme(scheme) install_cmd.finalize_options() return { 'data': install_cmd.install_data, 'include': os.path.dirname(install_cmd.install_headers), 'platlib': install_cmd.install_platlib, 'purelib': install_cmd.install_purelib, 'scripts': install_cmd.install_scripts, } # On Debian derivatives, the Python interpreter shipped by the distribution uses # a custom install scheme, deb_system, for the system install, and changes the # default scheme to a custom one pointing to /usr/local and replacing # site-packages with dist-packages. # See https://github.com/mesonbuild/meson/issues/8739. # # We should be using sysconfig, but before 3.10.3, Debian only patches distutils. # So we may end up falling back. def get_install_paths(): if sys.version_info >= (3, 10): scheme = sysconfig.get_default_scheme() else: scheme = sysconfig._get_default_scheme() if sys.version_info >= (3, 10, 3): if 'deb_system' in sysconfig.get_scheme_names(): scheme = 'deb_system' else: import distutils.command.install if 'deb_system' in distutils.command.install.INSTALL_SCHEMES: paths = get_distutils_paths(scheme='deb_system') install_paths = get_distutils_paths(scheme='deb_system', prefix='') return paths, install_paths paths = sysconfig.get_paths(scheme=scheme) empty_vars = {'base': '', 'platbase': '', 'installed_base': ''} install_paths = sysconfig.get_paths(scheme=scheme, vars=empty_vars) return paths, install_paths paths, install_paths = get_install_paths() def links_against_libpython(): # on versions supporting python-embed.pc, this is the non-embed lib # # PyPy is not yet up to 3.12 and work is still pending to export the # relevant information (it doesn't automatically provide arbitrary # Makefile vars) if sys.version_info >= (3, 8) and not is_pypy: variables = sysconfig.get_config_vars() return bool(variables.get('LIBPYTHON', 'yes')) else: from distutils.core import Distribution, Extension cmd = Distribution().get_command_obj('build_ext') cmd.ensure_finalized() return bool(cmd.get_libraries(Extension('dummy', []))) variables = sysconfig.get_config_vars() variables.update({'base_prefix': getattr(sys, 'base_prefix', sys.prefix)}) is_pypy = '__pypy__' in sys.builtin_module_names if sys.version_info < (3, 0): suffix = variables.get('SO') elif sys.version_info < (3, 8, 7): # https://bugs.python.org/issue?@action=redirect&bpo=39825 from distutils.sysconfig import get_config_var suffix = get_config_var('EXT_SUFFIX') else: suffix = variables.get('EXT_SUFFIX') limited_api_suffix = None if sys.version_info >= (3, 2): try: from importlib.machinery import EXTENSION_SUFFIXES limited_api_suffix = EXTENSION_SUFFIXES[1] except Exception: pass # pypy supports modules targetting the limited api but # does not use a special suffix to distinguish them: # https://doc.pypy.org/en/latest/cpython_differences.html#permitted-abi-tags-in-extensions if is_pypy: limited_api_suffix = suffix # Whether we're targeting a free-threaded CPython interpreter is_freethreaded = bool(variables.get('Py_GIL_DISABLED', False)) print(json.dumps({ 'variables': variables, 'paths': paths, 'sysconfig_paths': sysconfig.get_paths(), 'install_paths': install_paths, 'version': sysconfig.get_python_version(), 'platform': sysconfig.get_platform(), 'is_pypy': is_pypy, 'is_venv': sys.prefix != variables['base_prefix'], 'link_libpython': links_against_libpython(), 'suffix': suffix, 'limited_api_suffix': limited_api_suffix, 'is_freethreaded': is_freethreaded, }))