Commit graph fp6-img/build.sh
Author SHA1 Message Date
1c275d87d2 build.sh: carry FP6IMG_NO_CROSSDIRECT across the su re-exec
Some checks failed
image / image (push) Has been cancelled
su scrubs the environment, so the escape hatch from the previous commit
never reached the build user (verified: libcamera still built crossdirect
and failed identically).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 05:39:11 +02:00
380e042e44 build.sh: FP6IMG_NO_CROSSDIRECT=1 escape hatch for local builds
crossdirect's /native bridge breaks under local podman (cc: cannot execute
cc1: posix_spawnp ENOENT in meson setup) while qemu-only builds work fine;
the env flag routes the affected packages (libqmi/MM/libcamera + a new
explicit imsd pre-build, since install has no per-package flag) through
--no-cross. Identical package output, slower build; kernel stays
cross-native. CI behavior unchanged when the env is unset.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 05:15:53 +02:00
aa1227346e build.sh: retry the pmbootstrap pip install
The pmOS gitlab truncates clones under load (early EOF / invalid
index-pack); the pip install runs in the root branch before clone_retry
exists, so give it its own 3-attempt loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 04:51:06 +02:00
eb13c18ea8 aports: add fp6-charging-mode (offline charging, charger-boot detection)
Charger-insertion boots (androidboot.mode=charger, ABL-appended) divert to
a minimal charging.target instead of the full UI, ending the dead-battery
bootloop: ADSP charging/USB-PD runs, splash+panel killed ~6-10s in via an
initramfs hook, modem+cdsp stopped, radios/sensors suppressed, CPU capped.
Power key reboots to a normal boot, volume-up shows battery status,
volume-down enables USB ssh, unplug powers off. Measured >= breakeven on a
100mA-classified SDP port, strongly net-positive on real chargers.

Suspend duty-cycling (~13mA floor) exists behind an off-by-default flag:
resume from deep suspend intermittently kills the UFS link (hibern8 exit
failed ret=5) - do not enable until that kernel bug is fixed.

Byte-identical to the deployment verified on the dev phone 2026-08-24
(journal/power: r5 armed tests, crash autopsies, measurements).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-24 04:03:06 +02:00
0c6c4cde25 build: generate the fd.o source tarballs locally instead of fetching archives
Some checks failed
image / image (push) Has been cancelled
gitlab.freedesktop.org's on-demand archive endpoint 503/504s for hours
at a stretch: runs #25, #27, #30 and #31 all died in 'abuild checksum'
fetching the pinned libqmi tarball, outlasting the 3x30s in-run retry.
git clone is served from a different code path and holds up (verified
against all three repos while the archive endpoint was flaky), so clone
libqmi/ModemManager/libcamera (retried) and git-archive the pinned refs
into the aports, the same way the kernel and imsd tarballs are already
produced. The pins stay single-sourced in the APKBUILDs.

libcamera gains a checksum step: its committed sums were for the
fd.o-served tarball, and git-archive output is not byte-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-17 10:36:05 +02:00
8afa7f99f5 build: retry the source-fetching pmbootstrap steps
All checks were successful
image / image (push) Successful in 2h0m56s
Run #25 died at 'pmbootstrap checksum libqmi' on a bare HTTP 503 from
gitlab.freedesktop.org. That host serves three of this pipeline's inputs
(libqmi, modemmanager and now libcamera), and its 503s are transient - it
answered 200 again minutes later - so a hiccup there should cost a retry,
not a 2-hour run.

Same shape as clone_retry, applied to the checksum and build calls that
fetch sources. The kernel and imsd checksums need no retry: their tarballs
are generated locally by this script.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 18:08:17 +02:00
0a50cad153 build: actually wire the libcamera aport into the pmaports overlay
Some checks failed
image / image (push) Failing after 4m43s
34cfc09 added aports/temp/libcamera but never taught build.sh to copy it,
so run #24 built the image with pmOS's stock 99990.7.2-r1 and published no
libcamera package at all. Copy it like libqmi/modemmanager (upstream aport
deleted first - duplicate pkgnames are a pmbootstrap hard error) and build
it explicitly so the -r2 apk reaches the registry publish step.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-16 16:56:04 +02:00
9e60bb8c0a build: copy catcrafts-fp6-repo into the pmaports overlay
All checks were successful
image / image (push) Successful in 1h52m13s
Run 22 failed with 'catcrafts-fp6-repo: Could not find it in pmaports
or any APKINDEX': build.sh copies each overlay aport explicitly and
this one was never in the list, so pmbootstrap could not resolve the
new extra_packages entry.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 00:04:55 +02:00
957d3fd88c build: install catcrafts-fp6-repo so images subscribe to the apk registry
Some checks failed
image / image (push) Has been cancelled
The catcrafts-fp6-repo aport (signing key + repositories entry) existed
but nothing installed it: images shipped with the CI-built packages
baked in and no update channel, so 'apk upgrade' never delivered new
kernel/imsd builds despite CI publishing every apk to the registry.
Add it to extra_packages and document the registry in the README.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-14 23:00:42 +02:00
8eb33fc87d compressed single artifact
All checks were successful
image / image (push) Successful in 1h53m3s
2026-08-10 16:22:20 +02:00
bebf66f4fd compressed artifcats
All checks were successful
image / image (push) Successful in 1h54m35s
2026-08-10 10:40:50 +02:00
ccf23abf81 install.sh: one-command modem-preserving installer
erase dtbo + flash userdata + RAM-boot + dd boot_a from Linux + verify
modem NV and report honestly. Shipped in dist/ with every release; README
points at it. The one believed-safe-but-unisolated step (userdata flash)
is self-verified by the script's final check.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 01:29:17 +02:00
30f2778fc4 audio: select the pipewire backend explicitly and ban the pulse one
Full-system audit findings: without an explicit provider selection the
image installed real PulseAudio (Plasma Mobile hard-path), which claims
the card and ships a wireplumber fragment disabling hardware.audio -
zero sinks forever. Mirror the dev phone's world: pipewire backend meta
+ pipewire-pulse + echo-cancel in extra_packages, pulse meta banned via
apk conflict in fp6-device-tweaks. The two hand-made /etc audio
fragments (wireplumber no-ACP rule, AEC pair for VoLTE speakerphone)
move into soc-fairphone-fp6-audio.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:32:11 +02:00
ff69f4d913 fp6-no-suspend -> fp6-device-tweaks: + the three IMU-critical /etc files
Full-system audit on the flashed phone found the IMU dead: the journal's
documented reinstall-loss trio (inv-icm42600-spi modules-load - fallback-only
SPI node never coldplugs; the accel poll udev rule for auto-rotate; the
iio-sensor-proxy libssc-crash restart drop-in). All device-critical, none
personal - now packaged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-09 00:03:09 +02:00
05cd1084b7 image completeness: fp6-no-suspend + imsd boot enablement
Two device-critical pieces previously applied only by the dev restore
script: masked sleep targets (idle-suspend resets the WCN combo firmware
and kills wifi ~40min - a device defect, not personalization) and imsd
enabled at boot, gated on /etc/imsd.env existing so unconfigured systems
don't boot a failing unit. A stranger now needs exactly: flash, wifi via
UI, write imsd.env, restart imsd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 23:46:01 +02:00
8e5b8354d5 build.sh: build libqmi then modemmanager explicitly before install
pmbootstrap's install-time build plan is not topologically sorted; the
versioned makedep made that a hard error instead of a stale-dep build.
Explicit bottom-up build restores order; no-op when current.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:47:55 +02:00
2019e158aa modemmanager: versioned libqmi-dev makedep; kernel pkgver date stamping
pmbootstrap's build plan is not dependency-ordered: MM built first and
grabbed the cached 1.39.0 libqmi from the volume's package repo. The
versioned makedepend states the real requirement and forces our bumped
libqmi to build first. Kernel pkgver gains the source commit date so
registry-subscribed phones receive kernel updates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:39:14 +02:00
f8402f97a5 build.sh: retry flaky git clones; empty dist/ in place
The forgejo VM occasionally 500s under crawler load - a clone blip
should cost 10 seconds, not the run. dist/ keeps its inode so a shell
cd'd into it no longer breaks the next podman start.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 22:26:36 +02:00
da3d908b93 aports: GNSS via forked Alpine libqmi + modemmanager
libqmi: the upstream-merged (!470, in no release yet) LOC Register Events
client-identification TLVs, taken verbatim from upstream main (532de37e).
modemmanager: the AFW engine unlock + Position Report derivation (!1463,
still draft upstream, review-hardened and verified on device). Both as
patches on Alpine's git-snapshot aports, pkgrel=100.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 21:27:48 +02:00
4e43e6d57b image parity: imsd 0.3.0 (pinned public commit) + callaudioshim + modem-daemon override
imsd turns out to be fully public already (0.2.7 snapshot + emergency
stage 1 + the make build path) - no tag needed, same git-archive dance as
the kernel. callaudioshim was a load-bearing unpackaged home-dir script on
the phone (callaudiod replacement, working in-call mic mute); now an aport
autostarted at phase 1. kde-telephony's modem daemon autostart is hidden
via /etc/skel from the imsd package, mirroring the phone's user override.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:54:29 +02:00
719a10a997 aports: add soc-fairphone-fp6-audio (topology, amp config, UCM)
Files copied byte-identical from the tested dev phone; installed to the
exact deployed paths (the spaced tplg/UCM filenames come from the machine
driver's card name). Wired into the image via extra_packages.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:48:28 +02:00
939e2b84ba build.sh: require host /dev bind-mount instead of mknod snapshots
Some checks failed
image / image (push) Failing after 1h11m3s
Partition nodes (loopNpM) only appear via the host devtmpfs; a privileged
container's own /dev never gains them. Drop the static mknod dance, warn
when /dev is not the host's.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:28:46 +02:00
3dad95c4a1 build.sh: document host loop requirement; dump pmbootstrap log on failure
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 20:11:03 +02:00
6fb3ff27ef build.sh: create static loop + dm device nodes in the container
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:57:43 +02:00
95ec50d0b0 build.sh: mkdir /usr/local/sbin before writing the modprobe stub
Some checks are pending
image / image (push) Has started running
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:39:45 +02:00
c2c2e90d3a build.sh: stub modprobe in the container; loop autoloads host-side
Some checks failed
image / image (push) Failing after 16s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 19:36:55 +02:00
a1060024ac build.sh: add kpartx + util-linux losetup to the job container
Some checks failed
image / image (push) Failing after 59m28s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:43:26 +02:00
ca9e36c95c build.sh: pin pmbootstrap 3.11.1 from git
Some checks failed
image / image (push) Failing after 2m5s
Alpine's packaged pmbootstrap predates pmaports' master->main rename and
fails reading channels.cfg. Pinning also matches the version the rest of
this script was written against.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:40:11 +02:00
127b21e124 build.sh: create the pmbootstrap work dir + version stamp ourselves
Some checks failed
image / image (push) Failing after 1m45s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:35:01 +02:00
9e30e6b4ee build.sh: write pmbootstrap config directly; propagate errors; keep checkout root-owned
Some checks failed
image / image (push) Failing after 1m40s
'pmbootstrap config' demands an existing config file, so write
pmbootstrap_v3.cfg ourselves (INI, aports/device/ui/systemd). Explicit
set -eu because 'sh script' ignores shebang flags - run 3 shipped a
3.5KB 'image' because failures didn't propagate. dist/ is now the only
build-user-owned path, so the tag step's git works again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:30:19 +02:00
2d38be3cf4 build.sh: set the executable bit
Some checks failed
image / image (push) Failing after 1m40s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:23:49 +02:00
074d1b1c90 build.sh: first runnable revision
Some checks failed
image / image (push) Failing after 11s
Learned from the pmbootstrap 3.11 source: aports overlays must replace
upstream dirs in one tree (duplicate pkgnames are a hard error), pmbootstrap
refuses root (drop to a sudo-capable build user), and export symlinks are
boot.img + fairphone-fp6.img. Stage 1 builds without imsd until the v0.3.0
tag exists. Temporary push trigger for bring-up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 16:20:02 +02:00
de2e819a16 scaffold: aports overlay, build script, CI workflow, README
Kernel aport forked from pmaports 7.1.2-r0, repointed at milos-linux
combined-stable with the tested FP6 config (+EFI_ZBOOT for packaging);
imsd + nftables aports from the pending pmaports submission. build.sh
carries TODO(validate) markers - not yet run end-to-end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-08 15:42:45 +02:00