55 lines
2.5 KiB
Bash
55 lines
2.5 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Arch's own escape hatch for the Python packaging cycle. Sourced by the six
|
||
|
|
# hooks that need it; not a hook itself.
|
||
|
|
#
|
||
|
|
# THE CYCLE. Three stage-2 builds -- brotli, libseccomp, meson -- stopped on
|
||
|
|
#
|
||
|
|
# /usr/bin/python: No module named build
|
||
|
|
#
|
||
|
|
# and building python-build means running `python -m build`, which is
|
||
|
|
# python-build. Its dependencies are the same: packaging and pyproject-hooks are
|
||
|
|
# flit_core-backed, installing a wheel wants python-installer, and none of them
|
||
|
|
# exist yet.
|
||
|
|
#
|
||
|
|
# On the host the cycle was already broken -- apt had python3-build -- so stage 1
|
||
|
|
# never met it. Trying to break it there again failed for a reason worth
|
||
|
|
# recording: `apt-cache policy python3-flit-core` returns no candidate at all.
|
||
|
|
# Ubuntu does not package it, so the backend every one of these needs cannot be
|
||
|
|
# installed on the host by any means. Our own python-flit-core builds fine, but
|
||
|
|
# building a package is not installing it.
|
||
|
|
#
|
||
|
|
# ARCH ALREADY SOLVED THIS, and the solution is in the PKGBUILDs:
|
||
|
|
#
|
||
|
|
# if (( _bootstrap == 0 )); then
|
||
|
|
# python -m build -wn --skip-dependency-check
|
||
|
|
# else
|
||
|
|
# cd python-bootstrap
|
||
|
|
# python -m bootstrap.build
|
||
|
|
# fi
|
||
|
|
#
|
||
|
|
# python-bootstrap is a vendored builder that needs none of the six. Setting
|
||
|
|
# _bootstrap=1 is upstream's supported path through exactly this situation --
|
||
|
|
# far better than the alternative that was half-written here first, which was a
|
||
|
|
# per-package hook calling `python -m flit_core.wheel` and unzipping the result
|
||
|
|
# into $pkgdir by hand. That would have been three bespoke reimplementations of
|
||
|
|
# something the PKGBUILD already does properly.
|
||
|
|
#
|
||
|
|
# It also means these build on the HOST, where they had failed, so they need no
|
||
|
|
# stage-2 special handling at all.
|
||
|
|
set -euo pipefail
|
||
|
|
python3 - <<'ZZPY'
|
||
|
|
import io
|
||
|
|
s = io.open("PKGBUILD", encoding="utf-8").read()
|
||
|
|
old = "_bootstrap=0"
|
||
|
|
assert s.count(old) == 1, "python bootstrap: expected one _bootstrap=0, got %d" % s.count(old)
|
||
|
|
s = s.replace(old, "_bootstrap=1 # see patches/pkgbuild/lib-python-bootstrap.sh", 1)
|
||
|
|
io.open("PKGBUILD", "w", encoding="utf-8").write(s)
|
||
|
|
ZZPY
|
||
|
|
grep -q "^_bootstrap=1" PKGBUILD || {
|
||
|
|
echo "python bootstrap: _bootstrap was not switched" >&2; exit 1; }
|
||
|
|
# The branch it selects must actually exist, or the switch silently builds
|
||
|
|
# nothing -- these PKGBUILDs are not required to have both halves.
|
||
|
|
grep -q "bootstrap.build" PKGBUILD || {
|
||
|
|
echo "python bootstrap: no bootstrap.build branch in this PKGBUILD" >&2; exit 1; }
|
||
|
|
echo "$(basename "$PWD"): _bootstrap=1 (Arch's vendored builder)"
|