bpo-39432: Implement PEP-489 algorithm for non-ascii "PyInit_*" symbol names in distutils (GH-18150) (GH-18546)
Make it export the correct init symbol also on Windows.
https://bugs.python.org/issue39432
(cherry picked from commit 9538bc9185
)
Co-authored-by: Stefan Behnel <stefan_ml@behnel.de>
This commit is contained in:
parent
9d83984085
commit
5bf58cef15
|
@ -688,7 +688,15 @@ class build_ext(Command):
|
|||
provided, "PyInit_" + module_name. Only relevant on Windows, where
|
||||
the .pyd file (DLL) must export the module "PyInit_" function.
|
||||
"""
|
||||
initfunc_name = "PyInit_" + ext.name.split('.')[-1]
|
||||
suffix = '_' + ext.name.split('.')[-1]
|
||||
try:
|
||||
# Unicode module name support as defined in PEP-489
|
||||
# https://www.python.org/dev/peps/pep-0489/#export-hook-name
|
||||
suffix.encode('ascii')
|
||||
except UnicodeEncodeError:
|
||||
suffix = 'U' + suffix.encode('punycode').replace(b'-', b'_').decode('ascii')
|
||||
|
||||
initfunc_name = "PyInit" + suffix
|
||||
if initfunc_name not in ext.export_symbols:
|
||||
ext.export_symbols.append(initfunc_name)
|
||||
return ext.export_symbols
|
||||
|
|
|
@ -304,6 +304,19 @@ class BuildExtTestCase(TempdirManager,
|
|||
cmd.ensure_finalized()
|
||||
self.assertEqual(cmd.get_source_files(), ['xxx'])
|
||||
|
||||
def test_unicode_module_names(self):
|
||||
modules = [
|
||||
Extension('foo', ['aaa'], optional=False),
|
||||
Extension('föö', ['uuu'], optional=False),
|
||||
]
|
||||
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
||||
cmd = self.build_ext(dist)
|
||||
cmd.ensure_finalized()
|
||||
self.assertRegex(cmd.get_ext_filename(modules[0].name), r'foo\..*')
|
||||
self.assertRegex(cmd.get_ext_filename(modules[1].name), r'föö\..*')
|
||||
self.assertEqual(cmd.get_export_symbols(modules[0]), ['PyInit_foo'])
|
||||
self.assertEqual(cmd.get_export_symbols(modules[1]), ['PyInitU_f_gkaa'])
|
||||
|
||||
def test_compiler_option(self):
|
||||
# cmd.compiler is an option and
|
||||
# should not be overridden by a compiler instance
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Implement PEP-489 algorithm for non-ascii "PyInit\_..." symbol names in distutils to make it export the correct init symbol also on Windows.
|
Loading…
Reference in New Issue