Skip to content

Building from Source

articwake requires Rust 1.85+ (edition 2024). This guide covers native builds and cross-compilation.

Terminal window
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
# Verify version (1.85+)
rustc --version
Terminal window
git clone https://github.com/a-maccormack/articwake.git
cd articwake

For running on your development machine:

Terminal window
# Debug build
cargo build
# Release build (optimized)
cargo build --release

Binary location:

  • Debug: target/debug/articwake
  • Release: target/release/articwake

For building on x86 and running on ARM (like Raspberry Pi).

Terminal window
cargo install cross --git https://github.com/cross-rs/cross

cross uses Docker to provide consistent build environments.

TargetPlatformUse Case
x86_64-unknown-linux-gnux86_64 LinuxStandard servers
aarch64-unknown-linux-gnuARM64 Linux (glibc)Pi 4/5, ARM servers
aarch64-unknown-linux-muslARM64 Linux (musl)Alpine, static binary
armv7-unknown-linux-gnueabihfARMv7 LinuxPi 2/3 (32-bit)

The Pi Zero 2 W is ARM64 (aarch64):

Terminal window
# Dynamic linking (glibc)
cross build --release --target aarch64-unknown-linux-gnu
# Static binary (musl) - recommended for Alpine
cross build --release --target aarch64-unknown-linux-musl

Binary location: target/aarch64-unknown-linux-musl/release/articwake

Terminal window
cross build --release --target armv7-unknown-linux-gnueabihf

The repository includes a Cross.toml configuration:

[target.armv7-unknown-linux-gnueabihf]
image = "ghcr.io/cross-rs/armv7-unknown-linux-gnueabihf:main"
[target.aarch64-unknown-linux-gnu]
image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main"
[target.aarch64-unknown-linux-musl]
image = "ghcr.io/cross-rs/aarch64-unknown-linux-musl:main"

articwake uses default features for all dependencies. No special feature flags are needed.

Approximate release binary sizes:

TargetSize
x86_64-gnu~6 MB
aarch64-gnu~5 MB
aarch64-musl~7 MB
armv7-gnueabihf~5 MB

To reduce binary size:

Terminal window
strip target/release/articwake

Or configure in Cargo.toml:

[profile.release]
strip = true
lto = true

For local development with hot reload:

Terminal window
# Install cargo-watch
cargo install cargo-watch
# Run with auto-reload
cargo watch -x run
error: package `articwake` requires rustc 1.85

Update Rust:

Terminal window
rustup update stable

Ensure Docker is running and you have pulled the cross images:

Terminal window
docker pull ghcr.io/cross-rs/aarch64-unknown-linux-musl:main

On some systems, you may need:

Terminal window
# Debian/Ubuntu
apt install build-essential pkg-config libssl-dev
# Fedora
dnf install gcc pkg-config openssl-devel

Building with LTO can use significant RAM. If OOM, try:

Terminal window
# Build with fewer parallel jobs
cargo build --release -j 2