<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.specnext.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SirCliveSinclairbot</id>
	<title>SpecNext Wiki - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.specnext.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SirCliveSinclairbot"/>
	<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/Special:Contributions/SirCliveSinclairbot"/>
	<updated>2026-07-06T16:50:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41924</id>
		<title>Pi:dev build environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41924"/>
		<updated>2026-05-05T18:07:52Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Working draft.&#039;&#039;&#039; Procedure re-validated 2026-05-05 on Pi OS Bookworm / Pi 5.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Reproducible procedure for setting up a build host that produces stretch-armhf binaries (compatible with the Raspbian-9 base used by NextPi) on any modern aarch64 Raspberry Pi running Pi OS Bookworm.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Why ==&lt;br /&gt;
&lt;br /&gt;
NextPi releases ship as Raspbian 9 (stretch) armhf binaries. This procedure builds those binaries inside a stretch-armhf chroot hosted on a modern aarch64 Pi. aarch64 hardware can execute armhf userspace natively via aarch32 compat, so the build runs at host CPU speed without QEMU emulation, while the toolchain and libraries remain pinned to stretch for ABI compatibility with the deployment target. Apt sources point at the project&#039;s stretch mirror at &amp;lt;code&amp;gt;http://zx.xalior.com/nextpi_dev&amp;lt;/code&amp;gt;, which keeps package versions deterministic across build hosts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Measured speedup, libspectrum 1.6.0 build:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Build host !! Time !! Ratio&lt;br /&gt;
|-&lt;br /&gt;
| Pi 3, 4× Cortex-A53 armv7l, SD card (native stretch) || 65 s || 1.0×&lt;br /&gt;
|-&lt;br /&gt;
| Pi 5, 4× Cortex-A76 aarch64, NVMe (chroot) || 11 s || 5.9×&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Vanilla Pi OS Bookworm on a Pi 4 or Pi 5 with ~5 GB free disk.&lt;br /&gt;
* SSH access as a sudo-capable user.&lt;br /&gt;
* Network reach to &amp;lt;code&amp;gt;zx.xalior.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Install host tooling ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install -y debootstrap qemu-user-static binfmt-support&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --print-foreign-architectures   # should list: armhf&lt;br /&gt;
ls /proc/sys/fs/binfmt_misc/ | grep qemu-arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Add the apt signing key ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://zx.xalior.com/nextpi_dev/debian_nextpi.key \&lt;br /&gt;
  | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian_nextpi.gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/debian_nextpi.gpg --list-keys&lt;br /&gt;
# pub rsa2048 2012-04-01 [SC] A0DA38D0D76E8B5D638872819165938D90FDDD2E&lt;br /&gt;
# uid Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Debootstrap the chroot ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo debootstrap --arch=armhf --variant=buildd \&lt;br /&gt;
    --keyring=/etc/apt/trusted.gpg.d/debian_nextpi.gpg \&lt;br /&gt;
    stretch /srv/nextpi-buildroot/ \&lt;br /&gt;
    http://zx.xalior.com/nextpi_dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ends with &amp;lt;code&amp;gt;W: Failure while configuring required packages&amp;lt;/code&amp;gt;. Continue.&lt;br /&gt;
&lt;br /&gt;
=== 4. Neutralise segfaulting postinsts and force-install ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for pkg in systemd plymouth mountall; do&lt;br /&gt;
  printf &#039;#!/bin/sh\nexit 0\n&#039; \&lt;br /&gt;
    | sudo tee /srv/nextpi-buildroot/var/lib/dpkg/info/${pkg}.postinst &amp;gt; /dev/null&lt;br /&gt;
  sudo chmod +x /srv/nextpi-buildroot/var/lib/dpkg/info/${pkg}.postinst&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;dpkg --install --force-depends --force-confdef --force-confold --force-overwrite --force-bad-version --recursive /var/cache/apt/archives/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Errors on &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plymouth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mountall&amp;lt;/code&amp;gt; are expected. Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;type apt-get &amp;amp;&amp;amp; type gcc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Bind-mount runtime filesystems ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for m in proc sys dev dev/pts; do&lt;br /&gt;
  sudo mkdir -p /srv/nextpi-buildroot/$m&lt;br /&gt;
  sudo mount --bind /$m /srv/nextpi-buildroot/$m&lt;br /&gt;
done&lt;br /&gt;
sudo cp /etc/resolv.conf /srv/nextpi-buildroot/etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Session-only; see [[#Persistent mounts|Persistent mounts]] for fstab.&lt;br /&gt;
&lt;br /&gt;
=== 6. Hold systemd, plymouth, mountall ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-mark hold systemd plymouth mountall&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Install the NextPi 1.92D package set + dev variants ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &amp;quot;&lt;br /&gt;
        apt-get update -qq &amp;amp;&amp;amp; \&lt;br /&gt;
        wget -q -O /tmp/buildroot.packages https://zx.xalior.com/nextpi_dev/buildroot.packages &amp;amp;&amp;amp; \&lt;br /&gt;
        DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \&lt;br /&gt;
            \$(cat /tmp/buildroot.packages)&lt;br /&gt;
    &amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~50 s on Pi 5 / NVMe; chroot grows to ~2.0 GB. Toolchain check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c \&lt;br /&gt;
    &amp;quot;gcc --version | head -1; automake --version | head -1; libtool --version | head -1; pkg-config --version&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expect: &amp;lt;code&amp;gt;gcc 6.3.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;automake 1.15&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libtool 2.4.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config 0.29&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 8. Smoke test: build libspectrum 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &#039;&lt;br /&gt;
        cd /tmp &amp;amp;&amp;amp; \&lt;br /&gt;
        wget -q https://sourceforge.net/projects/fuse-emulator/files/libspectrum/1.6.0/libspectrum-1.6.0.tar.gz/download -O libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        tar xzf libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        cd libspectrum-1.6.0 &amp;amp;&amp;amp; \&lt;br /&gt;
        ./configure --with-fake-glib --quiet &amp;amp;&amp;amp; \&lt;br /&gt;
        time make -s&lt;br /&gt;
    &#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~10–15 s on Pi 5 / NVMe. Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file /srv/nextpi-buildroot/tmp/libspectrum-1.6.0/.libs/libspectrum.so.8.10.0&lt;br /&gt;
# ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Persistent mounts ==&lt;br /&gt;
&lt;br /&gt;
Add to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/proc        /srv/nextpi-buildroot/proc      none  bind  0 0&lt;br /&gt;
/sys         /srv/nextpi-buildroot/sys       none  bind  0 0&lt;br /&gt;
/dev         /srv/nextpi-buildroot/dev       none  bind  0 0&lt;br /&gt;
/dev/pts     /srv/nextpi-buildroot/dev/pts   none  bind  0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; needs re-copying after host reboot.&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
* Apt mirror: &amp;lt;code&amp;gt;http://zx.xalior.com/nextpi_dev stretch main contrib non-free rpi firmware&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Signing key: https://zx.xalior.com/nextpi_dev/debian_nextpi.key — sha256 &amp;lt;code&amp;gt;ca59cd4f2bcbc3a1d41ba6815a02a8dc5c175467a59bd87edeac458f4a5345de&amp;lt;/code&amp;gt;. Byte-identical to https://archive.raspbian.org/raspbian.public.key.&lt;br /&gt;
* Package list: https://zx.xalior.com/nextpi_dev/buildroot.packages — 369 entries (NextPi 1.92D installed set, less firmware/kernel/Pi-hardware, plus available &amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt; variants).&lt;br /&gt;
* Smoke-test source: libspectrum 1.6.0 from https://sourceforge.net/projects/fuse-emulator/files/libspectrum/.&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41921</id>
		<title>Pi:dev build environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41921"/>
		<updated>2026-05-05T17:14:43Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Early draft.&#039;&#039;&#039; Procedure validated 2026-05-05 on Pi OS Bookworm / Pi 5. Corrections welcome on the talk page.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Reproducible procedure for setting up a build host that produces stretch-armhf binaries (compatible with the Raspbian-9 base used by NextPi) on any modern aarch64 Raspberry Pi running Pi OS Bookworm.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Why ==&lt;br /&gt;
&lt;br /&gt;
NextPi releases ship as Raspbian 9 (stretch) armhf binaries. This procedure builds those binaries inside a stretch-armhf chroot hosted on a modern aarch64 Pi. aarch64 hardware can execute armhf userspace natively via aarch32 compat, so the build runs at host CPU speed without QEMU emulation, while the toolchain and libraries remain pinned to stretch for ABI compatibility with the deployment target. Apt sources point at the project&#039;s stretch mirror at &amp;lt;code&amp;gt;http://zx.xalior.com/nextpi_dev&amp;lt;/code&amp;gt;, which keeps package versions deterministic across build hosts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Measured speedup, libspectrum 1.6.0 build:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Build host !! Time !! Ratio&lt;br /&gt;
|-&lt;br /&gt;
| Pi 3, 4× Cortex-A53 armv7l, SD card (native stretch) || 65 s || 1.0×&lt;br /&gt;
|-&lt;br /&gt;
| Pi 5, 4× Cortex-A76 aarch64, NVMe (chroot) || 11 s || 5.9×&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Vanilla Pi OS Bookworm on a Pi 4 or Pi 5 with ~5 GB free disk.&lt;br /&gt;
* SSH access as a sudo-capable user.&lt;br /&gt;
* Network reach to &amp;lt;code&amp;gt;zx.xalior.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Install host tooling ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install -y debootstrap qemu-user-static binfmt-support&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;qemu-user-static&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;binfmt-support&amp;lt;/code&amp;gt; register handlers so debootstrap can run armhf binaries during second-stage configure. (On Pi 5 the host kernel can also execute armhf natively via aarch32 compat; binfmt-misc is the fallback.)&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --print-foreign-architectures   # should list: armhf&lt;br /&gt;
ls /proc/sys/fs/binfmt_misc/ | grep qemu-arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Add the apt signing key ===&lt;br /&gt;
&lt;br /&gt;
The mirror is signed with the canonical Raspbian archive key (Mike Thompson, fingerprint &amp;lt;code&amp;gt;A0DA 38D0 D76E 8B5D 6388 7281 9165 938D 90FD DD2E&amp;lt;/code&amp;gt;). Modern Pi OS Bookworm doesn&#039;t ship it, so add it explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://zx.xalior.com/nextpi_dev/debian_nextpi.key \&lt;br /&gt;
  | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian_nextpi.gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/debian_nextpi.gpg --list-keys&lt;br /&gt;
# pub rsa2048 2012-04-01 [SC] A0DA38D0D76E8B5D638872819165938D90FDDD2E&lt;br /&gt;
# uid Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Debootstrap the chroot ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo debootstrap --arch=armhf --variant=buildd \&lt;br /&gt;
    --keyring=/etc/apt/trusted.gpg.d/debian_nextpi.gpg \&lt;br /&gt;
    stretch /srv/nextpi-buildroot/ \&lt;br /&gt;
    http://zx.xalior.com/nextpi_dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
debootstrap downloads ~50 MB of &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt;s, extracts them, and ends with this warning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
W: Failure while configuring required packages.&lt;br /&gt;
W: See /srv/nextpi-buildroot/debootstrap/debootstrap.log for details (possibly the package systemd is at fault)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is expected — stretch&#039;s &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; postinst segfaults under Pi 5&#039;s kernel via aarch32 compat. The next step works around it; systemd is never actually run inside a build chroot.&lt;br /&gt;
&lt;br /&gt;
=== 4. Force-install the unconfigured packages ===&lt;br /&gt;
&lt;br /&gt;
The systemd configure failure halts dpkg&#039;s pending-configure pass and leaves several packages (including &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;) unpacked-but-not-installed. Force them through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;dpkg --install --force-depends --force-confdef --force-confold --force-overwrite --force-bad-version --recursive /var/cache/apt/archives/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Errors on &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plymouth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mountall&amp;lt;/code&amp;gt; are expected and harmless.&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;type apt-get &amp;amp;&amp;amp; type gcc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Bind-mount runtime filesystems ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for m in proc sys dev dev/pts; do&lt;br /&gt;
  sudo mkdir -p /srv/nextpi-buildroot/$m&lt;br /&gt;
  sudo mount --bind /$m /srv/nextpi-buildroot/$m&lt;br /&gt;
done&lt;br /&gt;
sudo cp /etc/resolv.conf /srv/nextpi-buildroot/etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are session-only; see [[#Persistent mounts|Persistent mounts]] below for fstab.&lt;br /&gt;
&lt;br /&gt;
=== 6. Hold the broken packages ===&lt;br /&gt;
&lt;br /&gt;
So future &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt; runs don&#039;t re-extract systemd and re-trigger the postinst:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-mark hold systemd plymouth mountall&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Install build dependencies ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-get update &amp;amp;&amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \&lt;br /&gt;
        autoconf automake libtool libtool-bin pkg-config \&lt;br /&gt;
        libbz2-dev libaudiofile-dev \&lt;br /&gt;
        wget git ca-certificates&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libtool-bin&amp;lt;/code&amp;gt; is required separately on stretch — the &amp;lt;code&amp;gt;libtool&amp;lt;/code&amp;gt; umbrella package no longer ships the &amp;lt;code&amp;gt;/usr/bin/libtool&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;W: APT had planned for dpkg to do more than it reported back&amp;lt;/code&amp;gt; warning about &amp;lt;code&amp;gt;systemd:armhf&amp;lt;/code&amp;gt; will appear on every apt-get run; that&#039;s the hold doing its job.&lt;br /&gt;
&lt;br /&gt;
Toolchain check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c \&lt;br /&gt;
    &amp;quot;gcc --version | head -1; automake --version | head -1; libtool --version | head -1; pkg-config --version&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expect: &amp;lt;code&amp;gt;gcc 6.3.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;automake 1.15&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libtool 2.4.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config 0.29&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 8. Smoke test: build libspectrum 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &#039;&lt;br /&gt;
        cd /tmp &amp;amp;&amp;amp; \&lt;br /&gt;
        wget -q https://sourceforge.net/projects/fuse-emulator/files/libspectrum/1.6.0/libspectrum-1.6.0.tar.gz/download -O libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        tar xzf libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        cd libspectrum-1.6.0 &amp;amp;&amp;amp; \&lt;br /&gt;
        ./configure --with-fake-glib --quiet &amp;amp;&amp;amp; \&lt;br /&gt;
        time make -s&lt;br /&gt;
    &#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wall-clock ~10–15 s on Pi 5 / NVMe. Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file /srv/nextpi-buildroot/tmp/libspectrum-1.6.0/.libs/libspectrum.so.8.10.0&lt;br /&gt;
# ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chroot is ready.&lt;br /&gt;
&lt;br /&gt;
== Persistent mounts ==&lt;br /&gt;
&lt;br /&gt;
The bind mounts in step 5 are session-only. For a long-lived build host, add to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/proc        /srv/nextpi-buildroot/proc      none  bind  0 0&lt;br /&gt;
/sys         /srv/nextpi-buildroot/sys       none  bind  0 0&lt;br /&gt;
/dev         /srv/nextpi-buildroot/dev       none  bind  0 0&lt;br /&gt;
/dev/pts     /srv/nextpi-buildroot/dev/pts   none  bind  0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; will need re-copying after host reboot regardless.)&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41920</id>
		<title>Pi:dev build environment</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:dev_build_environment&amp;diff=41920"/>
		<updated>2026-05-05T17:13:35Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|&#039;&#039;&#039;Early draft.&#039;&#039;&#039; Procedure validated 2026-05-05 on Pi OS Bookworm / Pi 5. Corrections welcome on the talk page.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Reproducible procedure for setting up a build host that produces stretch-armhf binaries (compatible with the Raspbian-9 base used by NextPi) on any modern aarch64 Raspberry Pi running Pi OS Bookworm.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Why ==&lt;br /&gt;
&lt;br /&gt;
NextPi releases ship as Raspbian 9 (stretch) armhf binaries. This procedure builds those binaries inside a stretch-armhf chroot hosted on a modern aarch64 Pi. aarch64 hardware can execute armhf userspace natively via aarch32 compat, so the build runs at host CPU speed without QEMU emulation, while the toolchain and libraries remain pinned to stretch for ABI compatibility with the deployment target. Apt sources point at the project&#039;s stretch mirror at &amp;lt;code&amp;gt;http://zx.xalior.com/nextpi_dev&amp;lt;/code&amp;gt;, which keeps package versions deterministic across build hosts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Measured speedup, libspectrum 1.6.0 build:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Build host !! Time !! Ratio&lt;br /&gt;
|-&lt;br /&gt;
| Pi 3, 4× Cortex-A53 armv7l, SD card (native stretch) || 65 s || 1.0×&lt;br /&gt;
|-&lt;br /&gt;
| Pi 5, 4× Cortex-A76 aarch64, NVMe (chroot) || 11 s || 5.9×&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Vanilla Pi OS Bookworm on a Pi 4 or Pi 5 with ~5 GB free disk.&lt;br /&gt;
* SSH access as a sudo-capable user.&lt;br /&gt;
* Network reach to &amp;lt;code&amp;gt;zx.xalior.com&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Install host tooling ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt-get install -y debootstrap qemu-user-static binfmt-support&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;qemu-user-static&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;binfmt-support&amp;lt;/code&amp;gt; register handlers so debootstrap can run armhf binaries during second-stage configure. (On Pi 5 the host kernel can also execute armhf natively via aarch32 compat; binfmt-misc is the fallback.)&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dpkg --print-foreign-architectures   # should list: armhf&lt;br /&gt;
ls /proc/sys/fs/binfmt_misc/ | grep qemu-arm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Add the apt signing key ===&lt;br /&gt;
&lt;br /&gt;
The mirror is signed with the canonical Raspbian archive key (Mike Thompson, fingerprint &amp;lt;code&amp;gt;A0DA 38D0 D76E 8B5D 6388 7281 9165 938D 90FD DD2E&amp;lt;/code&amp;gt;). Modern Pi OS Bookworm doesn&#039;t ship it, so add it explicitly:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -sL https://zx.xalior.com/nextpi_dev/debian_nextpi.key \&lt;br /&gt;
  | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/debian_nextpi.gpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Confirm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg.d/debian_nextpi.gpg --list-keys&lt;br /&gt;
# pub rsa2048 2012-04-01 [SC] A0DA38D0D76E8B5D638872819165938D90FDDD2E&lt;br /&gt;
# uid Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Debootstrap the chroot ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo debootstrap --arch=armhf --variant=buildd \&lt;br /&gt;
    --keyring=/etc/apt/trusted.gpg.d/debian_nextpi.gpg \&lt;br /&gt;
    stretch /srv/nextpi-buildroot/ \&lt;br /&gt;
    http://zx.xalior.com/nextpi_dev&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
debootstrap downloads ~50 MB of &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt;s, extracts them, and ends with this warning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
W: Failure while configuring required packages.&lt;br /&gt;
W: See /srv/nextpi-buildroot/debootstrap/debootstrap.log for details (possibly the package systemd is at fault)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This is expected — stretch&#039;s &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt; postinst segfaults under Pi 5&#039;s kernel via aarch32 compat. The next step works around it; systemd is never actually run inside a build chroot.&lt;br /&gt;
&lt;br /&gt;
=== 4. Force-install the unconfigured packages ===&lt;br /&gt;
&lt;br /&gt;
The systemd configure failure halts dpkg&#039;s pending-configure pass and leaves several packages (including &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;) unpacked-but-not-installed. Force them through:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;dpkg --install --force-depends --force-confdef --force-confold --force-overwrite --force-bad-version --recursive /var/cache/apt/archives/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Errors on &amp;lt;code&amp;gt;systemd&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;plymouth&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mountall&amp;lt;/code&amp;gt; are expected and harmless.&lt;br /&gt;
&lt;br /&gt;
Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;type apt-get &amp;amp;&amp;amp; type gcc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5. Bind-mount runtime filesystems ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for m in proc sys dev dev/pts; do&lt;br /&gt;
  sudo mkdir -p /srv/nextpi-buildroot/$m&lt;br /&gt;
  sudo mount --bind /$m /srv/nextpi-buildroot/$m&lt;br /&gt;
done&lt;br /&gt;
sudo cp /etc/resolv.conf /srv/nextpi-buildroot/etc/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are session-only; see [[#Persistent mounts|Persistent mounts]] below for fstab.&lt;br /&gt;
&lt;br /&gt;
=== 6. Hold the broken packages ===&lt;br /&gt;
&lt;br /&gt;
So future &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt; runs don&#039;t re-extract systemd and re-trigger the postinst:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-mark hold systemd plymouth mountall&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Install build dependencies ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &amp;quot;apt-get update &amp;amp;&amp;amp; DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \&lt;br /&gt;
        autoconf automake libtool libtool-bin pkg-config \&lt;br /&gt;
        libbz2-dev libaudiofile-dev \&lt;br /&gt;
        wget git ca-certificates&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;libtool-bin&amp;lt;/code&amp;gt; is required separately on stretch — the &amp;lt;code&amp;gt;libtool&amp;lt;/code&amp;gt; umbrella package no longer ships the &amp;lt;code&amp;gt;/usr/bin/libtool&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;W: APT had planned for dpkg to do more than it reported back&amp;lt;/code&amp;gt; warning about &amp;lt;code&amp;gt;systemd:armhf&amp;lt;/code&amp;gt; will appear on every apt-get run; that&#039;s the hold doing its job.&lt;br /&gt;
&lt;br /&gt;
Toolchain check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin /bin/bash -c \&lt;br /&gt;
    &amp;quot;gcc --version | head -1; automake --version | head -1; libtool --version | head -1; pkg-config --version&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expect: &amp;lt;code&amp;gt;gcc 6.3.0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;automake 1.15&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;libtool 2.4.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pkg-config 0.29&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 8. Smoke test: build libspectrum 1.6.0 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo chroot /srv/nextpi-buildroot \&lt;br /&gt;
    /usr/bin/env -i PATH=/usr/sbin:/usr/bin:/sbin:/bin LANG=C HOME=/root \&lt;br /&gt;
    /bin/bash -c &#039;&lt;br /&gt;
        cd /tmp &amp;amp;&amp;amp; \&lt;br /&gt;
        wget -q https://sourceforge.net/projects/fuse-emulator/files/libspectrum/1.6.0/libspectrum-1.6.0.tar.gz/download -O libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        tar xzf libspectrum-1.6.0.tar.gz &amp;amp;&amp;amp; \&lt;br /&gt;
        cd libspectrum-1.6.0 &amp;amp;&amp;amp; \&lt;br /&gt;
        ./configure --with-fake-glib --quiet &amp;amp;&amp;amp; \&lt;br /&gt;
        time make -s&lt;br /&gt;
    &#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wall-clock ~10–15 s on Pi 5 / NVMe. Verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file /srv/nextpi-buildroot/tmp/libspectrum-1.6.0/.libs/libspectrum.so.8.10.0&lt;br /&gt;
# ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chroot is ready.&lt;br /&gt;
&lt;br /&gt;
== Persistent mounts ==&lt;br /&gt;
&lt;br /&gt;
The bind mounts in step 5 are session-only. For a long-lived build host, add to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/proc        /srv/nextpi-buildroot/proc      none  bind  0 0&lt;br /&gt;
/sys         /srv/nextpi-buildroot/sys       none  bind  0 0&lt;br /&gt;
/dev         /srv/nextpi-buildroot/dev       none  bind  0 0&lt;br /&gt;
/dev/pts     /srv/nextpi-buildroot/dev/pts   none  bind  0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(&amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; will need re-copying after host reboot regardless.)&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:CLI&amp;diff=41914</id>
		<title>Pi:CLI</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:CLI&amp;diff=41914"/>
		<updated>2026-05-02T08:50:50Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
The NextPi CLI API is a series of &amp;quot;supported&amp;quot; command-line tools designed to make performing specific Pi orientated tasks easier for Spectrum Next application developers.&lt;br /&gt;
&lt;br /&gt;
The CLI API commands are built out of two parts - known as &amp;quot;Frontends&amp;quot; and &amp;quot;Backends&amp;quot;.  &amp;quot;Frontends&amp;quot; commands all begin with &amp;lt;code&amp;gt;nextpi-&amp;lt;/code&amp;gt; and broken into logical groups (e.g. &amp;lt;code&amp;gt;nextpi-console_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nextpi-play_&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;nextpi-admin_&amp;lt;/code&amp;gt;, etc) - this naming convention allows you to easily tell at a glance what kind of function a command will perform, and for you to know that your commands should continue to work in future NextPi patches.&lt;br /&gt;
&lt;br /&gt;
== More About Frontends &amp;amp; Backends ==&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Frontend&#039;&#039;&#039; commands often perform their operations via the means of various internal system APIs - in a more traditional Linux setup these Frontends would be called &amp;quot;wrapper scripts&amp;quot;.  The underlying system tools used by Frontends are what we referred to as &#039;&#039;&#039;Backends&#039;&#039;&#039; - and you&#039;ll often see this term used on individual API CLI pages.&lt;br /&gt;
&lt;br /&gt;
The use of a &amp;quot;formal CLI API&amp;quot; via these Frontend wrappers permits several things:&lt;br /&gt;
* The addition of extra options and commandline switches not present in the backends;&lt;br /&gt;
* The inclusion of default parameters for many of the commands, or to save boilerplate options; and&lt;br /&gt;
* A way of &amp;quot;future-proofing&amp;quot; should the backend need to change for any reason.&lt;br /&gt;
&lt;br /&gt;
Many of the backends support additional options, which can be found by reading the documentation for the individual backends (not included in this wiki) - while this may provide you with extra functionality, it comes at the cost of no assurance that these &amp;quot;undocument features&amp;quot; will also continue to work in future NextPi patches.&lt;br /&gt;
&lt;br /&gt;
== Defining &amp;quot;supported&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
In the context of the CLI API &amp;quot;supported&amp;quot; means we will try with &amp;quot;best effort&amp;quot; to ensure that documented usage patterns will continue to work.  It does not mean that they come with any warrenty of &amp;quot;technical support&amp;quot;, actual or implied - to make these APIs work with your own code.  Developer support is community provided, and if you&#039;re looking for help the best place to try is the Official Spectrum Next discord, found at https://zxn.gg/discord.&lt;br /&gt;
&lt;br /&gt;
== CLI commands ==&lt;br /&gt;
&lt;br /&gt;
* nextpi-admin_clean&lt;br /&gt;
* nextpi-admin_disable&lt;br /&gt;
* nextpi-admin_enable&lt;br /&gt;
* [[Pi:admin_pupextract|nextpi-admin_pupextract]]&lt;br /&gt;
* nextpi-admin_report&lt;br /&gt;
* nextpi-admin_uihelper&lt;br /&gt;
* nextpi-admin_update&lt;br /&gt;
* nextpi-admin_version&lt;br /&gt;
* nextpi-audio_loopback&lt;br /&gt;
* nextpi-cache&lt;br /&gt;
* nextpi-cache_bucket&lt;br /&gt;
* [[Pi:console_image|nextpi-console_image]]&lt;br /&gt;
* [[Pi:console_resolution|nextpi-console_resolution]]&lt;br /&gt;
* nextpi-dongle_disable&lt;br /&gt;
* nextpi-dongle_enable&lt;br /&gt;
* nextpi-echo_disable&lt;br /&gt;
* nextpi-echo_enable&lt;br /&gt;
* nextpi-file_delete&lt;br /&gt;
* nextpi-file_receive&lt;br /&gt;
* nextpi-file_rename&lt;br /&gt;
* nextpi-file_stream&lt;br /&gt;
* nextpi-file_transmit&lt;br /&gt;
* [[Pi:gpio_mode|nextpi-gpio_mode]] &lt;br /&gt;
* nextpi-input_xbox&lt;br /&gt;
* nextpi-play_midiLQ&lt;br /&gt;
* nextpi-play_midiHQ&lt;br /&gt;
* nextpi-play_midiMQ&lt;br /&gt;
* nextpi-play_mod&lt;br /&gt;
* nextpi-play_mp3&lt;br /&gt;
* nextpi-play_sid&lt;br /&gt;
* nextpi-play_silence&lt;br /&gt;
* nextpi-play_sndh&lt;br /&gt;
* nextpi-play_speech&lt;br /&gt;
* nextpi-play_stock&lt;br /&gt;
* nextpi-play_stop&lt;br /&gt;
* nextpi-plus_activate&lt;br /&gt;
* nextpi-plus_list&lt;br /&gt;
* nextpi-plus_lock&lt;br /&gt;
* nextpi-plus_unlock&lt;br /&gt;
* nextpi-tzx_load&lt;br /&gt;
* nextpi-ui_file&lt;br /&gt;
* nextpi-ui_texteditor&lt;br /&gt;
* nextpi-z88dk_switch&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:admin_pupextract&amp;diff=41913</id>
		<title>Pi:admin pupextract</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:admin_pupextract&amp;diff=41913"/>
		<updated>2026-05-02T08:50:33Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
`nextpi-admin_pupextract` validates a Pi Update Patch (`.PUP`) file&#039;s header and extracts its payload archive ready for a subsequent update step.&lt;br /&gt;
&lt;br /&gt;
== Prerequisits ==&lt;br /&gt;
&lt;br /&gt;
* NextPi Version: 1.93A&lt;br /&gt;
&lt;br /&gt;
== Backend ==&lt;br /&gt;
* Binary: Proprietory&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&amp;lt;code&amp;gt;-h&amp;lt;/code&amp;gt; display usage information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-vl&amp;lt;/code&amp;gt; verbose logging (writes to &amp;lt;code&amp;gt;/tmp/puphelper.log&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;-c&amp;lt;/code&amp;gt; check the patch&#039;s version requirement against the running system without extracting&lt;br /&gt;
&lt;br /&gt;
A single positional argument names the &amp;lt;code&amp;gt;.PUP&amp;lt;/code&amp;gt; file to inspect.&lt;br /&gt;
&lt;br /&gt;
== Behaviour ==&lt;br /&gt;
&lt;br /&gt;
The first 512 bytes of the file are read as a PUP header. The header is rejected unless its signature reads &amp;lt;code&amp;gt;PUP&amp;lt;/code&amp;gt;, its secondary signature byte is &amp;lt;code&amp;gt;254&amp;lt;/code&amp;gt;, and its version field is &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;. If the header&#039;s &amp;lt;code&amp;gt;strict&amp;lt;/code&amp;gt; flag is set, the header&#039;s &amp;lt;code&amp;gt;piMajor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;piMinor&amp;lt;/code&amp;gt; must match the running NextPi&#039;s major and minor version; otherwise the patch is refused.&lt;br /&gt;
&lt;br /&gt;
On success, the payload that follows the header is copied to &amp;lt;code&amp;gt;/ram/update.tbz&amp;lt;/code&amp;gt; in 1 MiB chunks, ready for a subsequent step in the update pipeline.&lt;br /&gt;
&lt;br /&gt;
== Errors ==&lt;br /&gt;
&lt;br /&gt;
* File of 512 bytes or fewer — too small to contain a header.&lt;br /&gt;
* Header signature mismatch — not a PUP, or unsupported version.&lt;br /&gt;
* Strict-mode version mismatch — the running NextPi does not satisfy the patch&#039;s version requirement.&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:9e2a321f-e57d-4fed-8d36-c226abdead75&amp;diff=41912</id>
		<title>Pi:9e2a321f-e57d-4fed-8d36-c226abdead75</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:9e2a321f-e57d-4fed-8d36-c226abdead75&amp;diff=41912"/>
		<updated>2026-05-02T08:48:50Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Abstract ==&lt;br /&gt;
&lt;br /&gt;
A transient synthetic test target used during Phase 3 verification of the `pi-wiki-publish` skill. It does not document a real frontend and may be deleted at any time.&lt;br /&gt;
&lt;br /&gt;
== Prerequisits ==&lt;br /&gt;
&lt;br /&gt;
* NextPi Version: any&lt;br /&gt;
&lt;br /&gt;
== Backend ==&lt;br /&gt;
* Binary: none (synthetic test target)&lt;br /&gt;
&lt;br /&gt;
== Options ==&lt;br /&gt;
&lt;br /&gt;
None.&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
	<entry>
		<id>https://wiki.specnext.dev/index.php?title=Pi:9e2a321f-e57d-4fed-8d36-c226abdead75&amp;diff=41911</id>
		<title>Pi:9e2a321f-e57d-4fed-8d36-c226abdead75</title>
		<link rel="alternate" type="text/html" href="https://wiki.specnext.dev/index.php?title=Pi:9e2a321f-e57d-4fed-8d36-c226abdead75&amp;diff=41911"/>
		<updated>2026-05-02T08:45:26Z</updated>

		<summary type="html">&lt;p&gt;SirCliveSinclairbot: via /pi-wiki-publish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sandbox ==&lt;br /&gt;
&lt;br /&gt;
This page is a transient synthetic test for the [[Pi:CLI|nextpi-]] wiki publisher tooling. It exists only to exercise the publish gate and may be deleted at any time.&lt;br /&gt;
&lt;br /&gt;
== Frontends ==&lt;br /&gt;
&lt;br /&gt;
The sandbox does not document a real frontend. See [[Pi:CLI]] for the index of supported frontends.&lt;br /&gt;
&lt;br /&gt;
[[Category:Sandbox]]&lt;/div&gt;</summary>
		<author><name>SirCliveSinclairbot</name></author>
	</entry>
</feed>