aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2022-11-21 18:05:08 -0500
committerDylan Baker <dylan@pnwbakers.com>2023-02-22 10:32:09 -0800
commit3bbfd4d4b8b7d5de6d526c0409c4aab9f323e0e4 (patch)
treef37c40a7a45a0354ec3c495ae228d9a05abdfb08 /mesonbuild/modules
parentb6ba054d16a6a9df53dc53acf8b54eab687cfad4 (diff)
downloadmeson-3bbfd4d4b8b7d5de6d526c0409c4aab9f323e0e4.zip
meson-3bbfd4d4b8b7d5de6d526c0409c4aab9f323e0e4.tar.gz
meson-3bbfd4d4b8b7d5de6d526c0409c4aab9f323e0e4.tar.bz2
python module: move the introspection script into an external script
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. :D
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r--mesonbuild/modules/python.py85
1 files changed, 6 insertions, 79 deletions
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
index 8df8f7d..58c1be5 100644
--- a/mesonbuild/modules/python.py
+++ b/mesonbuild/modules/python.py
@@ -338,78 +338,6 @@ def python_factory(env: 'Environment', for_machine: 'MachineChoice',
return candidates
-INTROSPECT_COMMAND = '''\
-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,
-}))
-'''
-
-
class PythonExternalProgram(ExternalProgram):
def __init__(self, name: str, command: T.Optional[T.List[str]] = None,
ext_prog: T.Optional[ExternalProgram] = None):
@@ -447,13 +375,12 @@ class PythonExternalProgram(ExternalProgram):
def sanity(self, state: T.Optional['ModuleState'] = None) -> bool:
# Sanity check, we expect to have something that at least quacks in tune
- from tempfile import NamedTemporaryFile
- with NamedTemporaryFile(suffix='.py', delete=False, mode='w', encoding='utf-8') as tf:
- tmpfilename = tf.name
- tf.write(INTROSPECT_COMMAND)
- cmd = self.get_command() + [tmpfilename]
- p, stdout, stderr = mesonlib.Popen_safe(cmd)
- os.unlink(tmpfilename)
+
+ import importlib.resources
+
+ with importlib.resources.path('mesonbuild.scripts', 'python_info.py') as f:
+ cmd = self.get_command() + [str(f)]
+ p, stdout, stderr = mesonlib.Popen_safe(cmd)
try:
info = json.loads(stdout)
except json.JSONDecodeError: