We write this out as an embedded string to a tempfile in order to run it, which is pretty awkward. And usually Meson's files are already files on disk, not packed into a zip, so we can simply run it directly. Since python 3.7, which is our new minimum, we can handle this well via the stdlib. (There's also mesonbuild.mesondata, but we do not need persistence in the builddir.) This also solves the problem that has always been there, of giant python programs inside strings occasionally confusing syntax highlighters. Or even, it would be nice if we had syntax highlighting for this introspection program. :Dpull/11250/head
parent
b6ba054d16
commit
3bbfd4d4b8
2 changed files with 81 additions and 79 deletions
@ -0,0 +1,75 @@ |
||||
#!/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 os.path |
||||
import sysconfig |
||||
import json |
||||
import sys |
||||
import distutils.command.install |
||||
|
||||
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. |
||||
# XXX: We should be using sysconfig, but Debian only patches distutils. |
||||
|
||||
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='') |
||||
else: |
||||
paths = sysconfig.get_paths() |
||||
empty_vars = {'base': '', 'platbase': '', 'installed_base': ''} |
||||
install_paths = sysconfig.get_paths(vars=empty_vars) |
||||
|
||||
def links_against_libpython(): |
||||
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)}) |
||||
|
||||
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') |
||||
|
||||
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': '__pypy__' in sys.builtin_module_names, |
||||
'is_venv': sys.prefix != variables['base_prefix'], |
||||
'link_libpython': links_against_libpython(), |
||||
'suffix': suffix, |
||||
})) |
Loading…
Reference in new issue