summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/packaging/setupcfg.rst9
-rw-r--r--Lib/packaging/config.py11
-rw-r--r--Lib/packaging/tests/test_config.py16
3 files changed, 23 insertions, 13 deletions
diff --git a/Doc/packaging/setupcfg.rst b/Doc/packaging/setupcfg.rst
index d5bc3e3..66a61ec 100644
--- a/Doc/packaging/setupcfg.rst
+++ b/Doc/packaging/setupcfg.rst
@@ -756,8 +756,7 @@ needs to have its options defined in a dedicated section. Here's an example::
[files]
packages = coconut
- [extension=_fastcoconut]
- name = coconut._fastcoconut
+ [extension: coconut._fastcoconut]
language = cxx
sources = cxx_src/cononut_utils.cxx
cxx_src/python_module.cxx
@@ -768,8 +767,10 @@ needs to have its options defined in a dedicated section. Here's an example::
-DGECODE_VERSION=$(./gecode_version) -- sys.platform != 'win32'
/DGECODE_VERSION='win32' -- sys.platform == 'win32'
-The section name must start with ``extension=``; the righ-hand part is currently
-discarded. Valid fields and their values are listed in the documentation of the
+The section name must start with ``extension:``; the right-hand part is used as
+the full name (including a parent package, if any) of the extension. Whitespace
+around the extension name is allowed.
+Valid fields and their values are listed in the documentation of the
:class:`packaging.compiler.extension.Extension` class; values documented as
Python lists translate to multi-line values in the configuration file. In
addition, multi-line values accept environment markers on each line, after a
diff --git a/Lib/packaging/config.py b/Lib/packaging/config.py
index 83e97a9..b138d08 100644
--- a/Lib/packaging/config.py
+++ b/Lib/packaging/config.py
@@ -251,13 +251,16 @@ class Config:
ext_modules = self.dist.ext_modules
for section_key in content:
- labels = section_key.split('=')
+ # no str.partition in 2.4 :(
+ labels = section_key.split(':')
if len(labels) == 2 and labels[0] == 'extension':
- # labels[1] not used from now but should be implemented
- # for extension build dependency
values_dct = content[section_key]
+ if 'name' in values_dct:
+ raise PackagingOptionError(
+ 'extension name should be given as [extension: name], '
+ 'not as key')
ext_modules.append(Extension(
- values_dct.pop('name'),
+ labels[1].strip(),
_pop_values(values_dct, 'sources'),
_pop_values(values_dct, 'include_dirs'),
_pop_values(values_dct, 'define_macros'),
diff --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py
index 43ab2c8..ce01629 100644
--- a/Lib/packaging/tests/test_config.py
+++ b/Lib/packaging/tests/test_config.py
@@ -6,7 +6,7 @@ from io import StringIO
from packaging import command
from packaging.dist import Distribution
-from packaging.errors import PackagingFileError
+from packaging.errors import PackagingFileError, PackagingOptionError
from packaging.compiler import new_compiler, _COMPILERS
from packaging.command.sdist import sdist
@@ -100,21 +100,20 @@ sub_commands = foo
# Can not be merged with SETUP_CFG else install_dist
# command will fail when trying to compile C sources
+# TODO use a DummyCommand to mock build_ext
EXT_SETUP_CFG = """
[files]
packages = one
two
-[extension=speed_coconuts]
-name = one.speed_coconuts
+[extension:one.speed_coconuts]
sources = c_src/speed_coconuts.c
extra_link_args = "`gcc -print-file-name=libgcc.a`" -shared
define_macros = HAVE_CAIRO HAVE_GTK2
libraries = gecodeint gecodekernel -- sys.platform != 'win32'
GecodeInt GecodeKernel -- sys.platform == 'win32'
-[extension=fast_taunt]
-name = two.fast_taunt
+[extension: two.fast_taunt]
sources = cxx_src/utils_taunt.cxx
cxx_src/python_module.cxx
include_dirs = /usr/include/gecode
@@ -123,7 +122,11 @@ extra_compile_args = -fPIC -O2
-DGECODE_VERSION=$(./gecode_version) -- sys.platform != 'win32'
/DGECODE_VERSION='win32' -- sys.platform == 'win32'
language = cxx
+"""
+EXT_SETUP_CFG_BUGGY_1 = """
+[extension: realname]
+name = crash_here
"""
HOOKS_MODULE = """
@@ -335,6 +338,9 @@ class ConfigTestCase(support.TempdirManager,
self.assertEqual(ext.extra_compile_args, cargs)
self.assertEqual(ext.language, 'cxx')
+ self.write_file('setup.cfg', EXT_SETUP_CFG_BUGGY_1)
+ self.assertRaises(PackagingOptionError, self.get_dist)
+
def test_project_setup_hook_works(self):
# Bug #11637: ensure the project directory is on sys.path to allow
# project-specific hooks