aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/modules/python.py85
-rwxr-xr-xmesonbuild/scripts/python_info.py75
2 files changed, 81 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:
diff --git a/mesonbuild/scripts/python_info.py b/mesonbuild/scripts/python_info.py
new file mode 100755
index 0000000..a851356
--- /dev/null
+++ b/mesonbuild/scripts/python_info.py
@@ -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,
+}))