From 163441ccfe69ba4e6a2e7b2a58711c9bef39899a Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 14:09:01 -0500 Subject: [PATCH 01/25] require zlib on macOS --- cpython-unix/targets.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml index 51fdbcd80..f9188ca4b 100644 --- a/cpython-unix/targets.yml +++ b/cpython-unix/targets.yml @@ -113,6 +113,7 @@ aarch64-apple-darwin: - tk - uuid - xz + - zlib - zstd openssl_target: darwin64-arm64-cc @@ -664,6 +665,7 @@ x86_64-apple-darwin: - tk - uuid - xz + - zlib - zstd openssl_target: darwin64-x86_64-cc From defce0f0bde4af89febeb728a7a2e9e1a48ae151 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 13:51:36 -0500 Subject: [PATCH 02/25] add pkgconf and require it on macOS for CPython --- cpython-unix/Makefile | 4 ++++ cpython-unix/build-pkgconf.sh | 29 +++++++++++++++++++++++++++++ cpython-unix/build.py | 3 ++- cpython-unix/targets.yml | 2 ++ pythonbuild/downloads.py | 6 ++++++ scripts/update_downloads.py | 5 +++++ 6 files changed, 48 insertions(+), 1 deletion(-) create mode 100755 cpython-unix/build-pkgconf.sh diff --git a/cpython-unix/Makefile b/cpython-unix/Makefile index c66c5cae7..0f72c168b 100644 --- a/cpython-unix/Makefile +++ b/cpython-unix/Makefile @@ -188,6 +188,9 @@ $(OUTDIR)/libedit-$(LIBEDIT_VERSION)-$(PACKAGE_SUFFIX).tar: $(LIBEDIT_DEPENDS) $(OUTDIR)/patchelf-$(PATCHELF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-patchelf.sh $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) patchelf +$(OUTDIR)/pkgconf-$(PKGCONF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-pkgconf.sh + $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) pkgconf + $(OUTDIR)/sqlite-$(SQLITE_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-sqlite.sh $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) sqlite @@ -267,6 +270,7 @@ PYTHON_DEPENDS_$(1) := \ $$(if $$(NEED_OPENSSL_1_1),$$(OUTDIR)/openssl-1.1-$$(OPENSSL_1.1_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_OPENSSL_3_5),$$(OUTDIR)/openssl-3.5-$$(OPENSSL_3.5_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_PATCHELF),$$(OUTDIR)/patchelf-$$(PATCHELF_VERSION)-$$(PACKAGE_SUFFIX).tar) \ + $$(if $$(NEED_PKGCONF),$$(OUTDIR)/pkgconf-$$(PKGCONF_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_SQLITE),$$(OUTDIR)/sqlite-$$(SQLITE_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_TCL),$$(OUTDIR)/tcl-$$(TCL_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_TK),$$(OUTDIR)/tk-$$(TK_VERSION)-$$(PACKAGE_SUFFIX).tar) \ diff --git a/cpython-unix/build-pkgconf.sh b/cpython-unix/build-pkgconf.sh new file mode 100755 index 000000000..c15ae88c7 --- /dev/null +++ b/cpython-unix/build-pkgconf.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +set -ex + +ROOT=$(pwd) + +export PATH=${TOOLS_PATH}/${TOOLCHAIN}/bin:${TOOLS_PATH}/host/bin:$PATH + +tar -xf "pkgconf-${PKGCONF_VERSION}.tar.xz" + +pushd "pkgconf-${PKGCONF_VERSION}" + +CC="${HOST_CC}" CXX="${HOST_CXX}" CFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" LDFLAGS="${EXTRA_HOST_LDFLAGS}" ./configure \ + --build="${BUILD_TRIPLE}" \ + --prefix=/tools/host \ + --disable-shared \ + --disable-dependency-tracking \ + --with-system-libdir=/usr/lib \ + --with-system-includedir=/usr/include + +make -j "${NUM_CPUS}" +make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out" + +ln -s pkgconf "${ROOT}/out/tools/host/bin/pkg-config" + +"${ROOT}/out/tools/host/bin/pkg-config" --version diff --git a/cpython-unix/build.py b/cpython-unix/build.py index 902d4a182..23da6198b 100755 --- a/cpython-unix/build.py +++ b/cpython-unix/build.py @@ -1175,6 +1175,7 @@ def main(): "ncurses", "openssl-3.5", "patchelf", + "pkgconf", "sqlite", "tcl", "uuid", @@ -1185,7 +1186,7 @@ def main(): "zlib", "zstd", ): - tools_path = "host" if action in ("m4", "patchelf") else "deps" + tools_path = "host" if action in ("m4", "patchelf", "pkgconf") else "deps" extra_archives = { "tcl": {"zlib"}, }.get(action) diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml index f9188ca4b..a21244904 100644 --- a/cpython-unix/targets.yml +++ b/cpython-unix/targets.yml @@ -108,6 +108,7 @@ aarch64-apple-darwin: - m4 - mpdecimal - openssl-3.5 + - pkgconf - sqlite - tcl - tk @@ -660,6 +661,7 @@ x86_64-apple-darwin: - m4 - mpdecimal - openssl-3.5 + - pkgconf - sqlite - tcl - tk diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py index 5cf4140d7..4ef855937 100644 --- a/pythonbuild/downloads.py +++ b/pythonbuild/downloads.py @@ -286,6 +286,12 @@ "sha256": "39e8aeccd7495d54df094d2b4a7c08010ff7777036faaf24f28e07777d1598e2", "version": "0.13.1", }, + "pkgconf": { + "url": "https://github.com/pkgconf/pkgconf/releases/download/pkgconf-3.0.3/pkgconf-3.0.3.tar.xz", + "size": 415512, + "sha256": "aa033abb2b777ba4e66635495a931e53c49d86e4e4e38af68c0f76d666cbd8cf", + "version": "3.0.3", + }, "pip": { "url": "https://files.pythonhosted.org/packages/f3/6e/1736e5b4ae2b778ef2f81c47d797de9f891d4d8acb047a24ca37a60294dd/pip-26.2.1-py3-none-any.whl", "size": 1816632, diff --git a/scripts/update_downloads.py b/scripts/update_downloads.py index cd69ff2ec..e630fe348 100644 --- a/scripts/update_downloads.py +++ b/scripts/update_downloads.py @@ -351,6 +351,11 @@ def xorg_policy(category: str, name: str, extension: str = "tar.gz") -> Policy: r"(?P[0-9.]+)", artifact_name="patchelf-{version}.tar.bz2", ), + "pkgconf": github_policy( + "pkgconf/pkgconf", + r"pkgconf-(?P[0-9.]+)", + artifact_name="pkgconf-{version}.tar.xz", + ), "pip": Policy(PyPIDiscovery("pip", r"pip-[0-9A-Za-z.+-]+-py3-none-any\.whl")), "setuptools": Policy( PyPIDiscovery("setuptools", r"setuptools-[0-9A-Za-z.+-]+-py3-none-any\.whl") From 4b5c2e969c5da6d967093fc8cb59d8620fdb4c76 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 14:10:41 -0500 Subject: [PATCH 03/25] configure pkgconf to report temp dir Configure pkgconf to report the temporary directories of the prefix that is used on macOS during CPython builds. --- cpython-unix/build-cpython.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 2dcdf1d19..5d30ee52b 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -15,6 +15,13 @@ export PKG_CONFIG_PATH=${TOOLS_PATH}/deps/share/pkgconfig:${TOOLS_PATH}/deps/lib # Ensure that `pkg-config` invocations include the static libraries export PKG_CONFIG="pkg-config --static" +# Dependency pkg-config files use /tools/deps as their prefix. macOS builds +# extract dependencies into a temporary directory, so have pkgconf relocate +# their prefix based on the location of each .pc file. +if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then + export PKG_CONFIG="${PKG_CONFIG} --define-prefix" +fi + # configure somehow has problems locating llvm-profdata even though it is in # PATH. The macro it is using allows us to specify its path via an # environment variable. From 91f8a5f23653ba2c548dad9956b6b7309942dacc Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 15:27:45 -0500 Subject: [PATCH 04/25] build _testclinic, _testclinic_limited and xxlimited_3_13 modules --- cpython-unix/extension-modules.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 5f0ef8592..152b5188f 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -725,6 +725,16 @@ _testcapi: - source: _testcapi/weakref.c minimum-python-version: "3.13" +_testclinic: + minimum-python-version: '3.12' + sources: + - _testclinic.c + +_testclinic_limited: + minimum-python-version: '3.13' + sources: + - _testclinic_limited.c + _testexternalinspection: minimum-python-version: '3.13' maximum-python-version: '3.13' @@ -1104,6 +1114,12 @@ xxlimited_35: disabled-targets: - .* +xxlimited_3_13: + minimum-python-version: '3.15' + build-mode: shared-or-disabled + sources: + - xxlimited_3_13.c + xxsubtype: setup-enabled-conditional: - enabled: true From 431203cee6fb8d8a3c71ee9f8493a89d79c8faed Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 15:32:15 -0500 Subject: [PATCH 05/25] Use Setup.stdlib for CPython 3.12+ extensions Build standard-library extensions through CPython's configure and Setup.stdlib mechanism for Python 3.12 and newer. Default to statically linking these modules into libpython/python with a few overrides speficied in a Setup.local file created from extension-modules.yaml. This allows CPython's extension checks to run. Python 3.11 and 3.10 contrinue to use the existing process to configure and build extension modules. --- cpython-unix/build-cpython.sh | 56 ++++++------------ .../patch-checksharedmods-disable-3.15.patch | 13 ----- .../patch-checksharedmods-disable.patch | 13 ----- ...ch-configure-disable-stdlib-mod-3.12.patch | 26 --------- pythonbuild/cpython.py | 57 ++++++++++++++++--- 5 files changed, 66 insertions(+), 99 deletions(-) delete mode 100644 cpython-unix/patch-checksharedmods-disable-3.15.patch delete mode 100644 cpython-unix/patch-checksharedmods-disable.patch delete mode 100644 cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 5d30ee52b..8c213d375 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -210,23 +210,12 @@ if [[ -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_10}" ]]; then patch -p1 -i "${ROOT}/patch-posixmodule-remove-system.patch" fi -# Python 3.11 has configure support for configuring extension modules. We really, -# really, really want to use this feature because it looks promising. But at the -# time we added this code the functionality didn't support all extension modules -# nor did it easily support static linking, including static linking of extra -# libraries (which appears to be a limitation of `makesetup`). So for now we -# disable the functionality and require our auto-generated Setup.local to provide -# everything. -if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_11}" ]; then - if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then - # This sets MODULE__STATE=disabled in the Makefile for all extension - # modules that are not unavailable (n/a) based on the platform. - # Valid STATE variables are needed to create the _missing_stdlib_info.py - # file during the build in Python 3.15+ - patch -p1 -i "${ROOT}/patch-configure-disable-stdlib-mod-3.12.patch" - else - patch -p1 -i "${ROOT}/patch-configure-disable-stdlib-mod.patch" - fi +# CPython 3.11 does not configure every standard-library extension, so disable +# its incomplete generated rules and supply all rules through Setup.local. +# CPython 3.12+ uses Setup.stdlib with a small Setup.local for per-module +# link-type overrides. +if [ "${PYTHON_MAJMIN_VERSION}" = "3.11" ]; then + patch -p1 -i "${ROOT}/patch-configure-disable-stdlib-mod.patch" # This hack also prevents the conditional definition of the pwd module in # Setup.bootstrap.in from working. So we remove that conditional. @@ -254,17 +243,6 @@ else patch -p1 -i "${ROOT}/patch-pgo-file-pool-3.11.patch" fi -# There's a post-build Python script that verifies modules were -# built correctly. Ideally we'd invoke this. But our nerfing of -# the configure-based module building and replacing it with our -# own Setup-derived version completely breaks assumptions in this -# script. So leave it off for now... at our own peril. -if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]; then - patch -p1 -i "${ROOT}/patch-checksharedmods-disable-3.15.patch" -elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then - patch -p1 -i "${ROOT}/patch-checksharedmods-disable.patch" -fi - # CPython < 3.11 always linked against libcrypt. We backport part of # upstream commit be21706f3760bec8bd11f85ce02ed6792b07f51f to avoid this # behavior. @@ -392,13 +370,6 @@ if [[ "${CC}" = "clang" && -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then EXTRA_CONFIGURE_FLAGS="${EXTRA_CONFIGURE_FLAGS} --with-tail-call-interp" fi -# On Python 3.12+ we need to link the special hacl library provided some SHA-256 -# implementations. Since we hack up the regular extension building mechanism, we -# need to reinvent this wheel. -if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then - LDFLAGS="${LDFLAGS} -LModules/_hacl" -fi - # On PPC we need to prevent the glibc 2.22 __tls_get_addr_opt symbol # from being introduced to preserve runtime compatibility with older # glibc. @@ -428,6 +399,12 @@ CONFIGURE_FLAGS=" --without-ensurepip ${EXTRA_CONFIGURE_FLAGS}" +if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then + # Build standard-library extensions as built-ins by default. Setup.local + # overrides only the extensions that must remain shared or disabled. + CONFIGURE_FLAGS="${CONFIGURE_FLAGS} MODULE_BUILDTYPE=static --enable-loadable-sqlite-extensions" +fi + # Build a libpython3.x.so, but statically link the interpreter against # libpython. @@ -784,6 +761,12 @@ BOLT_COMMON_FLAGS="${BOLT_COMMON_FLAGS:-}" BOLT_APPLY_FLAGS="${BOLT_APPLY_FLAGS: # Supplement produced Makefile with our modifications. cat ../Makefile.extra >> Makefile +if [[ "${PYBUILD_PLATFORM}" = macos* && -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]]; then + # configure-derived MODLIBS uses plain -l flags. Hide symbols from bundled + # static dependency libraries in both libpython and the interpreter. + printf '\nMODLIBS := $(subst -l,-Xlinker -hidden-l,$(MODLIBS))\n' >> Makefile +fi + # Debian's PPC64LE GCC 6 defaults to PIE but selects the non-PIE startup object unless -pie is # passed explicitly. Add it only to LINKFORSHARED, which CPython uses when linking executables. # See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81170. @@ -1119,9 +1102,6 @@ if linux_uapi_include_arch: "", ) replace_in_all("-isystem %s/deps/linux-uapi/usr/include" % tools_path, "") -# See https://github.com/python/cpython/issues/145810#issuecomment-4068139183 -replace_in_all("-LModules/_hacl", "") - EOF ${BUILD_PYTHON} "${ROOT}/hack_sysconfig.py" "${ROOT}/out/python" diff --git a/cpython-unix/patch-checksharedmods-disable-3.15.patch b/cpython-unix/patch-checksharedmods-disable-3.15.patch deleted file mode 100644 index 18952a030..000000000 --- a/cpython-unix/patch-checksharedmods-disable-3.15.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/Makefile.pre.in b/Makefile.pre.in -index a6beb96d12a..bb4e1ecd49b 100644 ---- a/Makefile.pre.in -+++ b/Makefile.pre.in -@@ -1610,7 +1610,7 @@ checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON) - else \ - $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-missing-stdlib-info; \ - fi -- @$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py -+ @echo "module checking disabled" - - .PHONY: rundsymutil - rundsymutil: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON) diff --git a/cpython-unix/patch-checksharedmods-disable.patch b/cpython-unix/patch-checksharedmods-disable.patch deleted file mode 100644 index 52b52a2e8..000000000 --- a/cpython-unix/patch-checksharedmods-disable.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/Makefile.pre.in b/Makefile.pre.in -index 09ceccda1d..6a3a84976e 100644 ---- a/Makefile.pre.in -+++ b/Makefile.pre.in -@@ -990,7 +990,7 @@ sharedmods: $(SHAREDMODS) pybuilddir.txt - # dependency on BUILDPYTHON ensures that the target is run last - .PHONY: checksharedmods - checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON) -- @$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py -+ @echo "module checking disabled" - - .PHONY: rundsymutil - rundsymutil: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON) diff --git a/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch b/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch deleted file mode 100644 index 675c31071..000000000 --- a/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index a284a118f02..7e536c41fda 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -7859,11 +7859,7 @@ AC_DEFUN([PY_STDLIB_MOD], [ - m4_pushdef([modcond], [MODULE_]m4_toupper([$1]))dnl - m4_pushdef([modstate], [py_cv_module_$1])dnl - dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA() -- AS_IF([test "$modstate" != "n/a"], [ -- AS_IF([m4_ifblank([$2], [true], [$2])], -- [AS_IF([m4_ifblank([$3], [true], [$3])], [modstate=yes], [modstate=missing])], -- [modstate=disabled]) -- ]) -+ AS_IF([test "$modstate" != "n/a"], [modstate=disabled]) - _MODULE_BLOCK_ADD(modcond[_STATE], [$modstate]) - AS_VAR_IF([modstate], [yes], [ - m4_ifblank([$4], [], [_MODULE_BLOCK_ADD([MODULE_]m4_toupper([$1])[_CFLAGS], [$4])]) -@@ -7883,7 +7879,7 @@ AC_DEFUN([PY_STDLIB_MOD_SIMPLE], [ - m4_pushdef([modcond], [MODULE_]m4_toupper([$1]))dnl - m4_pushdef([modstate], [py_cv_module_$1])dnl - dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA() -- AS_IF([test "$modstate" != "n/a"], [modstate=yes]) -+ AS_IF([test "$modstate" != "n/a"], [modstate=disabled]) - AM_CONDITIONAL(modcond, [test "$modstate" = yes]) - _MODULE_BLOCK_ADD(modcond[_STATE], [$modstate]) - AS_VAR_IF([modstate], [yes], [ diff --git a/pythonbuild/cpython.py b/pythonbuild/cpython.py index 3221760ab..b830f512c 100644 --- a/pythonbuild/cpython.py +++ b/pythonbuild/cpython.py @@ -255,6 +255,8 @@ def derive_setup_local( ): """Derive the content of the Modules/Setup.local file.""" + use_setup_stdlib = meets_python_minimum_version(python_version, "3.12") + # The first part of this function validates that our extension modules YAML # based metadata is in sync with the various files declaring extension # modules in the Python distribution. @@ -343,6 +345,12 @@ def derive_setup_local( except KeyError: setup_bootstrap_in = [] + if use_setup_stdlib: + ifh = tf.extractfile(f"Python-{python_version}/Modules/Setup.stdlib.in") + setup_stdlib_in = ifh.readlines() + else: + setup_stdlib_in = [] + ifh = tf.extractfile("Python-%s/Modules/config.c.in" % python_version) config_c_in = ifh.read() @@ -353,6 +361,18 @@ def derive_setup_local( RE_VARIABLE = re.compile(rb"^[a-zA-Z_]+\s*=") RE_EXTENSION_MODULE = re.compile(rb"^([a-z_]+)\s.*[a-zA-Z/_-]+\.c\b") + RE_STDLIB_EXTENSION_MODULE = re.compile( + rb"^@MODULE_[A-Z0-9_]+_TRUE@([a-z0-9_]+\s+.*)$" + ) + + setup_stdlib_lines = {} + + for line in setup_stdlib_in: + if m := RE_STDLIB_EXTENSION_MODULE.match(line.rstrip()): + line = m.group(1) + name = line.split()[0].decode("ascii") + dist_modules.add(name) + setup_stdlib_lines[name] = line # Setup.bootstrap.in has a simple format. for line in setup_bootstrap_in: @@ -460,10 +480,11 @@ def derive_setup_local( % ", ".join(sorted(extra)) ) - # And with verification out of way, now we generate a Setup.local file - # from our metadata. The verification above ensured that our metadata - # agrees fully with the distribution's knowledge of extensions. So we can - # treat our metadata as canonical. + # And with verification out of way, now we generate a Setup.local file. + # Python 3.12+ builds extensions from Setup.stdlib using configure-derived + # compiler and linker flags. In that case Setup.local only contains the + # shared and disabled overrides; older versions still use the YAML-derived + # compilation rules for every extension. RE_DEFINE = re.compile(rb"-D[^=]+=[^\s]+") @@ -540,7 +561,10 @@ def derive_setup_local( enabled_extensions[name]["setup_line"] = setup_enabled_lines[name] continue - log(f"extension {name} being configured via YAML metadata") + if use_setup_stdlib and name in setup_stdlib_lines: + log(f"extension {name} being configured via Modules/Setup.stdlib") + else: + log(f"extension {name} being configured via YAML metadata") line = name @@ -667,9 +691,10 @@ def derive_setup_local( # around this by detecting the syntax we'd like to support and move the # variable defines to a Makefile supplement that overrides variables for # specific targets. - for m in RE_DEFINE.finditer(parsed["line"]): - for obj_path in sorted(parsed["posix_obj_paths"]): - extra_cflags.setdefault(bytes(obj_path), []).append(m.group(0)) + if not use_setup_stdlib: + for m in RE_DEFINE.finditer(parsed["line"]): + for obj_path in sorted(parsed["posix_obj_paths"]): + extra_cflags.setdefault(bytes(obj_path), []).append(m.group(0)) line = RE_DEFINE.sub(b"", line) @@ -679,9 +704,23 @@ def derive_setup_local( "makesetup: %s" % line.decode("utf-8") ) - section_lines[section].append(line) + # The YAML-derived line is still used to describe packaged object files + # and dependency libraries in PYTHON.json, even when compilation is + # driven by Setup.stdlib. enabled_extensions[name]["setup_line"] = line + if not use_setup_stdlib: + section_lines[section].append(line) + elif section == "shared": + if name not in setup_stdlib_lines: + raise Exception( + f"shared extension {name} has no Modules/Setup.stdlib.in entry" + ) + + # A rule without explicit compiler/linker flags inherits the + # MODULE__CFLAGS/LDFLAGS values produced by configure. + section_lines[section].append(setup_stdlib_lines[name]) + dest_lines = [] for section, lines in sorted(section_lines.items()): From e089aab142ec1e4fb481fd07880bf6e8d2919aa3 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 15:59:13 -0500 Subject: [PATCH 06/25] remove hacl patch Configuration correctly detect the SIMD support in the toolchain and applies the appropiate flags when building libhacl. --- cpython-unix/build-cpython.sh | 7 ------ .../patch-python-configure-hacl-no-simd.patch | 24 ------------------- 2 files changed, 31 deletions(-) delete mode 100644 cpython-unix/patch-python-configure-hacl-no-simd.patch diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 8c213d375..e60512aa5 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -625,13 +625,6 @@ if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" && "${TARGET_TRIPLE}" == x86_64* PROFILE_TASK="${PROFILE_TASK} --ignore test.test_bytes.BytesTest.test_from_format" fi -# ./configure tries to auto-detect whether it can build 128-bit and 256-bit SIMD helpers for HACL, -# but on x86-64 that requires v2 and v3 respectively, and on arm64 the performance is bad as noted -# in the comments, so just don't even try. (We should check if we can make this conditional) -if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then - patch -p1 -i "${ROOT}/patch-python-configure-hacl-no-simd.patch" -fi - # We use ndbm on macOS and BerkeleyDB elsewhere. if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then CONFIGURE_FLAGS="${CONFIGURE_FLAGS} --with-dbmliborder=ndbm" diff --git a/cpython-unix/patch-python-configure-hacl-no-simd.patch b/cpython-unix/patch-python-configure-hacl-no-simd.patch deleted file mode 100644 index 125aea33f..000000000 --- a/cpython-unix/patch-python-configure-hacl-no-simd.patch +++ /dev/null @@ -1,24 +0,0 @@ -diff --git a/configure.ac b/configure.ac -index a7b2f62579b..06c0c0c0da0 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -7897,8 +7897,7 @@ AC_SUBST([LIBHACL_LDFLAGS]) - # The SIMD files use aligned_alloc, which is not available on older versions of - # Android. - # The *mmintrin.h headers are x86-family-specific, so can't be used on WASI. --if test "$ac_sys_system" != "Linux-android" -a "$ac_sys_system" != "WASI" || \ -- { test -n "$ANDROID_API_LEVEL" && test "$ANDROID_API_LEVEL" -ge 28; } -+if false - then - dnl This can be extended here to detect e.g. Power8, which HACL* should also support. - AX_CHECK_COMPILE_FLAG([-msse -msse2 -msse3 -msse4.1 -msse4.2],[ -@@ -7930,8 +7929,7 @@ AC_SUBST([LIBHACL_BLAKE2_SIMD128_OBJS]) - # Although AVX support is not guaranteed on Android - # (https://developer.android.com/ndk/guides/abis#86-64), this is safe because we do a - # runtime CPUID check. --if test "$ac_sys_system" != "Linux-android" -a "$ac_sys_system" != "WASI" || \ -- { test -n "$ANDROID_API_LEVEL" && test "$ANDROID_API_LEVEL" -ge 28; } -+if false - then - AX_CHECK_COMPILE_FLAG([-mavx2],[ - [LIBHACL_SIMD256_FLAGS="-mavx2"] From 37f4528b046ed75de46e82303f6e1ecda40592e3 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 16:45:47 -0500 Subject: [PATCH 07/25] do not require zlib on macOS for CPython, use the system --- cpython-unix/targets.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml index a21244904..2f9564f89 100644 --- a/cpython-unix/targets.yml +++ b/cpython-unix/targets.yml @@ -114,7 +114,6 @@ aarch64-apple-darwin: - tk - uuid - xz - - zlib - zstd openssl_target: darwin64-arm64-cc @@ -667,7 +666,6 @@ x86_64-apple-darwin: - tk - uuid - xz - - zlib - zstd openssl_target: darwin64-x86_64-cc From a33d26f5123a0793687726c359306378d312ce55 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 16:47:25 -0500 Subject: [PATCH 08/25] do not require a pkg-config compatible zlib on macOS for tcl --- cpython-unix/build-tcl.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cpython-unix/build-tcl.sh b/cpython-unix/build-tcl.sh index e00b251f3..fa7a93ca0 100755 --- a/cpython-unix/build-tcl.sh +++ b/cpython-unix/build-tcl.sh @@ -83,6 +83,12 @@ export CPPFLAGS="${CFLAGS}" # Initialize it so that package configure does not require an installed Tcl 9. export ZIPFS_BUILD=0 +# CPython uses the macOS SDK's zlib without a zlib.pc file. Keep the -lz in +# Libs.private, but do not make pkg-config require the missing metadata. +if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then + sed -i '' -e 's/ zlib >= 1.2.3//' tcl.pc.in +fi + ./configure \ --build="${BUILD_TRIPLE}" \ --host="${TARGET_TRIPLE}" \ From 75aaef85ece101332daea7c7281f1b61f0012539 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 16:47:53 -0500 Subject: [PATCH 09/25] require x11 for tk when static linking --- cpython-unix/build-tk.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cpython-unix/build-tk.sh b/cpython-unix/build-tk.sh index d90f47ce3..3c7fedcd6 100755 --- a/cpython-unix/build-tk.sh +++ b/cpython-unix/build-tk.sh @@ -31,6 +31,10 @@ if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then else LDFLAGS="${LDFLAGS} -Wl,--exclude-libs,ALL" EXTRA_CONFIGURE_FLAGS="--x-includes=${TOOLS_PATH}/deps/include --x-libraries=${TOOLS_PATH}/deps/lib" + + # Make pkg-config --static resolve libX11's private xcb and Xau dependencies. + sed -i '/^Requires: /a\ +Requires.private: x11' tk.pc.in fi CFLAGS="${CFLAGS}" CPPFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" ./configure \ From 4c867b2f5a347c7fe0e7e83b800515d0cb1c99c0 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Fri, 17 Jul 2026 16:51:17 -0500 Subject: [PATCH 10/25] add _testclinic, _testclinic_limited, and xxlimited_3_13 to validation --- src/validation.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/validation.rs b/src/validation.rs index c9902fabb..5a8c44652 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -1829,12 +1829,24 @@ fn validate_extension_modules( "_xxtestfuzz", ]); + if matches!(python_major_minor, "3.12" | "3.13" | "3.14" | "3.15") { + wanted.insert("_testclinic"); + } + + if matches!(python_major_minor, "3.13" | "3.14" | "3.15") { + wanted.insert("_testclinic_limited"); + } + if !static_crt { wanted.insert("_testcapi"); if !matches!(python_major_minor, "3.10" | "3.11" | "3.12") { wanted.insert("_testlimitedcapi"); } + + if python_major_minor == "3.15" { + wanted.insert("xxlimited_3_13"); + } } } From 6f54839bf8d6b2d8ecfde69d4c52e1c679b4c981 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Tue, 21 Jul 2026 13:58:26 -0500 Subject: [PATCH 11/25] disable _testclinic[_limited] and xxlimited_3_13 extensions These extensions were not enabled when using a custom build configuration + build. Maintain this policy. --- cpython-unix/extension-modules.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 152b5188f..9e9fdeaab 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -727,11 +727,15 @@ _testcapi: _testclinic: minimum-python-version: '3.12' + disabled-targets: + - .* sources: - _testclinic.c _testclinic_limited: minimum-python-version: '3.13' + disabled-targets: + - .* sources: - _testclinic_limited.c @@ -1116,7 +1120,8 @@ xxlimited_35: xxlimited_3_13: minimum-python-version: '3.15' - build-mode: shared-or-disabled + disabled-targets: + - .* sources: - xxlimited_3_13.c From 670f8898fe5c68ad19e57c1a287817c12333f8b4 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Tue, 21 Jul 2026 13:59:56 -0500 Subject: [PATCH 12/25] remove _testclinic, _testclinic_limited, and xxlimited_3_13 to validation Reverts commit 059aed07b08fac53b8dfddc6bcc9cda2d3a3b767 --- src/validation.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/validation.rs b/src/validation.rs index 5a8c44652..c9902fabb 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -1829,24 +1829,12 @@ fn validate_extension_modules( "_xxtestfuzz", ]); - if matches!(python_major_minor, "3.12" | "3.13" | "3.14" | "3.15") { - wanted.insert("_testclinic"); - } - - if matches!(python_major_minor, "3.13" | "3.14" | "3.15") { - wanted.insert("_testclinic_limited"); - } - if !static_crt { wanted.insert("_testcapi"); if !matches!(python_major_minor, "3.10" | "3.11" | "3.12") { wanted.insert("_testlimitedcapi"); } - - if python_major_minor == "3.15" { - wanted.insert("xxlimited_3_13"); - } } } From 25f44c16794ee3191d65d24162843fc64add9695 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 12 Aug 2026 16:18:35 -0500 Subject: [PATCH 13/25] disable the system libffi check on macOS --- cpython-unix/build-cpython.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index e60512aa5..09ff7cada 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -20,6 +20,13 @@ export PKG_CONFIG="pkg-config --static" # their prefix based on the location of each .pc file. if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then export PKG_CONFIG="${PKG_CONFIG} --define-prefix" + + if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then + # On macOS, CPython prefers the system libffi and provides no way to + # # select a non-system version. Disable its system-library probe so + # # _ctypes uses the bundled libffi instead. + export ac_cv_lib_ffi_ffi_call=no + fi fi # configure somehow has problems locating llvm-profdata even though it is in From 3362de80bd325143e3bd1f39fd2a05601eff39d0 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 12 Aug 2026 16:40:22 -0500 Subject: [PATCH 14/25] use CONFIG_64 for bundled mpdec on macOS for 3.12 --- cpython-unix/build-cpython.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 09ff7cada..891b821a1 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -412,6 +412,11 @@ if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then CONFIGURE_FLAGS="${CONFIGURE_FLAGS} MODULE_BUILDTYPE=static --enable-loadable-sqlite-extensions" fi +if [[ "${PYTHON_MAJMIN_VERSION}" = "3.12" && "${PYBUILD_PLATFORM}" = macos* ]]; then + # CPython 3.12 always uses UNIVERSAL on macOS for libmpdec, + # while the bundled dependency requires CONFIG_64. + export LIBMPDEC_CFLAGS="-DCONFIG_64=1" +fi # Build a libpython3.x.so, but statically link the interpreter against # libpython. From 931194627ff135b28eeef63a0ec83fa1ee0afe81 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 12 Aug 2026 16:41:39 -0500 Subject: [PATCH 15/25] add ncursesw to panel link probe in 3.12 --- cpython-unix/build-cpython.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 891b821a1..535da419f 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -418,6 +418,12 @@ if [[ "${PYTHON_MAJMIN_VERSION}" = "3.12" && "${PYBUILD_PLATFORM}" = macos* ]]; export LIBMPDEC_CFLAGS="-DCONFIG_64=1" fi +if [[ "${PYTHON_MAJMIN_VERSION}" = "3.12" && "${TARGET_TRIPLE}" == *-linux-* ]]; then + # The panelw archive needs ncursesw during configure's link probe. + export PANEL_CFLAGS="-I${TOOLS_PATH}/deps/include/ncursesw" + export PANEL_LIBS="-lpanelw -lncursesw" +fi + # Build a libpython3.x.so, but statically link the interpreter against # libpython. # Merged upstream in Python 3.15, https://github.com/python/cpython/pull/133313 From 330490c909911d91ba231901c11741e68f43197a Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Tue, 18 Aug 2026 13:06:55 -0500 Subject: [PATCH 16/25] validate that static builds contain no shared libs --- src/validation.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/validation.rs b/src/validation.rs index c9902fabb..e78df4d06 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -1862,6 +1862,18 @@ fn validate_extension_modules( Ok(errors) } +fn is_shared_library(path: &Path) -> bool { + path.file_name() + .and_then(|filename| filename.to_str()) + .is_some_and(|filename| { + filename.ends_with(".so") + || filename.contains(".so.") + || filename.ends_with(".dylib") + || filename.ends_with(".dll") + || filename.ends_with(".pyd") + }) +} + fn validate_json(json: &PythonJsonMain, triple: &str, is_debug: bool) -> Result> { let mut errors = vec![]; @@ -2015,6 +2027,13 @@ fn validate_distribution( let mut entry = entry.map_err(|e| anyhow!("failed to iterate over archive: {}", e))?; let path = entry.path()?.to_path_buf(); + if is_static && is_shared_library(&path) { + context.errors.push(format!( + "static distribution contains shared library {}", + path.display() + )); + } + seen_paths.insert(path.clone()); if let Some(link_name) = entry.link_name()? { From a77eb2ccf06a03123e8d98b1bd0455ce8c9db1be Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Tue, 18 Aug 2026 13:30:27 -0500 Subject: [PATCH 17/25] include modules in Setup.local when their linkage differs from Setup.stdlib.in A handful of modules are marked as always building shared which causes these to be built as shared modules in the static builds. --- pythonbuild/cpython.py | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/pythonbuild/cpython.py b/pythonbuild/cpython.py index b830f512c..a82afddf0 100644 --- a/pythonbuild/cpython.py +++ b/pythonbuild/cpython.py @@ -366,13 +366,26 @@ def derive_setup_local( ) setup_stdlib_lines = {} + setup_stdlib_linkage = {} + # CPython 3.12+ is configured with MODULE_BUILDTYPE=static. + setup_stdlib_section = "static" for line in setup_stdlib_in: - if m := RE_STDLIB_EXTENSION_MODULE.match(line.rstrip()): + line = line.rstrip() + + if line == b"*shared*": + setup_stdlib_section = "shared" + continue + elif line == b"*static*": + setup_stdlib_section = "static" + continue + + if m := RE_STDLIB_EXTENSION_MODULE.match(line): line = m.group(1) name = line.split()[0].decode("ascii") dist_modules.add(name) setup_stdlib_lines[name] = line + setup_stdlib_linkage[name] = setup_stdlib_section # Setup.bootstrap.in has a simple format. for line in setup_bootstrap_in: @@ -482,9 +495,9 @@ def derive_setup_local( # And with verification out of way, now we generate a Setup.local file. # Python 3.12+ builds extensions from Setup.stdlib using configure-derived - # compiler and linker flags. In that case Setup.local only contains the - # shared and disabled overrides; older versions still use the YAML-derived - # compilation rules for every extension. + # compiler and linker flags. Setup.local only disables modules or overrides + # linkage that differs from Setup.stdlib; older versions still use the + # YAML-derived compilation rules for every extension. RE_DEFINE = re.compile(rb"-D[^=]+=[^\s]+") @@ -711,13 +724,13 @@ def derive_setup_local( if not use_setup_stdlib: section_lines[section].append(line) - elif section == "shared": + elif section != setup_stdlib_linkage.get(name, "static"): if name not in setup_stdlib_lines: raise Exception( - f"shared extension {name} has no Modules/Setup.stdlib.in entry" + f"{section} extension {name} has no Modules/Setup.stdlib.in entry" ) - # A rule without explicit compiler/linker flags inherits the + # Override Setup.stdlib's linkage while inheriting the # MODULE__CFLAGS/LDFLAGS values produced by configure. section_lines[section].append(setup_stdlib_lines[name]) From 901d9f297525e614537f177f6416d45b7be05100 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Tue, 18 Aug 2026 14:07:11 -0500 Subject: [PATCH 18/25] disable shared modules in static builds check in 3.10, 3.11 --- src/validation.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/validation.rs b/src/validation.rs index e78df4d06..834149404 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -2027,7 +2027,9 @@ fn validate_distribution( let mut entry = entry.map_err(|e| anyhow!("failed to iterate over archive: {}", e))?; let path = entry.path()?.to_path_buf(); - if is_static && is_shared_library(&path) { + // TODO(jjh): Do not include shared modules in Python 3.10, 3.11 static builds + // https://github.com/astral-sh/python-build-standalone/issues/1222 + if is_static && !matches!(python_major_minor, "3.10" | "3.11") && is_shared_library(&path) { context.errors.push(format!( "static distribution contains shared library {}", path.display() From 47a7f34339ca36513cb9d32edbf95b8431ae41fd Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 14:07:01 -0500 Subject: [PATCH 19/25] directly configure Tcl/Tk on macOS for 3.12+ --- cpython-unix/build-cpython.sh | 23 +++++++++++------------ cpython-unix/build-tcl.sh | 6 ------ 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 535da419f..aaf3d9cfa 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -15,18 +15,17 @@ export PKG_CONFIG_PATH=${TOOLS_PATH}/deps/share/pkgconfig:${TOOLS_PATH}/deps/lib # Ensure that `pkg-config` invocations include the static libraries export PKG_CONFIG="pkg-config --static" -# Dependency pkg-config files use /tools/deps as their prefix. macOS builds -# extract dependencies into a temporary directory, so have pkgconf relocate -# their prefix based on the location of each .pc file. -if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then - export PKG_CONFIG="${PKG_CONFIG} --define-prefix" - - if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then - # On macOS, CPython prefers the system libffi and provides no way to - # # select a non-system version. Disable its system-library probe so - # # _ctypes uses the bundled libffi instead. - export ac_cv_lib_ffi_ffi_call=no - fi +if [[ "${PYBUILD_PLATFORM}" = macos* && -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]]; then + # Provide Tcl/Tk configuration directly to avoid needing pkg-config. + # Additionally the macOS SDK zlib is used which does not have pkg-config + # metadata. + export TCLTK_CFLAGS="-I${TOOLS_PATH}/deps/include" + export TCLTK_LIBS="-L${TOOLS_PATH}/deps/lib -ltcl9tk9.0 -ltcl9.0" + + # On macOS, CPython prefers the system libffi and provides no way to + # select a non-system version. Disable its system-library probe so + # _ctypes uses the bundled libffi instead. + export ac_cv_lib_ffi_ffi_call=no fi # configure somehow has problems locating llvm-profdata even though it is in diff --git a/cpython-unix/build-tcl.sh b/cpython-unix/build-tcl.sh index fa7a93ca0..e00b251f3 100755 --- a/cpython-unix/build-tcl.sh +++ b/cpython-unix/build-tcl.sh @@ -83,12 +83,6 @@ export CPPFLAGS="${CFLAGS}" # Initialize it so that package configure does not require an installed Tcl 9. export ZIPFS_BUILD=0 -# CPython uses the macOS SDK's zlib without a zlib.pc file. Keep the -lz in -# Libs.private, but do not make pkg-config require the missing metadata. -if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then - sed -i '' -e 's/ zlib >= 1.2.3//' tcl.pc.in -fi - ./configure \ --build="${BUILD_TRIPLE}" \ --host="${TARGET_TRIPLE}" \ From 8d605bdbf5c73246052b5302c111377f909f2257 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 14:08:31 -0500 Subject: [PATCH 20/25] remove pkgconf package --- cpython-unix/.build-cpython.sh.swp | Bin 0 -> 86016 bytes cpython-unix/Makefile | 4 ---- cpython-unix/build-pkgconf.sh | 29 ----------------------------- cpython-unix/build.py | 3 +-- cpython-unix/targets.yml | 2 -- pythonbuild/downloads.py | 6 ------ scripts/update_downloads.py | 5 ----- 7 files changed, 1 insertion(+), 48 deletions(-) create mode 100644 cpython-unix/.build-cpython.sh.swp delete mode 100755 cpython-unix/build-pkgconf.sh diff --git a/cpython-unix/.build-cpython.sh.swp b/cpython-unix/.build-cpython.sh.swp new file mode 100644 index 0000000000000000000000000000000000000000..32d5607f46ccf995ce8f8994f6220025aa7965a3 GIT binary patch literal 86016 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 UlJ1vP5TnP?JCV!{c%&VE0rK3k761SM literal 0 HcmV?d00001 diff --git a/cpython-unix/Makefile b/cpython-unix/Makefile index 0f72c168b..c66c5cae7 100644 --- a/cpython-unix/Makefile +++ b/cpython-unix/Makefile @@ -188,9 +188,6 @@ $(OUTDIR)/libedit-$(LIBEDIT_VERSION)-$(PACKAGE_SUFFIX).tar: $(LIBEDIT_DEPENDS) $(OUTDIR)/patchelf-$(PATCHELF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-patchelf.sh $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) patchelf -$(OUTDIR)/pkgconf-$(PKGCONF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-pkgconf.sh - $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) pkgconf - $(OUTDIR)/sqlite-$(SQLITE_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-sqlite.sh $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) sqlite @@ -270,7 +267,6 @@ PYTHON_DEPENDS_$(1) := \ $$(if $$(NEED_OPENSSL_1_1),$$(OUTDIR)/openssl-1.1-$$(OPENSSL_1.1_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_OPENSSL_3_5),$$(OUTDIR)/openssl-3.5-$$(OPENSSL_3.5_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_PATCHELF),$$(OUTDIR)/patchelf-$$(PATCHELF_VERSION)-$$(PACKAGE_SUFFIX).tar) \ - $$(if $$(NEED_PKGCONF),$$(OUTDIR)/pkgconf-$$(PKGCONF_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_SQLITE),$$(OUTDIR)/sqlite-$$(SQLITE_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_TCL),$$(OUTDIR)/tcl-$$(TCL_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_TK),$$(OUTDIR)/tk-$$(TK_VERSION)-$$(PACKAGE_SUFFIX).tar) \ diff --git a/cpython-unix/build-pkgconf.sh b/cpython-unix/build-pkgconf.sh deleted file mode 100755 index c15ae88c7..000000000 --- a/cpython-unix/build-pkgconf.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at https://mozilla.org/MPL/2.0/. - -set -ex - -ROOT=$(pwd) - -export PATH=${TOOLS_PATH}/${TOOLCHAIN}/bin:${TOOLS_PATH}/host/bin:$PATH - -tar -xf "pkgconf-${PKGCONF_VERSION}.tar.xz" - -pushd "pkgconf-${PKGCONF_VERSION}" - -CC="${HOST_CC}" CXX="${HOST_CXX}" CFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" LDFLAGS="${EXTRA_HOST_LDFLAGS}" ./configure \ - --build="${BUILD_TRIPLE}" \ - --prefix=/tools/host \ - --disable-shared \ - --disable-dependency-tracking \ - --with-system-libdir=/usr/lib \ - --with-system-includedir=/usr/include - -make -j "${NUM_CPUS}" -make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out" - -ln -s pkgconf "${ROOT}/out/tools/host/bin/pkg-config" - -"${ROOT}/out/tools/host/bin/pkg-config" --version diff --git a/cpython-unix/build.py b/cpython-unix/build.py index 23da6198b..902d4a182 100755 --- a/cpython-unix/build.py +++ b/cpython-unix/build.py @@ -1175,7 +1175,6 @@ def main(): "ncurses", "openssl-3.5", "patchelf", - "pkgconf", "sqlite", "tcl", "uuid", @@ -1186,7 +1185,7 @@ def main(): "zlib", "zstd", ): - tools_path = "host" if action in ("m4", "patchelf", "pkgconf") else "deps" + tools_path = "host" if action in ("m4", "patchelf") else "deps" extra_archives = { "tcl": {"zlib"}, }.get(action) diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml index 2f9564f89..51fdbcd80 100644 --- a/cpython-unix/targets.yml +++ b/cpython-unix/targets.yml @@ -108,7 +108,6 @@ aarch64-apple-darwin: - m4 - mpdecimal - openssl-3.5 - - pkgconf - sqlite - tcl - tk @@ -660,7 +659,6 @@ x86_64-apple-darwin: - m4 - mpdecimal - openssl-3.5 - - pkgconf - sqlite - tcl - tk diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py index 4ef855937..5cf4140d7 100644 --- a/pythonbuild/downloads.py +++ b/pythonbuild/downloads.py @@ -286,12 +286,6 @@ "sha256": "39e8aeccd7495d54df094d2b4a7c08010ff7777036faaf24f28e07777d1598e2", "version": "0.13.1", }, - "pkgconf": { - "url": "https://github.com/pkgconf/pkgconf/releases/download/pkgconf-3.0.3/pkgconf-3.0.3.tar.xz", - "size": 415512, - "sha256": "aa033abb2b777ba4e66635495a931e53c49d86e4e4e38af68c0f76d666cbd8cf", - "version": "3.0.3", - }, "pip": { "url": "https://files.pythonhosted.org/packages/f3/6e/1736e5b4ae2b778ef2f81c47d797de9f891d4d8acb047a24ca37a60294dd/pip-26.2.1-py3-none-any.whl", "size": 1816632, diff --git a/scripts/update_downloads.py b/scripts/update_downloads.py index e630fe348..cd69ff2ec 100644 --- a/scripts/update_downloads.py +++ b/scripts/update_downloads.py @@ -351,11 +351,6 @@ def xorg_policy(category: str, name: str, extension: str = "tar.gz") -> Policy: r"(?P[0-9.]+)", artifact_name="patchelf-{version}.tar.bz2", ), - "pkgconf": github_policy( - "pkgconf/pkgconf", - r"pkgconf-(?P[0-9.]+)", - artifact_name="pkgconf-{version}.tar.xz", - ), "pip": Policy(PyPIDiscovery("pip", r"pip-[0-9A-Za-z.+-]+-py3-none-any\.whl")), "setuptools": Policy( PyPIDiscovery("setuptools", r"setuptools-[0-9A-Za-z.+-]+-py3-none-any\.whl") From 43af7bfcad6ba57d68714ca242d05d1d0b19cbf1 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 14:19:27 -0500 Subject: [PATCH 21/25] Revert "remove pkgconf package" This reverts commit 8d605bdbf5c73246052b5302c111377f909f2257. --- cpython-unix/.build-cpython.sh.swp | Bin 86016 -> 0 bytes cpython-unix/Makefile | 4 ++++ cpython-unix/build-pkgconf.sh | 29 +++++++++++++++++++++++++++++ cpython-unix/build.py | 3 ++- cpython-unix/targets.yml | 2 ++ pythonbuild/downloads.py | 6 ++++++ scripts/update_downloads.py | 5 +++++ 7 files changed, 48 insertions(+), 1 deletion(-) delete mode 100644 cpython-unix/.build-cpython.sh.swp create mode 100755 cpython-unix/build-pkgconf.sh diff --git a/cpython-unix/.build-cpython.sh.swp b/cpython-unix/.build-cpython.sh.swp deleted file mode 100644 index 32d5607f46ccf995ce8f8994f6220025aa7965a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86016 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 UlJ1vP5TnP?JCV!{c%&VE0rK3k761SM diff --git a/cpython-unix/Makefile b/cpython-unix/Makefile index c66c5cae7..0f72c168b 100644 --- a/cpython-unix/Makefile +++ b/cpython-unix/Makefile @@ -188,6 +188,9 @@ $(OUTDIR)/libedit-$(LIBEDIT_VERSION)-$(PACKAGE_SUFFIX).tar: $(LIBEDIT_DEPENDS) $(OUTDIR)/patchelf-$(PATCHELF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-patchelf.sh $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) patchelf +$(OUTDIR)/pkgconf-$(PKGCONF_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-pkgconf.sh + $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) pkgconf + $(OUTDIR)/sqlite-$(SQLITE_VERSION)-$(PACKAGE_SUFFIX).tar: $(PYTHON_DEP_DEPENDS) $(HERE)/build-sqlite.sh $(RUN_BUILD) --docker-image $(DOCKER_IMAGE_BUILD) sqlite @@ -267,6 +270,7 @@ PYTHON_DEPENDS_$(1) := \ $$(if $$(NEED_OPENSSL_1_1),$$(OUTDIR)/openssl-1.1-$$(OPENSSL_1.1_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_OPENSSL_3_5),$$(OUTDIR)/openssl-3.5-$$(OPENSSL_3.5_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_PATCHELF),$$(OUTDIR)/patchelf-$$(PATCHELF_VERSION)-$$(PACKAGE_SUFFIX).tar) \ + $$(if $$(NEED_PKGCONF),$$(OUTDIR)/pkgconf-$$(PKGCONF_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_SQLITE),$$(OUTDIR)/sqlite-$$(SQLITE_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_TCL),$$(OUTDIR)/tcl-$$(TCL_VERSION)-$$(PACKAGE_SUFFIX).tar) \ $$(if $$(NEED_TK),$$(OUTDIR)/tk-$$(TK_VERSION)-$$(PACKAGE_SUFFIX).tar) \ diff --git a/cpython-unix/build-pkgconf.sh b/cpython-unix/build-pkgconf.sh new file mode 100755 index 000000000..c15ae88c7 --- /dev/null +++ b/cpython-unix/build-pkgconf.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + +set -ex + +ROOT=$(pwd) + +export PATH=${TOOLS_PATH}/${TOOLCHAIN}/bin:${TOOLS_PATH}/host/bin:$PATH + +tar -xf "pkgconf-${PKGCONF_VERSION}.tar.xz" + +pushd "pkgconf-${PKGCONF_VERSION}" + +CC="${HOST_CC}" CXX="${HOST_CXX}" CFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" CPPFLAGS="${EXTRA_HOST_CFLAGS} -fPIC" LDFLAGS="${EXTRA_HOST_LDFLAGS}" ./configure \ + --build="${BUILD_TRIPLE}" \ + --prefix=/tools/host \ + --disable-shared \ + --disable-dependency-tracking \ + --with-system-libdir=/usr/lib \ + --with-system-includedir=/usr/include + +make -j "${NUM_CPUS}" +make -j "${NUM_CPUS}" install DESTDIR="${ROOT}/out" + +ln -s pkgconf "${ROOT}/out/tools/host/bin/pkg-config" + +"${ROOT}/out/tools/host/bin/pkg-config" --version diff --git a/cpython-unix/build.py b/cpython-unix/build.py index 902d4a182..23da6198b 100755 --- a/cpython-unix/build.py +++ b/cpython-unix/build.py @@ -1175,6 +1175,7 @@ def main(): "ncurses", "openssl-3.5", "patchelf", + "pkgconf", "sqlite", "tcl", "uuid", @@ -1185,7 +1186,7 @@ def main(): "zlib", "zstd", ): - tools_path = "host" if action in ("m4", "patchelf") else "deps" + tools_path = "host" if action in ("m4", "patchelf", "pkgconf") else "deps" extra_archives = { "tcl": {"zlib"}, }.get(action) diff --git a/cpython-unix/targets.yml b/cpython-unix/targets.yml index 51fdbcd80..2f9564f89 100644 --- a/cpython-unix/targets.yml +++ b/cpython-unix/targets.yml @@ -108,6 +108,7 @@ aarch64-apple-darwin: - m4 - mpdecimal - openssl-3.5 + - pkgconf - sqlite - tcl - tk @@ -659,6 +660,7 @@ x86_64-apple-darwin: - m4 - mpdecimal - openssl-3.5 + - pkgconf - sqlite - tcl - tk diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py index 5cf4140d7..4ef855937 100644 --- a/pythonbuild/downloads.py +++ b/pythonbuild/downloads.py @@ -286,6 +286,12 @@ "sha256": "39e8aeccd7495d54df094d2b4a7c08010ff7777036faaf24f28e07777d1598e2", "version": "0.13.1", }, + "pkgconf": { + "url": "https://github.com/pkgconf/pkgconf/releases/download/pkgconf-3.0.3/pkgconf-3.0.3.tar.xz", + "size": 415512, + "sha256": "aa033abb2b777ba4e66635495a931e53c49d86e4e4e38af68c0f76d666cbd8cf", + "version": "3.0.3", + }, "pip": { "url": "https://files.pythonhosted.org/packages/f3/6e/1736e5b4ae2b778ef2f81c47d797de9f891d4d8acb047a24ca37a60294dd/pip-26.2.1-py3-none-any.whl", "size": 1816632, diff --git a/scripts/update_downloads.py b/scripts/update_downloads.py index cd69ff2ec..e630fe348 100644 --- a/scripts/update_downloads.py +++ b/scripts/update_downloads.py @@ -351,6 +351,11 @@ def xorg_policy(category: str, name: str, extension: str = "tar.gz") -> Policy: r"(?P[0-9.]+)", artifact_name="patchelf-{version}.tar.bz2", ), + "pkgconf": github_policy( + "pkgconf/pkgconf", + r"pkgconf-(?P[0-9.]+)", + artifact_name="pkgconf-{version}.tar.xz", + ), "pip": Policy(PyPIDiscovery("pip", r"pip-[0-9A-Za-z.+-]+-py3-none-any\.whl")), "setuptools": Policy( PyPIDiscovery("setuptools", r"setuptools-[0-9A-Za-z.+-]+-py3-none-any\.whl") From 6d546ed3be812490fc9f6072bdba90dc03463df2 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 14:26:16 -0500 Subject: [PATCH 22/25] Revert "directly configure Tcl/Tk on macOS for 3.12+" This reverts commit 47a7f34339ca36513cb9d32edbf95b8431ae41fd. --- cpython-unix/build-cpython.sh | 23 ++++++++++++----------- cpython-unix/build-tcl.sh | 6 ++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index aaf3d9cfa..535da419f 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -15,17 +15,18 @@ export PKG_CONFIG_PATH=${TOOLS_PATH}/deps/share/pkgconfig:${TOOLS_PATH}/deps/lib # Ensure that `pkg-config` invocations include the static libraries export PKG_CONFIG="pkg-config --static" -if [[ "${PYBUILD_PLATFORM}" = macos* && -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]]; then - # Provide Tcl/Tk configuration directly to avoid needing pkg-config. - # Additionally the macOS SDK zlib is used which does not have pkg-config - # metadata. - export TCLTK_CFLAGS="-I${TOOLS_PATH}/deps/include" - export TCLTK_LIBS="-L${TOOLS_PATH}/deps/lib -ltcl9tk9.0 -ltcl9.0" - - # On macOS, CPython prefers the system libffi and provides no way to - # select a non-system version. Disable its system-library probe so - # _ctypes uses the bundled libffi instead. - export ac_cv_lib_ffi_ffi_call=no +# Dependency pkg-config files use /tools/deps as their prefix. macOS builds +# extract dependencies into a temporary directory, so have pkgconf relocate +# their prefix based on the location of each .pc file. +if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then + export PKG_CONFIG="${PKG_CONFIG} --define-prefix" + + if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then + # On macOS, CPython prefers the system libffi and provides no way to + # # select a non-system version. Disable its system-library probe so + # # _ctypes uses the bundled libffi instead. + export ac_cv_lib_ffi_ffi_call=no + fi fi # configure somehow has problems locating llvm-profdata even though it is in diff --git a/cpython-unix/build-tcl.sh b/cpython-unix/build-tcl.sh index e00b251f3..fa7a93ca0 100755 --- a/cpython-unix/build-tcl.sh +++ b/cpython-unix/build-tcl.sh @@ -83,6 +83,12 @@ export CPPFLAGS="${CFLAGS}" # Initialize it so that package configure does not require an installed Tcl 9. export ZIPFS_BUILD=0 +# CPython uses the macOS SDK's zlib without a zlib.pc file. Keep the -lz in +# Libs.private, but do not make pkg-config require the missing metadata. +if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then + sed -i '' -e 's/ zlib >= 1.2.3//' tcl.pc.in +fi + ./configure \ --build="${BUILD_TRIPLE}" \ --host="${TARGET_TRIPLE}" \ From ac6dbd64e06040bea3173ee4dc16b10898e01762 Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 14:33:59 -0500 Subject: [PATCH 23/25] use a inline patch in build-tcl.sh --- cpython-unix/build-tcl.sh | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cpython-unix/build-tcl.sh b/cpython-unix/build-tcl.sh index fa7a93ca0..3ed1c02f0 100755 --- a/cpython-unix/build-tcl.sh +++ b/cpython-unix/build-tcl.sh @@ -83,10 +83,23 @@ export CPPFLAGS="${CFLAGS}" # Initialize it so that package configure does not require an installed Tcl 9. export ZIPFS_BUILD=0 -# CPython uses the macOS SDK's zlib without a zlib.pc file. Keep the -lz in -# Libs.private, but do not make pkg-config require the missing metadata. +# macOS uses SDK zlib, which provides -lz but no zlib.pc. Remove Tcl's +# pkg-config requirement while retaining its Libs.private: -lz linkage. if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then - sed -i '' -e 's/ zlib >= 1.2.3//' tcl.pc.in + patch -p1 <<'EOF' +diff --git a/tcl.pc.in b/tcl.pc.in +--- a/tcl.pc.in ++++ b/tcl.pc.in +@@ -9,7 +9,7 @@ Name: Tool Command Language + Description: Tcl is a powerful, easy-to-learn dynamic programming language, suitable for a wide range of uses. + URL: https://www.tcl-lang.org/ + Version: @TCL_VERSION@@TCL_PATCH_LEVEL@ +-Requires.private: @TCL_PC_REQUIRES_PRIVATE@ zlib >= 1.2.3 ++Requires.private: @TCL_PC_REQUIRES_PRIVATE@ + Libs: -L${libdir} @TCL_LIB_FLAG@ @TCL_STUB_LIB_FLAG@ + Libs.private: @TCL_LIBS@ + Cflags: -I${includedir} @TCL_PC_CFLAGS@ +EOF fi ./configure \ From 49e1f0be22cf409b81b4c1019596c60c15d69d9c Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 14:34:13 -0500 Subject: [PATCH 24/25] use an inline patch in build-tk.sh --- cpython-unix/build-tk.sh | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cpython-unix/build-tk.sh b/cpython-unix/build-tk.sh index 3c7fedcd6..c60aab599 100755 --- a/cpython-unix/build-tk.sh +++ b/cpython-unix/build-tk.sh @@ -32,9 +32,21 @@ else LDFLAGS="${LDFLAGS} -Wl,--exclude-libs,ALL" EXTRA_CONFIGURE_FLAGS="--x-includes=${TOOLS_PATH}/deps/include --x-libraries=${TOOLS_PATH}/deps/lib" - # Make pkg-config --static resolve libX11's private xcb and Xau dependencies. - sed -i '/^Requires: /a\ -Requires.private: x11' tk.pc.in + # Tk's pkg-config metadata omits its private X11 dependency. Add it so + # pkg-config --static also resolves X11's xcb and Xau dependencies. + patch -p1 <<'EOF' +diff --git a/tk.pc.in b/tk.pc.in +--- a/tk.pc.in ++++ b/tk.pc.in +@@ -10,6 +10,7 @@ Description: Tk is a cross-platform graphical user interface toolkit, the stand + URL: https://www.tcl-lang.org/ + Version: @TK_VERSION@@TK_PATCH_LEVEL@ + Requires: tcl >= 9.0 ++Requires.private: x11 + Libs: -L${libdir} @TK_LIB_FLAG@ @TK_STUB_LIB_FLAG@ + Libs.private: @XFT_LIBS@ @XLIBSW@ + Cflags: -I${includedir} +EOF fi CFLAGS="${CFLAGS}" CPPFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" ./configure \ From 2c7047df3cd9ecc29149c55fe07a16accf6995ca Mon Sep 17 00:00:00 2001 From: "Jonathan J. Helmus" Date: Wed, 19 Aug 2026 15:08:45 -0500 Subject: [PATCH 25/25] fixup comment on libffi on macOS --- cpython-unix/build-cpython.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh index 535da419f..ab3c1facf 100755 --- a/cpython-unix/build-cpython.sh +++ b/cpython-unix/build-cpython.sh @@ -23,8 +23,9 @@ if [[ "${PYBUILD_PLATFORM}" = macos* ]]; then if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then # On macOS, CPython prefers the system libffi and provides no way to - # # select a non-system version. Disable its system-library probe so - # # _ctypes uses the bundled libffi instead. + # select a non-system version. Disable its system-library probe so + # _ctypes uses the bundled libffi instead. + # https://github.com/python/cpython/issues/155813 export ac_cv_lib_ffi_ffi_call=no fi fi