Skip to main content
Version: 2.0 (Legacy)

Building an Image

How to build custom OpenHD system images from source.

Overview

Building custom images allows you to:

  • Custom Hardware: Support new hardware platforms
  • Feature Modifications: Add or remove specific features
  • Optimization: Optimize for specific use cases
  • Development: Create development and testing images

Build Environment Setup

System Requirements

  • Linux Distribution: Ubuntu 20.04 LTS or newer
  • Disk Space: Minimum 50GB free space
  • RAM: 8GB RAM recommended
  • CPU: Multi-core processor for faster builds
  • Network: Stable internet connection

Dependencies Installation

# Update system packages
sudo apt update && sudo apt upgrade -y

# Install build dependencies
sudo apt install -y \
git \
build-essential \
cmake \
ninja-build \
pkg-config \
libssl-dev \
libusb-1.0-0-dev \
libpcap-dev \
libsodium-dev \
python3-pip \
python3-setuptools \
curl \
wget \
unzip

# Install cross-compilation tools
sudo apt install -y \
gcc-arm-linux-gnueabihf \
g++-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu

Docker Setup (Alternative)

# Install Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

# Pull build container
docker pull openhd/builder:latest

Source Code Setup

Repository Cloning

# Clone main repositories
git clone https://github.com/OpenHD/OpenHD-ImageBuilder.git
cd OpenHD-ImageBuilder

# Initialize submodules
git submodule update --init --recursive

# Clone additional repositories
git clone https://github.com/OpenHD/OpenHD.git
git clone https://github.com/OpenHD/QOpenHD.git
git clone https://github.com/OpenHD/wfb-ng.git

Build Configuration

# Configure build for target platform
cd OpenHD-ImageBuilder
cp config/rpi4.conf config/custom.conf

# Edit configuration
nano config/custom.conf

Platform-Specific Builds

Raspberry Pi 4/5

# Build for Raspberry Pi 4
./build.sh --platform=rpi4 --version=custom

# Build for Raspberry Pi 5
./build.sh --platform=rpi5 --version=custom

# Build for Pi Zero 2W
./build.sh --platform=rpi-zero2w --version=custom

Radxa Platforms

# Build for Radxa Zero 3W
./build.sh --platform=radxa-zero3w --version=custom

# Build for Rock 5A
./build.sh --platform=rock5a --version=custom

# Build for Rock 5B
./build.sh --platform=rock5b --version=custom

Generic ARM64

# Generic ARM64 build
./build.sh --platform=generic-arm64 --version=custom

# Custom kernel configuration
./build.sh --platform=custom --kernel-config=custom.config

Build Process

Full Image Build

# Start complete build process
./build.sh --platform=rpi4 --clean --verbose

# Monitor build progress
tail -f build.log

# Build with specific features
./build.sh --platform=rpi4 --enable-feature=thermal-camera

Component-Specific Builds

# Build only OpenHD core
./build-component.sh openhd

# Build only QOpenHD
./build-component.sh qopenhd

# Build WFB-ng
./build-component.sh wfb-ng

# Build kernel modules
./build-component.sh kernel-modules

Cross-Compilation

# Set cross-compilation environment
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export STRIP=arm-linux-gnueabihf-strip

# Build with cross-compilation
mkdir build-arm && cd build-arm
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/arm-linux-gnueabihf.cmake
make -j$(nproc)

Customization Options

Feature Configuration

# Edit feature configuration
nano config/features.conf

# Available features:
ENABLE_THERMAL_CAMERA=yes
ENABLE_DUAL_CAMERA=yes
ENABLE_LTE_SUPPORT=yes
ENABLE_AUDIO_SUPPORT=no
ENABLE_RECORDING=yes
ENABLE_STREAMING=yes

Package Selection

# Customize package list
nano config/packages.list

# Core packages (required):
openhd-core
wfb-ng
libcamera
gstreamer1.0-plugins

# Optional packages:
thermal-camera-support
lte-modem-drivers
additional-codecs
development-tools

Kernel Configuration

# Custom kernel config
cp kernel/config-rpi4 kernel/config-custom

# Edit kernel configuration
nano kernel/config-custom

# Build with custom kernel
./build.sh --platform=rpi4 --kernel-config=config-custom

Advanced Build Options

Multi-Stage Build

# Stage 1: Base system
./build.sh --stage=base --platform=rpi4

# Stage 2: OpenHD installation
./build.sh --stage=openhd --platform=rpi4

# Stage 3: Optimization and cleanup
./build.sh --stage=optimize --platform=rpi4

# Complete build
./build.sh --stage=all --platform=rpi4

Incremental Builds

# Build only changed components
./build.sh --incremental --platform=rpi4

# Force rebuild of specific component
./build.sh --rebuild=openhd --platform=rpi4

# Clean specific component
./build.sh --clean-component=qopenhd --platform=rpi4

Debug Builds

# Build with debug symbols
./build.sh --debug --platform=rpi4

# Build with additional logging
./build.sh --verbose --log-level=debug --platform=rpi4

# Build with development tools
./build.sh --development --platform=rpi4

Build Optimization

Parallel Builds

# Use all CPU cores
export MAKEFLAGS="-j$(nproc)"

# Limit parallel jobs
export MAKEFLAGS="-j4"

# Ninja build system
./build.sh --generator=ninja --platform=rpi4

Cache Configuration

# Enable build cache
export CCACHE_DIR=/home/builder/.ccache
export PATH="/usr/lib/ccache:$PATH"

# Configure cache size
ccache -M 20G

# Show cache statistics
ccache -s

Resource Optimization

# Optimize for build speed
./build.sh --optimize=speed --platform=rpi4

# Optimize for image size
./build.sh --optimize=size --platform=rpi4

# Balance optimization
./build.sh --optimize=balanced --platform=rpi4

Testing Built Images

QEMU Emulation

# Install QEMU
sudo apt install qemu-system-arm qemu-user-static

# Emulate ARM image
qemu-system-arm \
-M versatilepb \
-cpu arm1176 \
-m 512 \
-kernel kernel.img \
-dtb bcm2708-rpi-b.dtb \
-sd openhd-custom.img \
-append "root=/dev/mmcblk0p2 rw"

Hardware Testing

# Flash image to SD card
sudo dd if=openhd-custom.img of=/dev/sdX bs=4M status=progress

# Verify image integrity
sudo dd if=/dev/sdX bs=4M count=1000 | md5sum

Automated Testing

# Run test suite
./test/run-tests.sh --image=openhd-custom.img

# Hardware-in-the-loop testing
./test/hil-test.sh --platform=rpi4 --image=openhd-custom.img

Continuous Integration

GitHub Actions

# .github/workflows/build.yml
name: Build OpenHD Images

on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main ]

jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
platform: [rpi4, rpi5, radxa-zero3w]

steps:
- uses: actions/checkout@v3
- name: Setup build environment
run: ./scripts/setup-ci.sh
- name: Build image
run: ./build.sh --platform=${{ matrix.platform }}
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: openhd-${{ matrix.platform }}.img
path: images/openhd-${{ matrix.platform }}.img

Local CI

# Set up local CI
./scripts/setup-local-ci.sh

# Run CI pipeline locally
./scripts/run-ci-locally.sh --platform=all

Troubleshooting

Common Build Issues

# Out of disk space
df -h
sudo apt clean
docker system prune -a

# Permission issues
sudo chown -R $USER:$USER build/
chmod +x build.sh

# Missing dependencies
./scripts/check-dependencies.sh
sudo apt install -f

Debug Failed Builds

# Check build logs
less build.log
grep -i error build.log

# Verbose build output
./build.sh --verbose --debug --platform=rpi4

# Interactive debugging
./build.sh --interactive --platform=rpi4

Memory Issues

# Monitor memory usage
watch free -h

# Increase swap space
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Distribution

Image Compression

# Compress final image
gzip -9 openhd-custom.img

# Create torrent file
mktorrent -a udp://tracker.openhd.app:8080 openhd-custom.img.gz

Checksums and Signatures

# Generate checksums
sha256sum openhd-custom.img.gz > openhd-custom.img.gz.sha256

# Sign with GPG
gpg --armor --detach-sign openhd-custom.img.gz
Build Time

Full image builds can take 2-6 hours depending on hardware. Plan accordingly and use incremental builds when possible.

Storage Requirements

Building images requires significant disk space. Ensure you have at least 50GB free space before starting.

Love OpenHD?