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