From 235f32f1a67f1d6662b0b1da08621e587da89f72 Mon Sep 17 00:00:00 2001 From: Daniele Nicolodi Date: Thu, 27 Oct 2022 11:02:00 +0200 Subject: [PATCH] python: Use correct extension filename suffix on Python < 3.8.7 On Windows, in Python version prior to 3.8.7, the `sysconfig` modules provides an extension filename suffix that disagrees the one returned by `distutils.sysconfig`. Get the more awesome suffix from the latter when building for a Python version known to present this issue. Simplify the extension module filename suffix lookup to use the same method used by `setuptools`. Adjust project tests accordingly. Fixes #10960. --- mesonbuild/modules/python.py | 12 ++++++++++-- run_project_tests.py | 14 ++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/mesonbuild/modules/python.py b/mesonbuild/modules/python.py index 84ec524be..98808c4f5 100644 --- a/mesonbuild/modules/python.py +++ b/mesonbuild/modules/python.py @@ -372,6 +372,15 @@ def links_against_libpython(): 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, @@ -382,6 +391,7 @@ print(json.dumps({ 'is_pypy': '__pypy__' in sys.builtin_module_names, 'is_venv': sys.prefix != variables['base_prefix'], 'link_libpython': links_against_libpython(), + 'suffix': suffix, })) ''' @@ -440,8 +450,6 @@ class PythonExternalProgram(ExternalProgram): 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) self.platlib = self._get_path(state, 'platlib') self.purelib = self._get_path(state, 'purelib') diff --git a/run_project_tests.py b/run_project_tests.py index 8be63b29d..47acb2169 100755 --- a/run_project_tests.py +++ b/run_project_tests.py @@ -177,7 +177,15 @@ class InstalledFile: return p if self.typ == 'python_lib': return p.with_suffix(python_suffix) - if self.typ in ['file', 'dir']: + if self.typ == 'py_implib': + p = p.with_suffix(python_suffix) + if env.machines.host.is_windows() and canonical_compiler == 'msvc': + return p.with_suffix('.lib') + elif env.machines.host.is_windows() or env.machines.host.is_cygwin(): + return p.with_suffix('.dll.a') + else: + return None + elif self.typ in {'file', 'dir'}: return p elif self.typ == 'shared_lib': if env.machines.host.is_windows() or env.machines.host.is_cygwin(): @@ -211,15 +219,13 @@ class InstalledFile: if self.version: p = p.with_name('{}-{}'.format(p.name, self.version[0])) return p.with_suffix('.pdb') if has_pdb else None - elif self.typ in {'implib', 'implibempty', 'py_implib'}: + elif self.typ in {'implib', 'implibempty'}: if env.machines.host.is_windows() and canonical_compiler == 'msvc': # only MSVC doesn't generate empty implibs if self.typ == 'implibempty' and compiler == 'msvc': return None return p.parent / (re.sub(r'^lib', '', p.name) + '.lib') elif env.machines.host.is_windows() or env.machines.host.is_cygwin(): - if self.typ == 'py_implib': - p = p.with_suffix(python_suffix) return p.with_suffix('.dll.a') else: return None