From 7157c54b100feb0b8444736816b1747b015d7421 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Mon, 12 Oct 2026 00:40:13 +0200 Subject: [PATCH] drop the libqmi fork: Alpine's snapshot is past the !470 merge Alpine's community/libqmi is at upstream 1c972b8a (2026-10-05), 23 commits past the 30f3e998 this fork pinned "just past the !470 merge", with the qmi-glib 1.39.1 the GNSS patches in modemmanager need. No patch was left; the fork's one remaining addition, the FP6-tuned build (-march/-mtune, whose gain was never measured), goes with it. build.sh loses its tarball, checksum and build steps. The registry still serves the fork (1.39.1_git20260808-r100 and -r101), and that version outranks Alpine's 1.38.0_git* line, so with the aport alone installed phones keep the fork and a fresh image takes it back at its first 'apk upgrade': the fork's packages are deleted from the registry with this push. Fresh images then install Alpine's libqmi and keep it. Installed phones keep the fork until 'apk upgrade -a' downgrades them to Alpine's or Alpine's version passes 1.39.1; the new modemmanager works on either (verified on the FP6 with both). pmbootstrap keeps a local package repository in its work dir and consults it before every other repository. Whether that dir survives from one CI run to the next is not established (run 60 rebuilt libqmi, modemmanager and libcamera at the versions run 58 had built, which says it did not), but nothing guarantees it either way, so build.sh deletes any libqmi/qmi-utils apks found there before building, re-indexes the repository from the files present and fails the run if any are left; the publish step skips libqmi-*/qmi-utils-* as the backstop. pmbootstrap's 'zap --pkgs-local-mismatch' cannot do this: with systemd selected it looks at packages/systemd-edge, not at the packages/edge the builds land in. --- .forgejo/workflows/build.yml | 8 ++- aports/device/catcrafts-fp6-repo/APKBUILD | 2 +- aports/temp/libqmi/APKBUILD | 77 ----------------------- build.sh | 39 +++++++----- 4 files changed, 31 insertions(+), 95 deletions(-) delete mode 100644 aports/temp/libqmi/APKBUILD diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml index 0eff8b4..2046b11 100644 --- a/.forgejo/workflows/build.yml +++ b/.forgejo/workflows/build.yml @@ -52,14 +52,17 @@ jobs: path: dist/* if-no-files-found: error - # Ship every locally built apk (kernel, modemmanager, libqmi, - # callaudioshim, audio files, ...) to the Forgejo Alpine registry, so + # Ship every locally built apk (kernel, modemmanager, callaudioshim, + # audio files, ...) to the Forgejo Alpine registry, so # installed systems get updates via 'apk upgrade' instead of losing # the FP6 patches to the next upstream version bump. Requires the # PACKAGE_TOKEN repo secret (catbot account, package:write scope); # skips quietly until it exists. 409 = same version already published. # imsd and fingerprintd are skipped: build.sh 3b took them FROM the # registry (re-signed for the chroot), so they are not ours to publish. + # libqmi is skipped too: its fork was retired and deleted from the + # registry (2026-10-12); should a leftover apk ever sit in the runner's + # package dir, it must not bring the fork back. - name: Publish packages to the apk registry env: PACKAGE_TOKEN: ${{ secrets.PACKAGE_TOKEN }} @@ -74,6 +77,7 @@ jobs: [ -e "$f" ] || continue case "$(basename "$f")" in imsd-*|fingerprintd-*) echo "registry-sourced, not republished: $(basename "$f")"; continue ;; + libqmi-*|qmi-utils-*) echo "retired fork, not republished: $(basename "$f")"; continue ;; esac found=1 code=$(curl -s -o /dev/null -w '%{http_code}' \ diff --git a/aports/device/catcrafts-fp6-repo/APKBUILD b/aports/device/catcrafts-fp6-repo/APKBUILD index 54b915c..b28d9f5 100644 --- a/aports/device/catcrafts-fp6-repo/APKBUILD +++ b/aports/device/catcrafts-fp6-repo/APKBUILD @@ -1,7 +1,7 @@ # Enables the Catcrafts FP6 package repository on the installed system: # installs the Forgejo package-registry signing key and appends the repo URL # to /etc/apk/repositories. With this, 'apk upgrade' pulls the CI-published -# kernel/modemmanager/libqmi/imsd builds instead of losing the FP6 patches +# kernel/modemmanager/imsd builds instead of losing the FP6 patches # to the next upstream version bump. maintainer="Jorijn van der Graaf " pkgname=catcrafts-fp6-repo diff --git a/aports/temp/libqmi/APKBUILD b/aports/temp/libqmi/APKBUILD deleted file mode 100644 index bb04704..0000000 --- a/aports/temp/libqmi/APKBUILD +++ /dev/null @@ -1,77 +0,0 @@ -# fp6-img fork of Alpine community/libqmi: snapshot bumped to upstream main -# just past the !470 merge (LOC Register Events client-identification TLVs, -# half of working GNSS on the FP6) - which also provides the qmi-glib 1.39.1 -# our modemmanager patches require. Drop when Alpine's snapshot catches up. -# Contributor: Stuart Cardall -maintainer="Achill Gilgenast " -pkgname=libqmi -pkgver=1.39.1_git20260808 -_commit=30f3e998e6cbda364ac1bc73223de20561e6d555 -pkgrel=101 -pkgdesc="QMI modem protocol helper library" -url="https://www.freedesktop.org/wiki/Software/libqmi" -arch="all" -license="GPL-2.0-or-later AND LGPL-2.1-or-later" -makedepends=" - bash-completion-dev - glib-dev - gobject-introspection-dev - help2man - libgudev-dev - libmbim-dev - libqrtr-glib-dev - linux-headers - meson - python3 - " -# fp6-img: crossdirect breaks meson compiler introspection (cc1 spawn -# failure), same as modemmanager; build under plain qemu. -options="!pmb:crossdirect" -# fp6-img: this package only ever runs on the FP6 (4x Cortex-A520 + 4x -# Cortex-A720), so build for it. armv8.6-a is the highest level whose -# mandatory set the phone exposes (8.7 would assume WFxT, 9.x SVE2; neither -# is in its hwcaps); +fp16fml+aes+sha3+sm4 are the optional extensions it -# has, the same set `gcc -march=native` derives on the phone. One spelling -# for gcc and clang, and the same string the kernel aport uses. -export CFLAGS="$CFLAGS -march=armv8.6-a+fp16fml+aes+sha3+sm4 -mtune=cortex-a720" -subpackages=" - $pkgname-dev - $pkgname-doc - $pkgname-bash-completion - qmi-utils - " -#source="https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/archive/$pkgver/libqmi-$pkgver.tar.gz" -# fp6-img: local tarball, generated by build.sh from a git clone — fd.o's -# archive endpoint 504s for hours at a stretch (killed CI runs 27/30/31) -source="libqmi-$_commit.tar.gz - " -builddir="$srcdir/$pkgname-$_commit" - -build() { - abuild-meson \ - -Db_lto=true \ - . output - meson compile -C output -} - -check() { - local tests=$(meson test --list -C output) - case "$CARCH" in - s390x) tests=${tests//test-message} ;; - esac - meson test --print-errorlogs -C output $tests -} - -package() { - DESTDIR="$pkgdir" meson install --no-rebuild -C output -} - -utils() { - pkgdesc="$pkgdesc (CLI utilities)" - - amove usr/bin -} - -sha512sums=" -fc178689675b47faaa46c14b126dc054354044238ea00464b4cc4910c5f2c73faaa12d80a5219fbfad65ab575e38f7af3fd79ae7974ea80ed67bfffe027b85c3 libqmi-cff17a676e10d75081516dafa997fe9bc9043c38.tar.gz -" diff --git a/build.sh b/build.sh index ea021bf..6852a95 100755 --- a/build.sh +++ b/build.sh @@ -153,7 +153,6 @@ clone_retry "$WORK/pmaports" -q --depth=1 "$PMAPORTS_REPO" rm -rf "$WORK/pmaports/device/testing/linux-postmarketos-qcom-milos" \ "$WORK/pmaports/main/postmarketos-config-nftables" \ "$WORK/pmaports/temp/libcamera" \ - "$WORK/pmaports/temp/libqmi" \ "$WORK/pmaports/temp/modemmanager" mkdir -p "$WORK/pmaports/temp" cp -r aports/device/linux-postmarketos-qcom-milos "$WORK/pmaports/device/testing/" @@ -166,9 +165,9 @@ cp -r aports/device/fp6-charging-mode "$WORK/pmaports/device/" cp -r aports/device/catcrafts-fp6-repo "$WORK/pmaports/device/" cp -r aports/main/postmarketos-config-nftables "$WORK/pmaports/main/" # imsd has no aport here at all: section 3b installs the published apk. -# Alpine forks carrying the GNSS patches (libqmi !470 unreleased; MM !1463 -# draft) - deps of modemmanager/imsd, built from aports because r100 > repo. -cp -r aports/temp/libqmi "$WORK/pmaports/temp/" +# Alpine fork carrying the GNSS patches (MM !1463, draft), built from aports +# because r101 > repo. libqmi needs no fork any more: Alpine's snapshot +# (1.38.0_git20261005) is past the !470 merge. cp -r aports/temp/modemmanager "$WORK/pmaports/temp/" # pmOS libcamera fork + the FP6 OV13B10 sensor-helper/properties patches # (r2 > pmOS r1) @@ -191,7 +190,7 @@ sed -i "s/^_commit=.*/_commit=\"$COMMIT\"/" "$KAPORT/APKBUILD" KDATE=$(git -C "$WORK/milos-src" log -1 --format=%cd --date=format:%Y%m%d) sed -i "s/^pkgver=\([0-9.]*\)\$/pkgver=\1_git$KDATE/" "$KAPORT/APKBUILD" -# Same dance for the gitlab.freedesktop.org packages (libqmi, modemmanager, +# Same dance for the gitlab.freedesktop.org packages (modemmanager, # libcamera): their pinned tarballs came from fd.o's on-demand archive # endpoint, which 503/504s for hours at a stretch — runs #25, #27, #30 and # #31 all died there, outlasting any in-run retry. git clone is served from @@ -209,9 +208,6 @@ fdo_tarball() { # fdo_tarball } FDO=https://gitlab.freedesktop.org -QMI_COMMIT=$(apkbuild_var "$WORK/pmaports/temp/libqmi" _commit) -fdo_tarball "$FDO/mobile-broadband/libqmi.git" \ - "$WORK/pmaports/temp/libqmi" "libqmi-$QMI_COMMIT" "$QMI_COMMIT" MM_COMMIT=$(apkbuild_var "$WORK/pmaports/temp/modemmanager" _commit) fdo_tarball "$FDO/mobile-broadband/ModemManager.git" \ "$WORK/pmaports/temp/modemmanager" "ModemManager-$MM_COMMIT" "$MM_COMMIT" @@ -239,12 +235,28 @@ systemd = always extra_packages = soc-fairphone-fp6-audio,callaudioshim,imsd,fingerprintd,fingerprintd-systemd,fingerprintd-agent,fp6-device-tweaks,fp6-charging-mode,catcrafts-fp6-repo,postmarketos-base-ui-audio-backend-pipewire,pipewire-pulse,pipewire-echo-cancel$UI_PACKAGES EOF -# All four source tarballs are generated locally above, so every checksum +# The local package repository under $WORKDIR is consulted before every +# other repository. Whether it survives from one CI run to the next is not +# established (run 60 rebuilt the packages run 58 had built, which says it +# did not), but nothing guarantees it either way, and a package nobody builds +# any more would win over Alpine's in the builds and in the images: the +# libqmi fork, retired 2026-10-12, as 1.39.1_git20260808. Delete its apks +# from every channel and rebuild the index from the files present (an index +# naming missing apks fails the next apk run), then make sure none is left. pmbootstrap's own 'zap --pkgs-local-mismatch' is no use here: +# with systemd selected it reads packages/systemd-edge, while the builds +# land in packages/edge. The dir belongs to the chroot uid (see 3b). +if [ -d "$WORKDIR/packages" ]; then + sudo find "$WORKDIR/packages" -name '*.apk' \( -name 'libqmi-*' -o -name 'qmi-utils-*' \) -delete + retry "re-index local packages" pmbootstrap index + left=$(sudo find "$WORKDIR/packages" -name '*.apk' \( -name 'libqmi-*' -o -name 'qmi-utils-*' \)) + [ -z "$left" ] || { echo "retired libqmi fork still in the local repository:" >&2; echo "$left" >&2; exit 1; } +fi + +# All three source tarballs are generated locally above, so every checksum # step is offline. libcamera needs a checksum step now too: its committed # sums were for the fd.o-served tarball, and git-archive output is not # byte-identical to it (verified: sha512 differs). pmbootstrap checksum linux-postmarketos-qcom-milos -pmbootstrap checksum libqmi pmbootstrap checksum modemmanager pmbootstrap checksum libcamera @@ -255,11 +267,8 @@ pmbootstrap checksum libcamera # kernel is unaffected either way (cross-native, no crossdirect). NOCROSS=${FP6IMG_NO_CROSSDIRECT:+--no-cross} -# pmbootstrap's install-time build plan is not dependency-ordered (it tried -# building modemmanager before the libqmi its makedepends require); build -# the GNSS stack bottom-up explicitly. 'pmbootstrap build' is a no-op when -# the package is already current. -retry "build libqmi" pmbootstrap $NOCROSS build --arch aarch64 libqmi +# Build the patched packages explicitly ('pmbootstrap build' is a no-op when +# the package is already current). retry "build modemmanager" pmbootstrap $NOCROSS build --arch aarch64 modemmanager # libcamera is no makedepend of anything here - build it explicitly so the # patched -r2 exists for the publish step even if the install set resolves