<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TinyComputers.io (Posts about arm64)</title><link>https://tinycomputers.io/</link><description></description><atom:link href="https://tinycomputers.io/categories/arm64.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 A.C. Jokela 
&lt;!-- div style="width: 100%" --&gt;
&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;&lt;img alt="" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/80x15.png" /&gt; Creative Commons Attribution-ShareAlike&lt;/a&gt;&amp;nbsp;|&amp;nbsp;
&lt;!-- /div --&gt;
</copyright><lastBuildDate>Wed, 11 Mar 2026 00:05:43 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Building Cross-Platform Rust Binaries: A Multi-Architecture Build Orchestration System</title><link>https://tinycomputers.io/posts/multi-operating-system-and-multi-architecture-build-orchestration-system.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;p&gt;When developing &lt;a href="https://baud.rs/QckusG"&gt;ballistics-engine&lt;/a&gt;, a high-performance ballistics calculation library written in Rust, I faced a challenge: how do I efficiently build and distribute binaries for multiple operating systems and architectures? The answer led to the creation of an automated build orchestration system that leverages diverse hardware—from single-board computers to powerful x86_64 servers—to build native binaries for macOS, Linux, FreeBSD, NetBSD, and OpenBSD across both ARM64 and x86_64 architectures.  Now, you are probably wondering why I am bothering to show love for the BSD Trilogy; the answer is simple: because I want to.  Sure they are a bit esoteric, but I ran FreeBSD for years as my mail server.  I still like the BSDs.&lt;/p&gt;
&lt;p&gt;This article explores the architecture, implementation, and lessons learned from building a production-grade multi-platform build system that powers &lt;a href="https://baud.rs/zuncyr"&gt;https://ballistics.zip&lt;/a&gt;, where users can download pre-built binaries for their platform with a simple curl command.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl --proto '=https' --tlsv1.2 -sSf https://ballistics.zip/install.sh | sh
&lt;/pre&gt;&lt;/div&gt;

&lt;div class="audio-widget"&gt;
&lt;div class="audio-widget-header"&gt;
&lt;span class="audio-widget-icon"&gt;🎧&lt;/span&gt;
&lt;span class="audio-widget-label"&gt;Listen to this article&lt;/span&gt;
&lt;/div&gt;
&lt;audio controls preload="metadata"&gt;
&lt;source src="https://tinycomputers.io/multi-operating-system-and-multi-architecture-build-orchestration-system_tts.mp3" type="audio/mpeg"&gt;
&lt;/source&gt;&lt;/audio&gt;
&lt;div class="audio-widget-footer"&gt;12 min · AI-generated narration&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;The Problem: Cross-Platform Distribution&lt;/h3&gt;
&lt;p&gt;Rust's cross-compilation capabilities are impressive, but they have limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-compilation complexity: While Rust supports cross-compilation, getting it working reliably for BSD systems (especially with system dependencies) is challenging&lt;/li&gt;
&lt;li&gt;Native testing: You need to test on actual hardware to ensure binaries work correctly&lt;/li&gt;
&lt;li&gt;Binary compatibility: Different BSD versions and configurations require native builds&lt;/li&gt;
&lt;li&gt;Performance verification: Emulated builds may behave differently than native ones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution? Build natively on each target platform using actual hardware or high-performance emulation.&lt;/p&gt;
&lt;h3&gt;Architecture Overview&lt;/h3&gt;
&lt;p&gt;The build orchestration system consists of three main components:&lt;/p&gt;
&lt;h4&gt;1. Build Nodes (Physical and Virtual Machines)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;macOS systems (x86_64 and aarch64) - Local builds&lt;/li&gt;
&lt;li&gt;Linux x86_64 server - Remote build via SSH&lt;/li&gt;
&lt;li&gt;FreeBSD ARM64 - Single-board computer (Raspberry Pi 4)&lt;/li&gt;
&lt;li&gt;OpenBSD ARM64 - QEMU VM emulated on x86_64 (rig.localnet)&lt;/li&gt;
&lt;li&gt;NetBSD x86_64 and ARM64 - QEMU VMs&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2. Orchestrator (Python-based coordinator)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Reads build node configuration from &lt;code&gt;build-nodes.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Executes builds in parallel across all nodes&lt;/li&gt;
&lt;li&gt;Collects artifacts via SSH/SCP&lt;/li&gt;
&lt;li&gt;Generates SHA256 checksums&lt;/li&gt;
&lt;li&gt;Uploads to Google Cloud Storage&lt;/li&gt;
&lt;li&gt;Updates version metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;3. Distribution (ballistics.zip website)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Serves install script at https://ballistics.zip&lt;/li&gt;
&lt;li&gt;Hosts binaries in GCS bucket (&lt;code&gt;gs://ballistics-releases/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Provides version detection and automatic downloads&lt;/li&gt;
&lt;li&gt;Supports version fallback for platforms with delayed releases&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hardware Infrastructure&lt;/h3&gt;
&lt;h4&gt;Single-Board Computers&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://baud.rs/1RRLno"&gt;Orange Pi 5 Max (ARM64)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Role: Host for NetBSD ARM64 VM&lt;/li&gt;
&lt;li&gt;CPU: Rockchip RK3588 (8-core ARM Cortex-A76/A55)&lt;/li&gt;
&lt;li&gt;RAM: 16GB&lt;/li&gt;
&lt;li&gt;Why: Native ARM64 hardware for running QEMU VMs&lt;/li&gt;
&lt;li&gt;Host IP: 10.1.1.10&lt;/li&gt;
&lt;li&gt;VM IPs:&lt;/li&gt;
&lt;li&gt;NetBSD ARM64: 10.1.1.15&lt;/li&gt;
&lt;li&gt;OpenBSD ARM64 (native, disabled): 10.1.1.11&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://baud.rs/zn9Y3Y"&gt;Raspberry Pi 4 (ARM64)&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Role: FreeBSD ARM64 native builds&lt;/li&gt;
&lt;li&gt;CPU: Broadcom BCM2711 (quad-core Cortex-A72)&lt;/li&gt;
&lt;li&gt;RAM: 8GB&lt;/li&gt;
&lt;li&gt;Why: Stable FreeBSD support, reliable ARM64 platform&lt;/li&gt;
&lt;li&gt;IP: 10.1.1.7&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;x86_64 ("rig.localnet")&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Role: Linux builds, BSD VM host, emulated ARM64 builds&lt;/li&gt;
&lt;li&gt;CPU: Intel i9&lt;/li&gt;
&lt;li&gt;RAM: 96GB&lt;/li&gt;
&lt;li&gt;IP: 10.1.1.27 (Linux host), 10.1.1.17 (KVM host)&lt;/li&gt;
&lt;li&gt;VMs Hosted:&lt;/li&gt;
&lt;li&gt;FreeBSD x86_64: 10.1.1.21&lt;/li&gt;
&lt;li&gt;OpenBSD x86_64: 10.1.1.20&lt;/li&gt;
&lt;li&gt;OpenBSD ARM64 (emulated): 10.1.1.23&lt;/li&gt;
&lt;li&gt;NetBSD x86_64: 10.1.1.19&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Local macOS Development Machine&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Role: macOS binary builds (both architectures)&lt;/li&gt;
&lt;li&gt;Build Method: Local cargo builds with target flags&lt;/li&gt;
&lt;li&gt;Architectures:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aarch64-apple-darwin&lt;/code&gt; (Apple Silicon)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x86_64-apple-darwin&lt;/code&gt; (Intel Macs)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A Surprising Discovery: Emulated ARM64 Performance&lt;/h3&gt;
&lt;p&gt;One of the most interesting findings during development was discovering that emulated ARM64 builds on powerful x86_64 hardware are significantly faster than emulated ARM64 on native ARM64 builds on single-board computers.&lt;/p&gt;
&lt;h4&gt;Performance Comparison&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Emulated ARM64 on ARM64: ~99+ minutes per build&lt;/li&gt;
&lt;li&gt;Emulated ARM64 on x86_64: 15m 37s ⚡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The emulated build on rig.localnet (running QEMU with KVM acceleration) completed in about 6x less time than the native ARM64 hardware. This is because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The x86_64 server has significantly more powerful CPU cores&lt;/li&gt;
&lt;li&gt;QEMU with KVM provides near-native performance for many workloads&lt;/li&gt;
&lt;li&gt;Rust compilation is primarily CPU-bound and benefits from faster single-core performance&lt;/li&gt;
&lt;li&gt;The x86_64 server has faster storage (NVMe vs eMMC/SD card)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As a result, the native OpenBSD ARM64 node on the Orange Pi is now disabled in favor of the emulated version.&lt;/p&gt;
&lt;h3&gt;Prerequisites&lt;/h3&gt;
&lt;h4&gt;SSH Key-Based Authentication&lt;/h4&gt;
&lt;p&gt;Critical: The orchestration system requires passwordless SSH access to all remote build nodes. Here's how to set it up:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate SSH key (if you don't have one):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh-keygen&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ed25519&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"build-orchestrator"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Copy public key to each build node:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# For each build node&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;user@build-node-ip

&lt;span class="c1"&gt;# Examples:&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;alex@10.1.1.27&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;# Linux x86_64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;freebsd@10.1.1.7&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;# FreeBSD ARM64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.20&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# OpenBSD x86_64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.23&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# OpenBSD ARM64 emulated&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.19&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# NetBSD x86_64&lt;/span&gt;
ssh-copy-id&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.15&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;# NetBSD ARM64&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Test SSH access:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;user@build-node-ip&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"uname -a"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Software Requirements&lt;/h4&gt;
&lt;p&gt;On Build Orchestrator Machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.8+&lt;/li&gt;
&lt;li&gt;pyyaml (&lt;code&gt;pip install pyyaml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Google Cloud SDK (&lt;code&gt;gcloud&lt;/code&gt; command) for GCS uploads&lt;/li&gt;
&lt;li&gt;SSH client&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On Each Build Node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rust toolchain (&lt;code&gt;cargo&lt;/code&gt;, &lt;code&gt;rustc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Build essentials (compiler, linker)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;wget&lt;/code&gt;, or &lt;code&gt;ftp&lt;/code&gt; (for downloading source)&lt;/li&gt;
&lt;li&gt;Sufficient disk space (~2GB for build artifacts)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;BSD-Specific Requirements&lt;/h4&gt;
&lt;p&gt;NetBSD: Install curl via pkgsrc (native &lt;code&gt;ftp&lt;/code&gt; doesn't support HTTPS)&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# Bootstrap pkgsrc&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ftp&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;pkgsrc.tar.gz&lt;span class="w"&gt; &lt;/span&gt;http://cdn.netbsd.org/pub/pkgsrc/current/pkgsrc.tar.gz
tar&lt;span class="w"&gt; &lt;/span&gt;-xzf&lt;span class="w"&gt; &lt;/span&gt;pkgsrc.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/usr/pkgsrc/bootstrap&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./bootstrap&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="o"&gt;=&lt;/span&gt;/usr/pkg

&lt;span class="c1"&gt;# Install curl&lt;/span&gt;
/usr/pkg/bin/pkgin&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;update
/usr/pkg/bin/pkgin&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;curl
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;OpenBSD: Native &lt;code&gt;ftp&lt;/code&gt; supports HTTPS&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pkg_add&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;git
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;FreeBSD: Use pkg for everything&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;pkg&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;curl
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;The ballistics.zip Website and Install Script&lt;/h3&gt;
&lt;h4&gt;How It Works&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://baud.rs/zuncyr"&gt;https://ballistics.zip&lt;/a&gt; serves as the primary distribution point for pre-built ballistics-engine binaries. The system uses:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;GCS Bucket:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gs://ballistics-releases/&lt;/code&gt; - Binary artifacts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDN: Google Cloud CDN provides global distribution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install Script: Universal installer that:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Detects OS and architecture&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Downloads appropriate binary&lt;/li&gt;
&lt;li&gt;Verifies SHA256 checksum&lt;/li&gt;
&lt;li&gt;Installs to &lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Usage&lt;/h4&gt;
&lt;p&gt;Basic installation:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sSL&lt;span class="w"&gt; &lt;/span&gt;https://ballistics.zip/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Specific version:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sSL&lt;span class="w"&gt; &lt;/span&gt;https://ballistics.zip/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.3
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Different install location:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sSL&lt;span class="w"&gt; &lt;/span&gt;https://ballistics.zip/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;--prefix&lt;span class="w"&gt; &lt;/span&gt;~/.local
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Install Script Architecture&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;install.sh&lt;/code&gt; script intelligently handles:&lt;/p&gt;
&lt;p&gt;Platform Detection:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tr&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'[:upper:]'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'[:lower:]'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;x86_64&lt;span class="p"&gt;|&lt;/span&gt;amd64&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"x86_64"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;aarch64&lt;span class="p"&gt;|&lt;/span&gt;arm64&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"aarch64"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;*&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Unsupported architecture: &lt;/span&gt;&lt;span class="nv"&gt;$ARCH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="nv"&gt;PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# e.g., "openbsd-aarch64"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Version Fallback:
If a requested version isn't available for a platform, the script automatically finds the latest available version:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;# If openbsd-aarch64 0.13.3 doesn't exist, fall back to 0.13.2&lt;/span&gt;
&lt;span class="nv"&gt;AVAILABLE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-sL&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$BASE_URL&lt;/span&gt;/versions.txt&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^&lt;/span&gt;&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;&lt;span class="s2"&gt;:"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cut&lt;span class="w"&gt; &lt;/span&gt;-d:&lt;span class="w"&gt; &lt;/span&gt;-f2&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Checksum Verification:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;EXPECTED_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BINARY&lt;/span&gt;&lt;span class="s2"&gt;.sha256"&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;ACTUAL_SHA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;sha256sum&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$BINARY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'{print $1}'&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$EXPECTED_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;!&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ACTUAL_SHA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Checksum verification failed!"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Build Orchestration System Deep Dive&lt;/h3&gt;
&lt;h4&gt;Configuration: build-nodes.yaml&lt;/h4&gt;
&lt;p&gt;The heart of the system is &lt;code&gt;build-nodes.yaml&lt;/code&gt;, which defines all build targets:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nt"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# macOS builds (local machine)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;macos-aarch64&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;local&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;aarch64-apple-darwin&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;curl -L -o v{version}.tar.gz https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cargo build --release --target {target}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/{target}/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Linux x86_64 (remote via SSH)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;linux-x86_64&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;alex@10.1.1.27&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;x86_64-unknown-linux-gnu&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;wget -q https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;~/.cargo/bin/cargo build --release --target {target}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/{target}/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# OpenBSD ARM64 emulated (FASTEST ARM64 BUILD!)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;openbsd-aarch64-emulated&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;root@10.1.1.23&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;aarch64-unknown-openbsd&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;ftp -o v{version}.tar.gz https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cargo build --release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# NetBSD x86_64 (HTTPS support via pkgsrc curl)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;netbsd-x86_64&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;root@10.1.1.19&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;x86_64-unknown-netbsd&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;/usr/pkg/bin/curl -L -o v{version}.tar.gz https://github.com/ajokela/ballistics-engine/archive/refs/tags/v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;/usr/pkg/bin/cargo build --release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/tmp/ballistics-engine-{version}/target/release/ballistics&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Orchestrator Workflow&lt;/h4&gt;
&lt;p&gt;The &lt;code&gt;orchestrator.py&lt;/code&gt; script coordinates the entire build process:&lt;/p&gt;
&lt;p&gt;Step 1: Parallel Build Execution&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;build_on_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'local'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Local build&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Remote build via SSH&lt;/span&gt;
        &lt;span class="n"&gt;ssh_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"ssh &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; '&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;build_command&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'"&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssh_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Step 2: Artifact Collection&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;collect_artifacts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;binary_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"ballistics-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'local'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'binary_path'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"./&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Download via SCP&lt;/span&gt;
        &lt;span class="n"&gt;scp_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"scp &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'host'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'binary_path'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ./&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scp_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Step 3: Checksum Generation&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;generate_checksum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'rb'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sha256&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;binary_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.sha256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Step 4: Upload to GCS&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;upload_to_gcs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;bucket_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"gs://ballistics-releases/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/"&lt;/span&gt;

    &lt;span class="c1"&gt;# Upload binaries and checksums&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"gsutil -m cp ballistics-* &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bucket_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Set public read permissions&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"gsutil -m acl ch -u AllUsers:R &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;bucket_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Update latest-version.txt&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'latest-version.txt'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"gsutil cp latest-version.txt gs://ballistics-releases/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;Running a Build&lt;/h4&gt;
&lt;p&gt;Dry-run (test without uploading):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build-orchestrator
./build.sh&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.4&lt;span class="w"&gt; &lt;/span&gt;--dry-run
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Production build:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;./build.sh&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.4
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Output:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ballistics&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v0&lt;/span&gt;&lt;span class="mf"&gt;.13.4&lt;/span&gt;
&lt;span class="o"&gt;===========================================&lt;/span&gt;

&lt;span class="n"&gt;Enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alex&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;freebsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freebsd&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;openbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;emulated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.23&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.19&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="mf"&gt;@10.1.1.15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;parallel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builds&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12346&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;macos&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;freebsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;openbsd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;emulated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;⚡&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FASTEST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ARM64&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;Uploading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//ballistics-releases/0.13.4/&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Uploaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binaries&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Uploaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;checksums&lt;/span&gt;
&lt;span class="err"&gt;✓&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Updated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;

&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;🎉&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Adding New Build Nodes&lt;/h3&gt;
&lt;h4&gt;Interactive Script&lt;/h4&gt;
&lt;p&gt;The easiest way to add a new node is using the interactive script:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build-orchestrator
./add-node.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will prompt you for:
- Node name (e.g., &lt;code&gt;openbsd-aarch64-emulated&lt;/code&gt;)
- SSH host (e.g., &lt;code&gt;root@10.1.1.23&lt;/code&gt; or &lt;code&gt;local&lt;/code&gt;)
- Rust target triple (e.g., &lt;code&gt;aarch64-unknown-openbsd&lt;/code&gt;)
- Build commands (how to download and build)
- Binary location (where the compiled binary is located)&lt;/p&gt;
&lt;h4&gt;Manual Configuration&lt;/h4&gt;
&lt;p&gt;Alternatively, edit &lt;code&gt;build-nodes.yaml&lt;/code&gt; directly:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;your-new-platform&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;user@ip-address&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# or 'local' for local builds&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;rust-target-triple&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;build_command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;# Commands to download source and build&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd /tmp &amp;amp;&amp;amp; rm -rf ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;curl -L -o v{version}.tar.gz https://github.com/...&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;tar xzf v{version}.tar.gz&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cd ballistics-engine-{version}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="no"&gt;cargo build --release&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;binary_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/path/to/compiled/binary&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Variables:
- &lt;code&gt;{version}&lt;/code&gt;: Replaced with target version (e.g., &lt;code&gt;0.13.4&lt;/code&gt;)
- &lt;code&gt;{target}&lt;/code&gt;: Replaced with Rust target triple&lt;/p&gt;
&lt;h4&gt;Setting Up a New VM&lt;/h4&gt;
&lt;p&gt;Example: OpenBSD ARM64 Emulated&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create VM on host:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;alex@rig.localnet
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/opt/bsd-vms/openbsd-arm64-emulated
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create boot script:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;boot.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; 'EOF'&lt;/span&gt;
&lt;span class="s"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="s"&gt;exec qemu-system-aarch64 \&lt;/span&gt;
&lt;span class="s"&gt;  -M virt,highmem=off \&lt;/span&gt;
&lt;span class="s"&gt;  -cpu cortex-a57 \&lt;/span&gt;
&lt;span class="s"&gt;  -smp 4 \&lt;/span&gt;
&lt;span class="s"&gt;  -m 2G \&lt;/span&gt;
&lt;span class="s"&gt;  -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd \&lt;/span&gt;
&lt;span class="s"&gt;  -drive file=openbsd.qcow2,if=virtio,format=qcow2 \&lt;/span&gt;
&lt;span class="s"&gt;  -netdev bridge,id=net0,br=br0 \&lt;/span&gt;
&lt;span class="s"&gt;  -device virtio-net-pci,netdev=net0,romfile=,mac=52:54:00:12:34:99 \&lt;/span&gt;
&lt;span class="s"&gt;  -nographic&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
chmod&lt;span class="w"&gt; &lt;/span&gt;+x&lt;span class="w"&gt; &lt;/span&gt;boot.sh
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Create systemd service:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/systemd/system/openbsd-arm64-emulated-vm.service&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; 'EOF'&lt;/span&gt;
&lt;span class="s"&gt;[Unit]&lt;/span&gt;
&lt;span class="s"&gt;Description=OpenBSD ARM64 VM (Emulated on x86_64)&lt;/span&gt;
&lt;span class="s"&gt;After=network.target&lt;/span&gt;

&lt;span class="s"&gt;[Service]&lt;/span&gt;
&lt;span class="s"&gt;Type=simple&lt;/span&gt;
&lt;span class="s"&gt;User=alex&lt;/span&gt;
&lt;span class="s"&gt;WorkingDirectory=/opt/bsd-vms/openbsd-arm64-emulated&lt;/span&gt;
&lt;span class="s"&gt;ExecStart=/opt/bsd-vms/openbsd-arm64-emulated/boot.sh&lt;/span&gt;
&lt;span class="s"&gt;Restart=always&lt;/span&gt;
&lt;span class="s"&gt;RestartSec=10&lt;/span&gt;

&lt;span class="s"&gt;[Install]&lt;/span&gt;
&lt;span class="s"&gt;WantedBy=multi-user.target&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;openbsd-arm64-emulated-vm.service
sudo&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;start&lt;span class="w"&gt; &lt;/span&gt;openbsd-arm64-emulated-vm.service
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Configure networking (assign static IP 10.1.1.23)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install build tools inside VM:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.23
pkg_add&lt;span class="w"&gt; &lt;/span&gt;rust&lt;span class="w"&gt; &lt;/span&gt;git
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Test SSH access:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;root@10.1.1.23&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cargo --version"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add to build-nodes.yaml and test:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;./build.sh&lt;span class="w"&gt; &lt;/span&gt;--version&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;.13.3&lt;span class="w"&gt; &lt;/span&gt;--dry-run
&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;GitHub Webhook Integration (Optional)&lt;/h3&gt;
&lt;p&gt;For fully automated builds triggered by GitHub releases:&lt;/p&gt;
&lt;h4&gt;1. Deploy Webhook Receiver to Cloud Run&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;build-orchestrator
gcloud&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;deploy&lt;span class="w"&gt; &lt;/span&gt;ballistics-build-webhook&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--source&lt;span class="w"&gt; &lt;/span&gt;.&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--region&lt;span class="w"&gt; &lt;/span&gt;us-central1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--allow-unauthenticated&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--set-env-vars&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GITHUB_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your-secret-here
&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;2. Configure GitHub Webhook&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Go to: https://github.com/yourusername/your-repo/settings/hooks&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add webhook:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Payload URL: &lt;code&gt;https://ballistics-build-webhook-xxx.run.app/webhook&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Content type: &lt;code&gt;application/json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Secret: Your webhook secret&lt;/li&gt;
&lt;li&gt;Events: Select "Releases" only&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;3. Test&lt;/h4&gt;
&lt;p&gt;Create a new release on GitHub, and the webhook will automatically trigger builds for all platforms!&lt;/p&gt;
&lt;h3&gt;Performance Metrics and Insights&lt;/h3&gt;
&lt;p&gt;From real-world builds of ballistics-engine v0.13.3:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Hardware&lt;/th&gt;
&lt;th&gt;Build Time&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;macOS aarch64&lt;/td&gt;
&lt;td&gt;Apple M1/M2&lt;/td&gt;
&lt;td&gt;45s&lt;/td&gt;
&lt;td&gt;Native Apple Silicon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS x86_64&lt;/td&gt;
&lt;td&gt;Intel i7/i9&lt;/td&gt;
&lt;td&gt;30s&lt;/td&gt;
&lt;td&gt;Cross-compile on Apple Silicon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux x86_64&lt;/td&gt;
&lt;td&gt;Xeon/EPYC&lt;/td&gt;
&lt;td&gt;25s&lt;/td&gt;
&lt;td&gt;Fastest overall ⚡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FreeBSD aarch64&lt;/td&gt;
&lt;td&gt;Raspberry Pi 4&lt;/td&gt;
&lt;td&gt;6m 32s&lt;/td&gt;
&lt;td&gt;Native ARM64 hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenBSD aarch64 (emulated)&lt;/td&gt;
&lt;td&gt;x86_64 QEMU&lt;/td&gt;
&lt;td&gt;15m 37s&lt;/td&gt;
&lt;td&gt;⚡ FASTEST ARM64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenBSD aarch64 (native)&lt;/td&gt;
&lt;td&gt;Orange Pi 5 Max&lt;/td&gt;
&lt;td&gt;99+ min&lt;/td&gt;
&lt;td&gt;Disabled due to slower speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetBSD x86_64&lt;/td&gt;
&lt;td&gt;x86_64 VM&lt;/td&gt;
&lt;td&gt;3m 45s&lt;/td&gt;
&lt;td&gt;KVM acceleration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetBSD aarch64&lt;/td&gt;
&lt;td&gt;Orange Pi VM&lt;/td&gt;
&lt;td&gt;8m 12s&lt;/td&gt;
&lt;td&gt;QEMU on ARM64 host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Key Insights:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;x86_64 is fastest: Modern x86_64 CPUs dominate for single-threaded compilation&lt;/li&gt;
&lt;li&gt;Emulation wins for ARM64: x86_64 emulating ARM64 beats native ARM64 SBCs&lt;/li&gt;
&lt;li&gt;SBCs are viable: Raspberry Pi and Orange Pi work well for native builds, but slower&lt;/li&gt;
&lt;li&gt;Parallel execution: Running all 7 builds in parallel takes only ~16 minutes (longest pole is FreeBSD ARM64)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Building a custom multi-platform build orchestration system may seem daunting, but the benefits are substantial:&lt;/p&gt;
&lt;p&gt;→ Full control: Own your build infrastructure&lt;/p&gt;
&lt;p&gt;→ Native builds: Real hardware ensures compatibility&lt;/p&gt;
&lt;p&gt;→ Cost-effective: Low operational costs after initial hardware investment&lt;/p&gt;
&lt;p&gt;→ Fast iteration: Parallel builds complete in ~16 minutes&lt;/p&gt;
&lt;p&gt;→ Flexibility: Easy to add new platforms&lt;/p&gt;
&lt;p&gt;→ Learning: Deep understanding of cross-platform development&lt;/p&gt;
&lt;p&gt;The surprising discovery that emulated ARM64 on powerful x86_64 hardware outperforms native ARM64 single-board computers has practical implications: you don't always need native hardware for every architecture. Strategic use of emulation can provide better performance while maintaining compatibility.&lt;/p&gt;
&lt;p&gt;For projects requiring broad platform support (especially BSD systems not well-served by traditional CI/CD), this approach offers a reliable, maintainable, and cost-effective solution.&lt;/p&gt;
&lt;h3&gt;Architecture Diagram&lt;/h3&gt;
&lt;div class="mermaid"&gt;
graph TB
    subgraph "Trigger Sources"
        GH[GitHub Release&lt;br&gt;v0.13.x]
        MANUAL[Manual Execution&lt;br&gt;./build.sh]
    end

    subgraph "Build Orchestrator"
        ORCH[Python Orchestrator&lt;br&gt;orchestrator.py]
        CONFIG[Build Configuration&lt;br&gt;build-nodes.yaml]
    end

    subgraph "Build Nodes - Local"
        MAC_ARM[macOS ARM64&lt;br&gt;Apple Silicon&lt;br&gt;~45s]
        MAC_X86[macOS x86_64&lt;br&gt;Rosetta 2&lt;br&gt;~30s]
    end

    subgraph "Build Nodes - Remote x86_64"
        LINUX_X86[Linux x86_64&lt;br&gt;alex@10.1.1.27&lt;br&gt;~25s]
        FREEBSD_X86[FreeBSD x86_64&lt;br&gt;root@10.1.1.21&lt;br&gt;~4m]
        OPENBSD_X86[OpenBSD x86_64&lt;br&gt;root@10.1.1.20&lt;br&gt;~12m]
        NETBSD_X86[NetBSD x86_64&lt;br&gt;root@10.1.1.19&lt;br&gt;~3m 45s]
    end

    subgraph "Build Nodes - Remote ARM64"
        FREEBSD_ARM[FreeBSD ARM64&lt;br&gt;freebsd@10.1.1.7&lt;br&gt;~6m 32s]
        OPENBSD_ARM_EMU[OpenBSD ARM64&lt;br&gt;root@10.1.1.23&lt;br&gt;Emulated on x86_64&lt;br&gt;~15m 37s ⚡]
        NETBSD_ARM[NetBSD ARM64&lt;br&gt;root@10.1.1.15&lt;br&gt;~8m 12s]
    end

    subgraph "Artifact Collection"
        COLLECT[SCP Collection&lt;br&gt;Pull binaries from nodes]
        CHECKSUM[Generate SHA256&lt;br&gt;checksums]
    end

    subgraph "Distribution"
        GCS[Google Cloud Storage&lt;br&gt;gs://ballistics-releases/]
        WEBSITE[ballistics.zip&lt;br&gt;Install Script]
    end

    GH --&amp;gt;|webhook| ORCH
    MANUAL --&amp;gt;|CLI| ORCH
    CONFIG --&amp;gt;|reads| ORCH

    ORCH --&amp;gt;|SSH parallel builds| MAC_ARM
    ORCH --&amp;gt;|SSH parallel builds| MAC_X86
    ORCH --&amp;gt;|SSH parallel builds| LINUX_X86
    ORCH --&amp;gt;|SSH parallel builds| FREEBSD_X86
    ORCH --&amp;gt;|SSH parallel builds| OPENBSD_X86
    ORCH --&amp;gt;|SSH parallel builds| NETBSD_X86
    ORCH --&amp;gt;|SSH parallel builds| FREEBSD_ARM
    ORCH --&amp;gt;|SSH parallel builds| OPENBSD_ARM_EMU
    ORCH --&amp;gt;|SSH parallel builds| NETBSD_ARM

    MAC_ARM --&amp;gt;|binary| COLLECT
    MAC_X86 --&amp;gt;|binary| COLLECT
    LINUX_X86 --&amp;gt;|binary| COLLECT
    FREEBSD_X86 --&amp;gt;|binary| COLLECT
    OPENBSD_X86 --&amp;gt;|binary| COLLECT
    NETBSD_X86 --&amp;gt;|binary| COLLECT
    FREEBSD_ARM --&amp;gt;|binary| COLLECT
    OPENBSD_ARM_EMU --&amp;gt;|binary| COLLECT
    NETBSD_ARM --&amp;gt;|binary| COLLECT

    COLLECT --&amp;gt; CHECKSUM
    CHECKSUM --&amp;gt; GCS
    GCS --&amp;gt; WEBSITE

    style OPENBSD_ARM_EMU fill:#90EE90
    style LINUX_X86 fill:#87CEEB
    style GCS fill:#FFD700
    style WEBSITE fill:#FFD700
&lt;/div&gt;

&lt;h4&gt;Diagram Legend&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Green: Fastest ARM64 build (emulated on powerful x86_64)&lt;/li&gt;
&lt;li&gt;Blue: Fastest overall build (native Linux x86_64)&lt;/li&gt;
&lt;li&gt;Yellow: Distribution endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Build Flow&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Trigger: GitHub release webhook or manual execution&lt;/li&gt;
&lt;li&gt;Parallel Execution: All enabled build nodes start simultaneously&lt;/li&gt;
&lt;li&gt;Collection: Orchestrator collects binaries via SCP&lt;/li&gt;
&lt;li&gt;Verification: SHA256 checksums generated for integrity&lt;/li&gt;
&lt;li&gt;Upload: Binaries and checksums uploaded to GCS&lt;/li&gt;
&lt;li&gt;Availability: Install script immediately serves new version&lt;/li&gt;
&lt;/ol&gt;</description><category>aarch64</category><category>arm64</category><category>automation</category><category>binary distribution</category><category>bsd</category><category>build systems</category><category>cargo</category><category>ci cd</category><category>cross platform</category><category>devops</category><category>emulation</category><category>freebsd</category><category>google cloud storage</category><category>kvm</category><category>linux</category><category>macos</category><category>netbsd</category><category>openbsd</category><category>orange pi</category><category>orchestration</category><category>parallel builds</category><category>qemu</category><category>raspberry pi</category><category>rust</category><category>single board computers</category><category>ssh</category><category>x86_64</category><guid>https://tinycomputers.io/posts/multi-operating-system-and-multi-architecture-build-orchestration-system.html</guid><pubDate>Fri, 21 Nov 2025 21:19:35 GMT</pubDate></item><item><title>Rust Compilation Performance Benchmark Report</title><link>https://tinycomputers.io/posts/rust-compilation-performance-benchmark-report.html?utm_source=feed&amp;utm_medium=rss&amp;utm_campaign=rss</link><dc:creator>A.C. Jokela</dc:creator><description>&lt;div class="audio-widget"&gt;
&lt;div class="audio-widget-header"&gt;
&lt;span class="audio-widget-icon"&gt;🎧&lt;/span&gt;
&lt;span class="audio-widget-label"&gt;Listen to this article&lt;/span&gt;
&lt;/div&gt;
&lt;audio controls preload="metadata"&gt;
&lt;source src="https://tinycomputers.io/rust-compilation-performance-benchmark-report_tts.mp3" type="audio/mpeg"&gt;
&lt;/source&gt;&lt;/audio&gt;
&lt;div class="audio-widget-footer"&gt;22 min · AI-generated narration&lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Executive Summary&lt;/h3&gt;
&lt;p&gt;This report presents a comprehensive performance comparison of Rust compilation times across six different systems, including Single Board Computers (SBCs) and desktop systems. The benchmark reveals a &lt;strong&gt;34x performance difference&lt;/strong&gt; between the fastest and slowest systems, with the AMD AI Max+ 395 desktop processor demonstrating exceptional compilation performance.&lt;/p&gt;
&lt;h4&gt;Key Findings&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fastest System:&lt;/strong&gt; Ubuntu x86_64 with AMD AI Max+ 395 - &lt;strong&gt;13.71 seconds&lt;/strong&gt; average&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slowest System:&lt;/strong&gt; OpenBSD 7.7 - &lt;strong&gt;470.67 seconds&lt;/strong&gt; average&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best ARM Performance:&lt;/strong&gt; Orange Pi 5 Max - &lt;strong&gt;58.65 seconds&lt;/strong&gt; average&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Most Consistent:&lt;/strong&gt; Ubuntu x86_64 with only 0.08s standard deviation&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;System Specifications&lt;/h3&gt;
&lt;h4&gt;x86_64 Systems&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;Cores&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ubuntu Desktop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ubuntu 24.04.3 LTS&lt;/td&gt;
&lt;td&gt;AMD Ryzen AI Max+ 395&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;32GB + 96GB GPU VRAM&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenBSD VM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenBSD 7.7&lt;/td&gt;
&lt;td&gt;Intel N100 (VirtualBox)&lt;/td&gt;
&lt;td&gt;VM&lt;/td&gt;
&lt;td&gt;1GB&lt;/td&gt;
&lt;td&gt;x86_64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;ARM64 Systems&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;OS&lt;/th&gt;
&lt;th&gt;CPU&lt;/th&gt;
&lt;th&gt;Cores&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Orange Pi 5 Max&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Armbian 25.11&lt;/td&gt;
&lt;td&gt;Cortex-A55/A76 (RK3588)&lt;/td&gt;
&lt;td&gt;8 (4+4)&lt;/td&gt;
&lt;td&gt;16GB&lt;/td&gt;
&lt;td&gt;ARM64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Raspberry Pi CM5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Debian 12&lt;/td&gt;
&lt;td&gt;Cortex-A76&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;8GB&lt;/td&gt;
&lt;td&gt;ARM64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Banana Pi R2 Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Armbian 23.02&lt;/td&gt;
&lt;td&gt;RK3568&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2GB&lt;/td&gt;
&lt;td&gt;ARM64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pine64 Quartz64 B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Debian 12&lt;/td&gt;
&lt;td&gt;RK3566&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4GB&lt;/td&gt;
&lt;td&gt;ARM64&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;System Information (neofetch)&lt;/h4&gt;
&lt;h5&gt;Ubuntu Desktop (AMD Ryzen AI Max+ 395)&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;.-&lt;/span&gt;&lt;span class="err"&gt;/+&lt;/span&gt;&lt;span class="no"&gt;oossssoo&lt;/span&gt;&lt;span class="err"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;-.&lt;/span&gt;&lt;span class="w"&gt;               &lt;/span&gt;&lt;span class="no"&gt;alex@ubuntu-desktop&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;`:+&lt;/span&gt;&lt;span class="nf"&gt;ssssssssssssssssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="p"&gt;-------------------&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;-+&lt;/span&gt;&lt;span class="nf"&gt;ssssssssssssssssssyyssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="no"&gt;OS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Ubuntu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="no"&gt;.04.3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LTS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;x86_64&lt;/span&gt;
&lt;span class="na"&gt;.ossssssssssssssssssdMMMNysssso.&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="no"&gt;Kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="no"&gt;.11.0&lt;/span&gt;
&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;ssssssssssshdmmNNmmyNMMMMhssssss&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="no"&gt;Uptime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;days&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;hours&lt;/span&gt;
&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;ssssssssshmydMMMMMMMNddddyssssssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="no"&gt;Packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3127&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;sssssssshNMMMyhhyyyyhmNMMMNhssssssss&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Shell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;bash&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="no"&gt;.2.21&lt;/span&gt;
&lt;span class="nl"&gt;.ssssssssdMMMNhsssssssssshNMMMdssssssss.Resolution:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;3840&lt;/span&gt;&lt;span class="nf"&gt;x2160&lt;/span&gt;
&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;sssshhhyNMMNyssssssssssssyNMMMysssssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="no"&gt;DE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;GNOME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="no"&gt;.0&lt;/span&gt;
&lt;span class="nf"&gt;ossyNMMMNyMMhsssssssssssssshmmmhssssssso&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;WM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Mutter&lt;/span&gt;
&lt;span class="nf"&gt;ossyNMMMNyMMhsssssssssssssshmmmhssssssso&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;AMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Ryzen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;AI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;MAX&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;395&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="no"&gt;.100GHz&lt;/span&gt;
&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;sssshhhyNMMNyssssssssssssyNMMMysssssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="no"&gt;GPU&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;AMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Radeon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8060&lt;/span&gt;&lt;span class="no"&gt;S&lt;/span&gt;
&lt;span class="nl"&gt;.ssssssssdMMMNhsssssssssshNMMMdssssssss.Memory:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;8&lt;/span&gt;&lt;span class="nf"&gt;.7GiB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="no"&gt;.5GiB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;sssssssshNMMMyhhyyyyhmNMMMNhssssssss&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="nf"&gt;ssssssssshmydMMMMMMMNddddyssssssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;
&lt;span class="err"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;ssssssssssshdmmNNNmyNMMMMhssssss&lt;/span&gt;&lt;span class="err"&gt;/&lt;/span&gt;
&lt;span class="na"&gt;.ossssssssssssssssssdMMMNysssso.&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;-+&lt;/span&gt;&lt;span class="nf"&gt;sssssssssssssssssyyyssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;`:+&lt;/span&gt;&lt;span class="nf"&gt;ssssssssssssssssss&lt;/span&gt;&lt;span class="err"&gt;+&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nf"&gt;.-&lt;/span&gt;&lt;span class="err"&gt;/+&lt;/span&gt;&lt;span class="no"&gt;oossssoo&lt;/span&gt;&lt;span class="err"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;-.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5&gt;Orange Pi 5 Max&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;met&lt;/span&gt;&lt;span class="err"&gt;$$$$$&lt;/span&gt;&lt;span class="n"&gt;gg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@orangepi5max&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="err"&gt;$$$$$$$$$$$$$$$&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;-----------------&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="ss"&gt;"     """&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="ss"&gt;".        OS: Armbian (25.11) aarch64&lt;/span&gt;
&lt;span class="ss"&gt; ,$$P'              `$$$.     Host: Orange Pi 5 Max&lt;/span&gt;
&lt;span class="ss"&gt;',$$P       ,ggs.     `$$b:   Kernel: 5.10.160-vendor-rk35xx&lt;/span&gt;
&lt;span class="ss"&gt;`d$$'     ,$P"&lt;/span&gt;&lt;span class="s1"&gt;'   .    $$$    Uptime: 3 days, 22 hours, 31 mins&lt;/span&gt;
&lt;span class="s1"&gt; $$P      d$'&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;Packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1742&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$$:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="s1"&gt;'    Shell: bash 5.1.16&lt;/span&gt;
&lt;span class="s1"&gt; $$;      Y$b._   _,d$P'&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nl"&gt;Terminal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="ss"&gt;"Y$$$$P"&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nl"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.352&lt;/span&gt;&lt;span class="n"&gt;GHz&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`$$&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="ss"&gt;"-.__              Memory: 2912MiB / 15733MiB&lt;/span&gt;
&lt;span class="ss"&gt;  `Y$$&lt;/span&gt;
&lt;span class="ss"&gt;   `Y$$.&lt;/span&gt;
&lt;span class="ss"&gt;     `$$b.&lt;/span&gt;
&lt;span class="ss"&gt;       `Y$$b.&lt;/span&gt;
&lt;span class="ss"&gt;          `"&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="ss"&gt;""&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5&gt;Raspberry Pi Compute Module 5&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="s s-Atom"&gt;///+:/-.&lt;/span&gt;        &lt;span class="s s-Atom"&gt;--/+//-:+:&lt;/span&gt;
 &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s s-Atom"&gt;oooooooooooo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s s-Atom"&gt;oooooooooooo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="s s-Atom"&gt;pi@raspberrypi&lt;/span&gt;
  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;oooo++//ooooo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="s s-Atom"&gt;ooooo+//+ooooo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;    &lt;span class="s s-Atom"&gt;--------------&lt;/span&gt;
  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s s-Atom"&gt;ooooooo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;-:oo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;  &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s s-Atom"&gt;o+::/ooooooo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="nv"&gt;OS&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;Debian&lt;/span&gt; &lt;span class="nv"&gt;GNU&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;Linux&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s s-Atom"&gt;bookworm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s s-Atom"&gt;aarch64&lt;/span&gt;
   &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;oooooooo+&lt;/span&gt;&lt;span class="err"&gt;``&lt;/span&gt;    &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;oooooooo+-&lt;/span&gt;      &lt;span class="nv"&gt;Host&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;Raspberry&lt;/span&gt; &lt;span class="nv"&gt;Pi&lt;/span&gt; &lt;span class="nv"&gt;Compute&lt;/span&gt; &lt;span class="nv"&gt;Module&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="nv"&gt;Rev&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
     &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s s-Atom"&gt;++ooo/.&lt;/span&gt;        &lt;span class="o"&gt;:+&lt;/span&gt;&lt;span class="s s-Atom"&gt;ooo+/.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;       &lt;span class="nv"&gt;Kernel&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;6.6.51&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s s-Atom"&gt;rpt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s s-Atom"&gt;rpi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2712&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;----.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="err"&gt;``&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;            &lt;span class="nv"&gt;Uptime&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="s s-Atom"&gt;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="s s-Atom"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="s s-Atom"&gt;mins&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::::&lt;/span&gt;&lt;span class="s s-Atom"&gt;-&lt;/span&gt;&lt;span class="err"&gt;``&lt;/span&gt;&lt;span class="o"&gt;:::::::::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="s s-Atom"&gt;-:::-&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;         &lt;span class="nv"&gt;Packages&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1698&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s s-Atom"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="s s-Atom"&gt;-:::-&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;:::::::-&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="s s-Atom"&gt;-:::-&lt;/span&gt;        &lt;span class="nv"&gt;Shell&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s s-Atom"&gt;bash&lt;/span&gt; &lt;span class="mf"&gt;5.2.15&lt;/span&gt;
   &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;--.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="err"&gt;``&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;---.&lt;/span&gt;&lt;span class="err"&gt;``&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;      &lt;span class="nv"&gt;Resolution&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1920&lt;/span&gt;&lt;span class="s s-Atom"&gt;x1080&lt;/span&gt;
       &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::::::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="s s-Atom"&gt;-::::::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;        &lt;span class="nv"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s s-Atom"&gt;pts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;:::::::::-&lt;/span&gt; &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;::::::::::&lt;/span&gt;&lt;span class="err"&gt;``&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;    &lt;span class="nv"&gt;CPU&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s s-Atom"&gt;@&lt;/span&gt; &lt;span class="mf"&gt;3.000&lt;/span&gt;&lt;span class="nv"&gt;GHz&lt;/span&gt;
&lt;span class="s s-Atom"&gt;-:::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="o"&gt;::::::::::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;::::::::::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;:::-&lt;/span&gt;   &lt;span class="nv"&gt;Memory&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;562&lt;/span&gt;&lt;span class="nv"&gt;MiB&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;7928&lt;/span&gt;&lt;span class="nv"&gt;MiB&lt;/span&gt;
&lt;span class="o"&gt;::::&lt;/span&gt;  &lt;span class="s s-Atom"&gt;-::::::::.&lt;/span&gt;   &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="s s-Atom"&gt;-::::::::&lt;/span&gt;  &lt;span class="o"&gt;::::&lt;/span&gt;
&lt;span class="s s-Atom"&gt;-::-&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;-:::-.&lt;/span&gt;&lt;span class="err"&gt;``&lt;/span&gt;&lt;span class="p"&gt;....&lt;/span&gt;&lt;span class="err"&gt;``&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;-::-.&lt;/span&gt;   &lt;span class="s s-Atom"&gt;-::-&lt;/span&gt;
 &lt;span class="p"&gt;..&lt;/span&gt; &lt;span class="err"&gt;``&lt;/span&gt;       &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::::::::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;     &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;
   &lt;span class="s s-Atom"&gt;-:::-&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;   &lt;span class="s s-Atom"&gt;-::::::::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;:::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
   &lt;span class="o"&gt;:::::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="s s-Atom"&gt;-::::::::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt; &lt;span class="o"&gt;:::::::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;:::::::&lt;/span&gt;  &lt;span class="s s-Atom"&gt;-::::::::.&lt;/span&gt; &lt;span class="o"&gt;::::::::&lt;/span&gt;
    &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="s s-Atom"&gt;-:::::&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;   &lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="s s-Atom"&gt;--.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;   &lt;span class="o"&gt;::::::&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
      &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="s s-Atom"&gt;--..&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;  &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;::::::::::&lt;/span&gt;
             &lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s s-Atom"&gt;-::::-&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5&gt;Banana Pi R2 Pro&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;met&lt;/span&gt;&lt;span class="err"&gt;$$$$$&lt;/span&gt;&lt;span class="n"&gt;gg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@bananapi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r2pro&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="err"&gt;$$$$$$$$$$$$$$$&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;-------------------&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="ss"&gt;"     """&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="ss"&gt;".        OS: Armbian 23.02.2 Bullseye aarch64&lt;/span&gt;
&lt;span class="ss"&gt; ,$$P'              `$$$.     Host: Bananapi BPI-R2PRO&lt;/span&gt;
&lt;span class="ss"&gt;',$$P       ,ggs.     `$$b:   Kernel: 5.19.17-rockchip64&lt;/span&gt;
&lt;span class="ss"&gt;`d$$'     ,$P"&lt;/span&gt;&lt;span class="s1"&gt;'   .    $$$    Uptime: 45 days, 18 hours, 22 mins&lt;/span&gt;
&lt;span class="s1"&gt; $$P      d$'&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="n"&gt;P&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;Packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1356&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$$:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="s1"&gt;'    Shell: bash 5.1.4&lt;/span&gt;
&lt;span class="s1"&gt; $$;      Y$b._   _,d$P'&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nl"&gt;Terminal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="ss"&gt;"Y$$$$P"&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="nl"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rockchip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RK3568&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.960&lt;/span&gt;&lt;span class="n"&gt;GHz&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`$$&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="ss"&gt;"-.__              Memory: 628MiB / 1924MiB&lt;/span&gt;
&lt;span class="ss"&gt;  `Y$$&lt;/span&gt;
&lt;span class="ss"&gt;   `Y$$.&lt;/span&gt;
&lt;span class="ss"&gt;     `$$b.&lt;/span&gt;
&lt;span class="ss"&gt;       `Y$$b.&lt;/span&gt;
&lt;span class="ss"&gt;          `"&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="ss"&gt;""&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5&gt;OpenBSD VM (VirtualBox on Radxa X4)&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="w"&gt;                                     &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@openbsd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;local&lt;/span&gt;
&lt;span class="w"&gt;                                    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;------------------&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="nl"&gt;OS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OpenBSD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;7.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/|&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="k"&gt;Host&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VirtualBox&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="c1"&gt;--+._/| .       (_)      Kernel: 7.7 GENERIC#91&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|/|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="nl"&gt;Uptime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mins&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;'( |        ` F`.'&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="nl"&gt;Packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pkg_info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;-&amp;lt;|&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;__&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&amp;lt;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;Shell&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ksh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v5&lt;/span&gt;&lt;span class="mf"&gt;.2.14&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s1"&gt;'. `.  /-. L___           Terminal: /dev/ttyp0&lt;/span&gt;
&lt;span class="s1"&gt;    J \      &amp;lt;    \  | | O\|.-'&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nl"&gt;CPU&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Intel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;N100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.392&lt;/span&gt;&lt;span class="n"&gt;GHz&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;_J&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="nl"&gt;Memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;187&lt;/span&gt;&lt;span class="n"&gt;MiB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;985&lt;/span&gt;&lt;span class="n"&gt;MiB&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'-F  -&amp;lt;_.     \   .-'&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s1"&gt;' L__&lt;/span&gt;
&lt;span class="s1"&gt;__J  _   _.     &amp;gt;-'&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;|-&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;
&lt;span class="s1"&gt;`-|.'&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="s1"&gt;'    /.'&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;'  `\&lt;/span&gt;
&lt;span class="s1"&gt;  /L  /'&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;|/&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="s1"&gt;'-\&lt;/span&gt;
&lt;span class="s1"&gt; /'&lt;/span&gt;&lt;span class="n"&gt;J&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;___&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="c1"&gt;---'\|&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="c1"&gt;--' V  | `. `&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;|/&lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;`\&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3&gt;Benchmark Results&lt;/h3&gt;
&lt;h4&gt;Compilation Time Summary (seconds)&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;Average&lt;/th&gt;
&lt;th&gt;Min&lt;/th&gt;
&lt;th&gt;Max&lt;/th&gt;
&lt;th&gt;Std Dev&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Ubuntu x86_64&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13.71&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13.61&lt;/td&gt;
&lt;td&gt;13.76&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.34x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Orange Pi 5 Max&lt;/td&gt;
&lt;td&gt;58.65&lt;/td&gt;
&lt;td&gt;57.98&lt;/td&gt;
&lt;td&gt;59.32&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;8.03x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Raspberry Pi CM5&lt;/td&gt;
&lt;td&gt;69.71&lt;/td&gt;
&lt;td&gt;69.30&lt;/td&gt;
&lt;td&gt;70.06&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;6.75x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Banana Pi R2 Pro&lt;/td&gt;
&lt;td&gt;418.18&lt;/td&gt;
&lt;td&gt;416.96&lt;/td&gt;
&lt;td&gt;419.67&lt;/td&gt;
&lt;td&gt;1.38&lt;/td&gt;
&lt;td&gt;1.13x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;OpenBSD 7.7&lt;/td&gt;
&lt;td&gt;470.67&lt;/td&gt;
&lt;td&gt;467.00&lt;/td&gt;
&lt;td&gt;473.00&lt;/td&gt;
&lt;td&gt;2.88&lt;/td&gt;
&lt;td&gt;1.00x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;Note: Speedup is calculated relative to the slowest system (OpenBSD)&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Individual Run Times&lt;/h4&gt;
&lt;h5&gt;Ubuntu x86_64 (AMD AI Max+ 395)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Run 1: 13.76s&lt;/li&gt;
&lt;li&gt;Run 2: 13.65s&lt;/li&gt;
&lt;li&gt;Run 3: 13.61s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average: 13.71s&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Orange Pi 5 Max&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Run 1: 57.98s&lt;/li&gt;
&lt;li&gt;Run 2: 59.32s&lt;/li&gt;
&lt;li&gt;Run 3: 58.65s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average: 58.65s&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Raspberry Pi CM5&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Run 1: 69.77s&lt;/li&gt;
&lt;li&gt;Run 2: 70.06s&lt;/li&gt;
&lt;li&gt;Run 3: 69.30s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average: 69.71s&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Banana Pi R2 Pro&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Run 1: 417.91s&lt;/li&gt;
&lt;li&gt;Run 2: 419.67s&lt;/li&gt;
&lt;li&gt;Run 3: 416.96s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average: 418.18s&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;OpenBSD 7.7&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Run 1: 473.00s&lt;/li&gt;
&lt;li&gt;Run 2: 467.00s&lt;/li&gt;
&lt;li&gt;Run 3: 472.00s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Average: 470.67s&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Performance Analysis&lt;/h3&gt;
&lt;h4&gt;Architecture Comparison&lt;/h4&gt;
&lt;h5&gt;x86_64 Performance&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;The AMD Ryzen AI Max+ 395 demonstrates exceptional performance with sub-14 second builds&lt;/li&gt;
&lt;li&gt;OpenBSD VM shows significantly slower performance, likely due to:&lt;/li&gt;
&lt;li&gt;Running in VirtualBox virtualization layer&lt;/li&gt;
&lt;li&gt;Limited memory allocation (1GB)&lt;/li&gt;
&lt;li&gt;Host system (Radxa X4 with Intel N100) performance constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;ARM64 Performance Tiers&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Tier 1: High Performance (&amp;lt; 1 minute)&lt;/strong&gt;
- Orange Pi 5 Max: Benefits from RK3588's big.LITTLE architecture with 4x Cortex-A76 + 4x Cortex-A55&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tier 2: Good Performance (1-2 minutes)&lt;/strong&gt;
- Raspberry Pi CM5: Solid performance with 4x Cortex-A76 cores&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tier 3: Acceptable Performance (5-10 minutes)&lt;/strong&gt;
- Banana Pi R2 Pro: Older RK3568 SoC shows its limitations
- Pine64 Quartz64 B: Similar performance tier with RK3566&lt;/p&gt;
&lt;h4&gt;Key Observations&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU Architecture Impact&lt;/strong&gt;: Modern Cortex-A76 cores (Orange Pi 5 Max, Raspberry Pi CM5) significantly outperform older designs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Core Count vs Performance&lt;/strong&gt;: The 8-core Orange Pi 5 Max only marginally outperforms the 4-core Raspberry Pi CM5, suggesting diminishing returns from parallelization in Rust compilation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory Constraints&lt;/strong&gt;: The Banana Pi R2 Pro with only 2GB RAM may be experiencing memory pressure during compilation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Operating System Overhead&lt;/strong&gt;: OpenBSD shows significantly higher compilation times, possibly due to:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Less optimized Rust toolchain&lt;/li&gt;
&lt;li&gt;Different memory management&lt;/li&gt;
&lt;li&gt;Security features adding overhead&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;Visualizations&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Compilation Benchmark Charts" src="https://tinycomputers.io/images/compilation_benchmark_charts.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Charts include:&lt;/em&gt;
- Average compilation time comparison
- Distribution of compilation times (box plot)
- Relative performance comparison
- Min-Max ranges for each system&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;h4&gt;Best Value Propositions&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Best Overall Performance&lt;/strong&gt;: Ubuntu x86_64 with AMD AI Max+ 395&lt;/li&gt;
&lt;li&gt;34x faster than slowest system&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ideal for development workstations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best ARM SBC&lt;/strong&gt;: Orange Pi 5 Max&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;8x faster than slowest system&lt;/li&gt;
&lt;li&gt;Good balance of performance and likely cost&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;16GB RAM provides headroom for larger projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Budget ARM Option&lt;/strong&gt;: Raspberry Pi CM5&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;6.75x faster than slowest system&lt;/li&gt;
&lt;li&gt;Well-supported ecosystem&lt;/li&gt;
&lt;li&gt;Consistent performance&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Recommendations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For CI/CD pipelines&lt;/strong&gt;: Use x86_64 cloud instances or the AMD system for fastest builds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For ARM development&lt;/strong&gt;: Orange Pi 5 Max or Raspberry Pi CM5 provide reasonable compile times&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For learning/hobbyist use&lt;/strong&gt;: Any of the faster ARM boards are suitable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid for compilation&lt;/strong&gt;: Systems with &amp;lt; 4GB RAM or older ARM cores (pre-A76)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Methodology&lt;/h3&gt;
&lt;h4&gt;Test Procedure&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Installed Rust toolchain (v1.90.0) on all systems&lt;/li&gt;
&lt;li&gt;Cloned the ballistics-engine repository&lt;/li&gt;
&lt;li&gt;Performed initial build to download all dependencies&lt;/li&gt;
&lt;li&gt;Executed 3 clean release builds on each system&lt;/li&gt;
&lt;li&gt;Measured wall-clock time for each compilation&lt;/li&gt;
&lt;li&gt;Calculated averages and standard deviations&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Test Conditions&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;All systems were connected via local network (10.1.1.x)&lt;/li&gt;
&lt;li&gt;SSH was used for remote execution&lt;/li&gt;
&lt;li&gt;No other significant workloads during testing&lt;/li&gt;
&lt;li&gt;Release build profile was used (&lt;code&gt;cargo build --release&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Limitations&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Pine64 Quartz64 B benchmark was incomplete&lt;/li&gt;
&lt;li&gt;OpenBSD tested in VirtualBox VM with limited resources&lt;/li&gt;
&lt;li&gt;Network conditions may have affected initial dependency downloads (not measured)&lt;/li&gt;
&lt;li&gt;Different Rust versions on OpenBSD (1.86.0) vs others (1.90.0)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;Future Work&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Benchmark incremental compilation times&lt;/li&gt;
&lt;li&gt;Test with different optimization levels&lt;/li&gt;
&lt;li&gt;Compare power consumption during compilation&lt;/li&gt;
&lt;li&gt;Test with larger Rust projects&lt;/li&gt;
&lt;li&gt;Include more x86_64 systems for comparison&lt;/li&gt;
&lt;li&gt;Measure peak memory usage during compilation&lt;/li&gt;
&lt;/ul&gt;</description><category>arm64</category><category>benchmarks</category><category>compilation</category><category>development</category><category>orange pi</category><category>performance</category><category>raspberry pi</category><category>rust</category><category>sbc</category><category>x86_64</category><guid>https://tinycomputers.io/posts/rust-compilation-performance-benchmark-report.html</guid><pubDate>Wed, 24 Sep 2025 11:47:53 GMT</pubDate></item></channel></rss>