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.
pull/11105/head
Daniele Nicolodi 2 years ago committed by Eli Schwartz
parent 0404ad5601
commit 235f32f1a6
  1. 12
      mesonbuild/modules/python.py
  2. 14
      run_project_tests.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')

@ -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

Loading…
Cancel
Save