The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.3 KiB
125 lines
4.3 KiB
#!/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, |
|
}))
|
|
|