diff options
author | Eli Schwartz <eschwartz@archlinux.org> | 2021-08-17 17:02:26 -0400 |
---|---|---|
committer | Eli Schwartz <eschwartz@archlinux.org> | 2021-08-18 17:54:52 -0400 |
commit | d9a9c3b5dadd7a132bd221b7d2b4f84c0f0edb13 (patch) | |
tree | 3fda8238383207e6e94585750a3e2b604428dac6 | |
parent | 445f08869bb076a32a59653ef0db22d77366745e (diff) | |
download | meson-d9a9c3b5dadd7a132bd221b7d2b4f84c0f0edb13.zip meson-d9a9c3b5dadd7a132bd221b7d2b4f84c0f0edb13.tar.gz meson-d9a9c3b5dadd7a132bd221b7d2b4f84c0f0edb13.tar.bz2 |
python module: make external program wrapper have access to useful metadata
Basically just reorganize code. Try to make it a little neater, while
we're at it.
-rw-r--r-- | mesonbuild/modules/python.py | 61 |
1 files changed, 35 insertions, 26 deletions
diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index b56bd38..1e301bd 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -306,6 +306,7 @@ if T.TYPE_CHECKING: link_libpython: bool paths: T.Dict[str, str] platform: str + suffix : str variables: T.Dict[str, str] version: str @@ -334,6 +335,35 @@ class PythonExternalProgram(ExternalProgram): 'version': '0.0', } + def _check_version(self, version: str) -> bool: + if self.name == 'python2': + return mesonlib.version_compare(version, '< 3.0') + elif self.name == 'python3': + return mesonlib.version_compare(version, '>= 3.0') + return True + + def sanity(self) -> bool: + # Sanity check, we expect to have something that at least quacks in tune + cmd = self.get_command() + ['-c', INTROSPECT_COMMAND] + p, stdout, stderr = mesonlib.Popen_safe(cmd) + try: + info = json.loads(stdout) + except json.JSONDecodeError: + info = None + mlog.debug('Could not introspect Python (%s): exit code %d' % (str(p.args), p.returncode)) + mlog.debug('Program stdout:\n') + mlog.debug(stdout) + mlog.debug('Program stderr:\n') + mlog.debug(stderr) + + if info is not None and self._check_version(info['version']): + variables = info['variables'] + info['suffix'] = variables.get('EXT_SUFFIX') or variables.get('SO') or variables.get('.so') + self.info = T.cast('PythonIntrospectionDict', info) + return True + else: + return False + _PURE_KW = KwargInfo('pure', bool, default=True) _SUBDIR_KW = KwargInfo('subdir', str, default='') @@ -354,6 +384,7 @@ class PythonInstallation(ExternalProgramHolder): prefix = self.interpreter.environment.coredata.get_option(mesonlib.OptionKey('prefix')) assert isinstance(prefix, str), 'for mypy' self.variables = info['variables'] + self.suffix = info['suffix'] self.paths = info['paths'] install_paths = info['install_paths'] self.platlib_install_path = os.path.join(prefix, install_paths['platlib'][1:]) @@ -399,11 +430,9 @@ class PythonInstallation(ExternalProgramHolder): new_deps.append(dep) kwargs['dependencies'] = new_deps - suffix = self.variables.get('EXT_SUFFIX') or self.variables.get('SO') or self.variables.get('.so') - # msys2's python3 has "-cpython-36m.dll", we have to be clever # FIXME: explain what the specific cleverness is here - split, suffix = suffix.rsplit('.', 1) + split, suffix = self.suffix.rsplit('.', 1) args[0] += split kwargs['name_prefix'] = '' @@ -535,14 +564,6 @@ class PythonModule(ExtensionModule): else: return None - @staticmethod - def _check_version(name_or_path: str, version: str) -> bool: - 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 - @disablerIfNotFound @typed_pos_args('python.find_installation', optargs=[str]) @typed_kwargs( @@ -628,21 +649,9 @@ class PythonModule(ExtensionModule): raise mesonlib.MesonException('{} is missing modules: {}'.format(name_or_path or 'python', ', '.join(missing_modules))) return NonExistingExternalProgram() else: - # Sanity check, we expect to have something that at least quacks in tune - cmd = python.get_command() + ['-c', INTROSPECT_COMMAND] - p, stdout, stderr = mesonlib.Popen_safe(cmd) - try: - info = json.loads(stdout) - except json.JSONDecodeError: - info = None - mlog.debug('Could not introspect Python (%s): exit code %d' % (str(p.args), p.returncode)) - mlog.debug('Program stdout:\n') - mlog.debug(stdout) - mlog.debug('Program stderr:\n') - mlog.debug(stderr) - - if isinstance(info, dict) and 'version' in info and self._check_version(name_or_path, info['version']): - python.info = T.cast('PythonIntrospectionDict', info) + sane = python.sanity() + + if sane: return python else: if required: |