# setuptools: what changed from 83 to 84
- Product: setuptools (https://whatsnew.fyi/product/setuptools)
- Vendor: setuptools
- Range: changelog entries numbered after v83.0.0 up to and including v84.0.0, stable releases only
- Entries below: 1 release (newest first)
- Resolved: 83 is v83.0.0 and 84 is v84.0.0, the newest stable release of each major we track
- Carrying security changes: 0 · CVEs mentioned: 0 · Mentioning breaking changes: 0 · Removing or deprecating something: 1
- Page: https://whatsnew.fyi/product/setuptools/compare/83...84
What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog.
Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'.
## What changed (17 changes, grouped by kind)
### Added
#### v84.0.0 (2026-08-08)
- C compilers gained a Compiler.call method as a thin wrapper over subprocess.check_call with macOS deployment-target env injection
### Changed
#### v84.0.0 (2026-08-08)
- Newline-separated keywords and platforms fields are now handled forgivingly with each line treated as a separate item and a deprecation warning emitted
- Extension is now a dataclass exposing type annotations for its constructor arguments
- C compiler modules now emit log messages through their own compilers.C.* loggers instead of the distutils root logger
- C compilers no longer depend on distutils.spawn, distutils.dir_util, distutils.file_util, distutils._modified, or distutils.util.execute/split_quoted; generic helpers are vendored and methods are implemented directly on the standard library
- Platform-identification helpers (get_platform/get_host_platform/is_mingw) now live in distutils.compilers.platform.detect and macOS deployment-target logic in distutils.compilers.platform.macos
- Compilers now read their build configuration from the standard library's sysconfig instead of distutils.sysconfig
- Per-compiler customization has moved into Compiler.configure_system() with UnixCCompiler applying compiler/flag/archiver settings from sysconfig
- Building an extension with a MACOSX_DEPLOYMENT_TARGET lower than the interpreter's configured value now raises compilers.errors.PlatformError instead of distutils.errors.DistutilsPlatformError
- CygwinCCompiler.gcc_version returns a packaging.version.Version rather than distutils.version.LooseVersion
- UnixCCompiler.runtime_library_dir_option now returns the ["-Wl,--enable-new-dtags", "-Wl,-rpath,
"] list directly for GNU ld rather than collapsing it into a single string
### Fixed
#### v84.0.0 (2026-08-08)
- MSVC linker now passes its arguments through a response file when the command line would exceed the Windows maximum length
- Cygwin and MinGW compilers now pass -O1 instead of a bare -O
- copy_file now preserves the full precision of the source's modification time
- build_ext no longer fails when cross-compiling with a compiler other than MSVC such as MinGW
### Deprecated
#### v84.0.0 (2026-08-08)
- Passing unknown keyword arguments to Extension is now deprecated
- Compiler.spawn is deprecated in favor of the new Compiler.call
## Release notes
### v84.0.0
- Date: 2026-08-08
- Version: v84.0.0
- Original notes: https://github.com/pypa/setuptools/releases/tag/v84.0.0
- Permalink: https://whatsnew.fyi/product/setuptools/releases/v84.0.0
- **changed** — Newline-separated keywords and platforms fields are now handled forgivingly with each line treated as a separate item and a deprecation warning emitted
- **changed** — Extension is now a dataclass exposing type annotations for its constructor arguments
- **deprecated** — Passing unknown keyword arguments to Extension is now deprecated
- **changed** — C compiler modules now emit log messages through their own compilers.C.* loggers instead of the distutils root logger
- **added** — C compilers gained a Compiler.call method as a thin wrapper over subprocess.check_call with macOS deployment-target env injection
- **changed** — C compilers no longer depend on distutils.spawn, distutils.dir_util, distutils.file_util, distutils._modified, or distutils.util.execute/split_quoted; generic helpers are vendored and methods are implemented directly on the standard library
- **changed** — Platform-identification helpers (get_platform/get_host_platform/is_mingw) now live in distutils.compilers.platform.detect and macOS deployment-target logic in distutils.compilers.platform.macos
- **changed** — Compilers now read their build configuration from the standard library's sysconfig instead of distutils.sysconfig
- **changed** — Per-compiler customization has moved into Compiler.configure_system() with UnixCCompiler applying compiler/flag/archiver settings from sysconfig
- **fixed** — MSVC linker now passes its arguments through a response file when the command line would exceed the Windows maximum length
- **fixed** — Cygwin and MinGW compilers now pass -O1 instead of a bare -O
- **fixed** — copy_file now preserves the full precision of the source's modification time
- **fixed** — build_ext no longer fails when cross-compiling with a compiler other than MSVC such as MinGW
- **deprecated** — Compiler.spawn is deprecated in favor of the new Compiler.call
- **changed** — Building an extension with a MACOSX_DEPLOYMENT_TARGET lower than the interpreter's configured value now raises compilers.errors.PlatformError instead of distutils.errors.DistutilsPlatformError
- **changed** — CygwinCCompiler.gcc_version returns a packaging.version.Version rather than distutils.version.LooseVersion
- **changed** — UnixCCompiler.runtime_library_dir_option now returns the ["-Wl,--enable-new-dtags", "-Wl,-rpath,"] list directly for GNU ld rather than collapsing it into a single string
Features
--------
- Newline-separated ``keywords`` and ``platforms``, which are invalid and corrupt the generated metadata (pypa/setuptools#4887), are now handled forgivingly: each line is treated as a separate item and a deprecation warning is emitted. Newlines were never a valid separator for these fields -- the `old specification `_ separated items with spaces and the current one uses commas. (#4887)
- ``Extension`` is now a dataclass, exposing type annotations for its constructor arguments so subclasses (e.g. in Setuptools) can inherit them without redeclaring each parameter. Passing unknown keyword arguments is now deprecated. (pypa/distutils#373) (#5022)
- The C compiler modules now emit log messages through their own ``compilers.C.*`` loggers instead of the distutils root logger, part of decoupling the compilers package from distutils. The logger names are normalized to a stable ``compilers.C.*`` prefix so they remain constant as the package migrates toward a standalone ``compilers.C`` distribution. (#5266)
- The C compilers gained a ``Compiler.call`` method -- a thin wrapper over ``subprocess.check_call`` (with macOS deployment-target env injection) that is the modern replacement for ``Compiler.spawn``. The compilers no longer depend on ``distutils.spawn``, ``distutils.dir_util``, ``distutils.file_util``, ``distutils._modified``, or ``distutils.util.execute``/``split_quoted``: the generic ``newer``/``newer_group`` and ``split_quoted`` helpers are vendored into the ``compilers`` package, and ``Compiler.mkpath``/``move_file``/``execute`` are implemented directly on the standard library (``os.makedirs``/``shutil.move``). The methods are retained for backward compatibility. (#5267)
- The compilers no longer depend on ``distutils.util``, ``distutils.version``, ``distutils.compat``, or ``distutils._macos_compat``. The platform-identification helpers (``get_platform``/``get_host_platform``/``is_mingw``) now live in ``distutils.compilers.platform.detect`` and the macOS deployment-target logic and ``compiler_fixup`` in ``distutils.compilers.platform.macos``; ``CygwinCCompiler.gcc_version`` returns a ``packaging.version.Version``. ``distutils.util`` re-exports the platform/macOS helpers from their new homes for backward compatibility rather than keeping duplicate copies. (sysconfig lookups still route through distutils pending its own decoupling.) (#5268)
- The compilers now read their build configuration from the standard library's ``sysconfig`` instead of ``distutils.sysconfig``. Per-compiler customization -- previously ``distutils.sysconfig.customize_compiler`` -- has moved into ``Compiler.configure_system()``: a no-op on the base class, with ``UnixCCompiler`` applying the compiler/flag/archiver settings CPython recorded in ``sysconfig`` (and the usual ``CC``/``CFLAGS``/``LDSHARED``/… environment overrides). ``distutils.sysconfig.customize_compiler`` is retained as a thin wrapper that calls ``compiler.configure_system()``. (#5269)
Bugfixes
--------
- The MSVC linker now passes its arguments through a response file when the command line would exceed the Windows maximum length, fixing failures when linking a large number of objects. (#4177)
- The Cygwin and MinGW compilers now pass ``-O1`` instead of a bare ``-O``. The two are equivalent to GCC, but ``cc1`` rejected the bare form when building 32-bit extensions with ``-m32``. -- by :user:`dchaudhari7177` (#4873)
- ``copy_file`` now preserves the full precision of the source's modification time, so a copy is no longer considered older than its source on filesystems with sub-second timestamp resolution. (pypa/distutils#379) (#5079)
- Setuptools wheels no longer bundled the project's own test modules. -- by :user:`itscloud0` (#5212)
- ``build_ext`` no longer fails when cross-compiling with a compiler other than MSVC (such as MinGW). ``Compiler`` now provides a no-op ``initialize()`` that non-MSVC compilers inherit. (pypa/distutils#399)
Impr
_[Truncated at 4000 characters — full notes: https://github.com/pypa/setuptools/releases/tag/v84.0.0]_