aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/modules/python.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2018-09-12 16:45:23 -0400
committerXavier Claessens <xclaesse@gmail.com>2018-09-18 08:50:49 -0400
commit4ff7b65f9be936ef406aa839958c1db991ba8272 (patch)
tree8fa09396f644d218a55d18e7bb894517b2fc2799 /mesonbuild/modules/python.py
parent689d32ecfb662866d66a5aee2aa45dfad95034f2 (diff)
downloadmeson-4ff7b65f9be936ef406aa839958c1db991ba8272.zip
meson-4ff7b65f9be936ef406aa839958c1db991ba8272.tar.gz
meson-4ff7b65f9be936ef406aa839958c1db991ba8272.tar.bz2
python module: Only run command once to get all info
Diffstat (limited to 'mesonbuild/modules/python.py')
-rw-r--r--mesonbuild/modules/python.py76
1 files changed, 33 insertions, 43 deletions
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py
index 48352c4..2229949 100644
--- a/mesonbuild/modules/python.py
+++ b/mesonbuild/modules/python.py
@@ -260,52 +260,37 @@ class PythonDependency(ExternalDependency):
return super().get_pkgconfig_variable(variable_name, kwargs)
-VARIABLES_COMMAND = '''
+INTROSPECT_COMMAND = '''
import sysconfig
import json
-
-print (json.dumps (sysconfig.get_config_vars()))
-'''
-
-
-PATHS_COMMAND = '''
-import sysconfig
-import json
-
-print (json.dumps(sysconfig.get_paths()))
-'''
-
-
-INSTALL_PATHS_COMMAND = '''
-import sysconfig
-import json
-
-print (json.dumps(sysconfig.get_paths(scheme='posix_prefix', vars={'base': '', 'platbase': '', 'installed_base': ''})))
-'''
-
-
-IS_PYPY_COMMAND = '''
import sys
-import json
-print (json.dumps('__pypy__' in sys.builtin_module_names))
-'''
+install_paths = sysconfig.get_paths(scheme='posix_prefix', vars={'base': '', 'platbase': '', 'installed_base': ''})
+print (json.dumps ({
+ 'variables': sysconfig.get_config_vars(),
+ '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,
+}))
+'''
class PythonInstallation(ExternalProgramHolder, InterpreterObject):
- def __init__(self, interpreter, python):
+ def __init__(self, interpreter, python, info):
InterpreterObject.__init__(self)
ExternalProgramHolder.__init__(self, python)
self.interpreter = interpreter
prefix = self.interpreter.environment.coredata.get_builtin_option('prefix')
- self.variables = json.loads(run_command(python, VARIABLES_COMMAND))
- self.paths = json.loads(run_command(python, PATHS_COMMAND))
- install_paths = json.loads(run_command(python, INSTALL_PATHS_COMMAND))
+ self.variables = info['variables']
+ self.paths = info['paths']
+ install_paths = info['install_paths']
self.platlib_install_path = os.path.join(prefix, install_paths['platlib'][1:])
self.purelib_install_path = os.path.join(prefix, install_paths['purelib'][1:])
- self.version = run_command(python, "import sysconfig; print (sysconfig.get_python_version())")
- self.platform = run_command(python, "import sysconfig; print (sysconfig.get_platform())")
- self.is_pypy = json.loads(run_command(python, IS_PYPY_COMMAND))
+ self.version = info['version']
+ self.platform = info['platform']
+ self.is_pypy = info['is_pypy']
@permittedKwargs(mod_kwargs)
def extension_module(self, interpreter, state, args, kwargs):
@@ -475,6 +460,13 @@ class PythonModule(ExtensionModule):
else:
return None
+ def _check_version(self, name_or_path, version):
+ if name_or_path == 'python2':
+ return mesonlib.version_compare(version, '< 3.0')
+ elif name_or_path == 'python3':
+ return mesonlib.version_compare(version, '>= 3.0')
+ return True
+
@permittedKwargs(['required'])
def find_installation(self, interpreter, state, args, kwargs):
feature_check = FeatureNew('Passing "feature" option to find_installation', '0.48.0')
@@ -511,12 +503,6 @@ class PythonModule(ExtensionModule):
# it
if not python.found() and name_or_path in ['python2', 'python3']:
python = ExternalProgram('python', silent = True)
- if python.found():
- version = run_command(python, "import sysconfig; print (sysconfig.get_python_version())")
- if not version or \
- name_or_path == 'python2' and mesonlib.version_compare(version, '>= 3.0') or \
- name_or_path == 'python3' and not mesonlib.version_compare(version, '>= 3.0'):
- python = NonExistingExternalProgram()
if not python.found():
if required:
@@ -524,13 +510,17 @@ class PythonModule(ExtensionModule):
res = ExternalProgramHolder(NonExistingExternalProgram())
else:
# Sanity check, we expect to have something that at least quacks in tune
- version = run_command(python, "import sysconfig; print (sysconfig.get_python_version())")
- if not version:
+ try:
+ info = json.loads(run_command(python, INTROSPECT_COMMAND))
+ except json.JSONDecodeError:
+ info = None
+
+ if isinstance(info, dict) and 'version' in info and self._check_version(name_or_path, info['version']):
+ res = PythonInstallation(interpreter, python, info)
+ else:
res = ExternalProgramHolder(NonExistingExternalProgram())
if required:
raise mesonlib.MesonException('{} is not a valid python'.format(python))
- else:
- res = PythonInstallation(interpreter, python)
return res