Package: setuptools
Version: 80.9.0-2
Severity: normal
Tags: patch
User: [email protected]
Usertags: origin-ubuntu resolute ubuntu-patch

Dear Maintainer,

With the transition to python 3.14, builds of python extensions might fail
on multi-core system because of a race condition in distutils (used by 
setuptools).

This issue has been reported upstream and a fix is being proposed:
https://github.com/pypa/distutils/pull/393

On affected python extension is libvirt-python package with following build 
error:

---
aarch64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions 
-Wl,-Bsymbolic-functions 
-Wl,--package-metadata={%22type%22:%22deb%22%2C%22os%22:%22ubuntu%22%2C%22name%22:%22python3.13%22%2C%22version%22:%223.13.11-1%22%2C%22architecture%22:%22arm64%22}
 -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions 
-Wl,--package-metadata=%7B%22type%22:%22deb%22%2C%22os%22:%22ubuntu%22%2C%22name%22:%22libvirt-python%22%2C%22version%22:%2212.0.0-1%22%2C%22architecture%22:%22arm64%22%7D
 -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -g -O2 
-Werror=implicit-function-declaration -fno-omit-frame-pointer 
-mno-omit-leaf-frame-pointer -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto 
-ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat 
-Werror=format-security -mbranch-protection=standard 
-fdebug-prefix-map=/<<PKGBUILDDIR>>=/usr/src/libvirt-python-12.0.0-1 
-Wdate-time -D_FORTIFY_SOURCE=3 
build/temp.linux-aarch64-cpython-313/build/libvirt-qemu.o 
build/temp.linux-aarch64-cpython-313/libvirt-qemu-override.o 
build/temp.linux-aarch64-cpython-313/libvirt-utils.o 
build/temp.linux-aarch64-cpython-313/typewrappers.o 
-L/usr/lib/aarch64-linux-gnu -lvirt-qemu -lvirt -o 
build/lib.linux-aarch64-cpython-313/libvirtmod_qemu.cpython-313-aarch64-linux-gnu.so
aarch64-linux-gnu-gcc -shared -Wl,-O1 -Wl,-Bsymbolic-functions 
-Wl,-Bsymbolic-functions 
-Wl,--package-metadata={%22type%22:%22deb%22%2C%22os%22:%22ubuntu%22%2C%22name%22:%22python3.13%22%2C%22version%22:%223.13.11-1%22%2C%22architecture%22:%22arm64%22}
 -Wl,-z,relro -g -fwrapv -O2 -Wl,-Bsymbolic-functions 
-Wl,--package-metadata=%7B%22type%22:%22deb%22%2C%22os%22:%22ubuntu%22%2C%22name%22:%22libvirt-python%22%2C%22version%22:%2212.0.0-1%22%2C%22architecture%22:%22arm64%22%7D
 -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now -g -O2 
-Werror=implicit-function-declaration -fno-omit-frame-pointer 
-mno-omit-leaf-frame-pointer -ffile-prefix-map=/<<PKGBUILDDIR>>=. -flto=auto 
-ffat-lto-objects -fstack-protector-strong -fstack-clash-protection -Wformat 
-Werror=format-security -mbranch-protection=standard 
-fdebug-prefix-map=/<<PKGBUILDDIR>>=/usr/src/libvirt-python-12.0.0-1 
-Wdate-time -D_FORTIFY_SOURCE=3 
build/temp.linux-aarch64-cpython-313/build/libvirt-lxc.o 
build/temp.linux-aarch64-cpython-313/libvirt-lxc-override.o 
build/temp.linux-aarch64-cpython-313/libvirt-utils.o 
build/temp.linux-aarch64-cpython-313/typewrappers.o 
-L/usr/lib/aarch64-linux-gnu -lvirt-lxc -lvirt -o 
build/lib.linux-aarch64-cpython-313/libvirtmod_lxc.cpython-313-aarch64-linux-gnu.so
lto1: internal compiler error: in read_cgraph_and_symbols, at 
lto/lto-common.cc:2855
0xf068af diagnostic_context::diagnostic_impl(rich_location*, 
diagnostic_metadata const*, diagnostic_option_id, char const*, std::__va_list*, 
diagnostic_t)
 ???:0
0xed7857 internal_error(char const*, ...)
 ???:0
0xed793b fancy_abort(char const*, int, char const*)
 ???:0
0xf762cb read_cgraph_and_symbols(unsigned int, char const**)
 ???:0
0x17ee567 lto_main()
 ???:0
Please submit a full bug report, with preprocessed source (by using 
-freport-bug).
Please include the complete backtrace with any bug report.
See <file:///usr/share/doc/gcc-15/README.Bugs> for instructions.
lto-wrapper: fatal error: /usr/bin/aarch64-linux-gnu-gcc returned 1 exit status
compilation terminated.
/usr/bin/aarch64-linux-gnu-ld.bfd: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
---

*** /tmp/tmprofof8dv/bug_body

In Ubuntu, the attached patch was applied to achieve the following:

  * fix race condition for parallel extensions builds (LP: #2139083)


Thanks for considering the patch.

-- System Information:
Debian Release: trixie/sid
  APT prefers noble-updates
  APT policy: (500, 'noble-updates'), (500, 'noble-security'), (500, 'noble'), 
(100, 'noble-backports')
Architecture: amd64 (x86_64)

Kernel: Linux 6.17.0-19-generic (SMP w/16 CPU threads; PREEMPT)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
diff -Nru 
setuptools-80.9.0/debian/patches/prevent-object-file-collisions-in-parallel-extension.patch
 
setuptools-80.9.0/debian/patches/prevent-object-file-collisions-in-parallel-extension.patch
--- 
setuptools-80.9.0/debian/patches/prevent-object-file-collisions-in-parallel-extension.patch
 1970-01-01 01:00:00.000000000 +0100
+++ 
setuptools-80.9.0/debian/patches/prevent-object-file-collisions-in-parallel-extension.patch
 2026-03-24 11:43:32.000000000 +0100
@@ -0,0 +1,57 @@
+Description: Prevent object file collisions in parallel extension builds
+
+Parallel builds of extensions that share source files may write to the same
+object file paths under a common build directory, resulting in race conditions
+and non-deterministic build outputs.
+
+Use a per-extension build directory to isolate object files and ensure
+deterministic, parallel-safe builds.
+
+Author: Lukas Schmelting <[email protected]>
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/2139083
+Forwarded: https://github.com/pypa/distutils/pull/393
+Last-Update: 2026-02-13
+
+---
+ newsfragments/3942.bugfix.rst              | 1 +
+ setuptools/_distutils/command/build_ext.py | 7 +++++--
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+ create mode 100644 newsfragments/3942.bugfix.rst
+
+diff --git a/newsfragments/3942.bugfix.rst b/newsfragments/3942.bugfix.rst
+new file mode 100644
+index 00000000..fac4bf79
+--- /dev/null
++++ b/newsfragments/3942.bugfix.rst
+@@ -0,0 +1 @@
++Fixed non-deterministic parallel builds of extensions that share source files.
+diff --git a/setuptools/_distutils/command/build_ext.py 
b/setuptools/_distutils/command/build_ext.py
+index ec45b440..daf30519 100644
+--- a/setuptools/_distutils/command/build_ext.py
++++ b/setuptools/_distutils/command/build_ext.py
+@@ -562,9 +562,12 @@ class build_ext(Command):
+         for undef in ext.undef_macros:
+             macros.append((undef,))
+ 
++        # Per-extension build dir to avoid conflicts in parallel builds.
++        ext_build_temp = os.path.join(self.build_temp, ext.name)
++
+         objects = self.compiler.compile(
+             sources,
+-            output_dir=self.build_temp,
++            output_dir=ext_build_temp,
+             macros=macros,
+             include_dirs=ext.include_dirs,
+             debug=self.debug,
+@@ -595,7 +598,7 @@ class build_ext(Command):
+             extra_postargs=extra_args,
+             export_symbols=self.get_export_symbols(ext),
+             debug=self.debug,
+-            build_temp=self.build_temp,
++            build_temp=ext_build_temp,
+             target_lang=language,
+         )
+ 
+-- 
+2.34.1
+
diff -Nru setuptools-80.9.0/debian/patches/series 
setuptools-80.9.0/debian/patches/series
--- setuptools-80.9.0/debian/patches/series     2025-06-12 11:36:56.000000000 
+0200
+++ setuptools-80.9.0/debian/patches/series     2026-03-24 11:43:32.000000000 
+0100
@@ -15,3 +15,4 @@
 #sphinx-theme.diff
 dont-require-vendored-modules.diff
 revert-shebang-change.diff
+prevent-object-file-collisions-in-parallel-extension.patch

Reply via email to