Skip to content

Commit d475d8c

Browse files
committed
BUG: fix a bug where calling distutils.build_ext.finalize_options after define or undef attributes were set raised an exception
1 parent 9cc2f5c commit d475d8c

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

newsfragments/5083.bugfix.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fixed a bug where calling ``build_ext.finalize_options`` after ``define`` or
2+
``undef`` attributes were already set would raise an exception.

setuptools/_distutils/command/build_ext.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,14 +266,14 @@ def finalize_options(self) -> None: # noqa: C901
266266
# specified by the 'define' option will be set to '1'. Multiple
267267
# symbols can be separated with commas.
268268

269-
if self.define:
269+
if isinstance(self.define, str):
270270
defines = self.define.split(',')
271271
self.define = [(symbol, '1') for symbol in defines]
272272

273273
# The option for macros to undefine is also a string from the
274274
# option parsing, but has to be a list. Multiple symbols can also
275275
# be separated with commas here.
276-
if self.undef:
276+
if isinstance(self.undef, str):
277277
self.undef = self.undef.split(',')
278278

279279
if self.swig_opts is None:

setuptools/tests/test_build_ext.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,22 @@ def C(file):
178178
assert example_stub.startswith(f"{build_lib}/mypkg/__pycache__/ext1")
179179
assert example_stub.endswith(".pyc")
180180

181+
def test_finalize_options_subclassing(self):
182+
"""
183+
Regression test. Check that calling build_ext.finalize_options after
184+
define or undef attributes were already set to their final type doesn't raise.
185+
"""
186+
extension = Extension('spam.eggs', ['eggs.c'])
187+
dist = Distribution(dict(ext_modules=[extension]))
188+
cmd = build_ext(dist)
189+
cmd.define = [("MY_MACRO", "1")]
190+
cmd.undef = ["EVIL_MACRO"]
191+
192+
cmd.finalize_options()
193+
194+
assert cmd.define == [("MY_MACRO", "1")]
195+
assert cmd.undef == ["EVIL_MACRO"]
196+
181197

182198
class TestBuildExtInplace:
183199
def get_build_ext_cmd(self, optional: bool, **opts) -> build_ext:

0 commit comments

Comments
 (0)