Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/gueritta/primemixxx/llms.txt

Use this file to discover all available pages before exploring further.

Building primemixxx from source produces a self-contained ARMv7 bundle of MIXXX 2.5.6 and all its dependencies — Qt 5.15.8, ALSA, audio codecs, and MIDI libraries — ready to be deployed to the SD card on your Denon Prime Go or Prime 4.

Prerequisites

Before running any build script, install the following on your build machine:
  • u-boot tools — for mkimage (packs firmware .dtb)
  • 7-zip — for unpacking the original firmware archive
  • QEMU ARM user-mode + binfmt — allows running ARMv7 binaries natively on x86 during the build
  • Base development packagesbuild-essential, git, wget, cpio, file, unzip, rsync, bc
  • Buildroot 2021.02.10 — cloned by clone-buildroot.sh (see Step 2 below)
See the Buildroot system requirements for the full list of host packages.

Makefile Targets

The top-level Makefile delegates to shell scripts. All targets are .PHONY and can be run with make <target> or directly as ./<script>.sh.
TargetScriptPurpose
unpack./unpack.shDownload and unpack original Denon firmware
clone-buildroot./clone-buildroot.shClone Buildroot 2021.02.10 into buildroot/
compile-buildroot./compile-buildroot.shBuild toolchain + all packages (requires sudo for loopback mount)
configure-buildroot./configure-buildroot.shApply primemixxx defconfig to Buildroot
clean-buildroot-target./clean-buildroot-target.shRemove Buildroot’s target/ tree to force a clean reinstall of all packages
pack./pack.shPack modified rootfs images into a firmware .dtb
dist./dist.shProduce a distributable SD card tarball
generate-updater-win./generate-updater-win.shBuild original Windows updater tool
generate-new-updater-win./generate-new-updater-win.shBuild cross-platform Go updater (requires Go 1.22+)
generate-package-ignorelist./generate-package-ignorelist.shRegenerate the package ignore list for firmware packing
unpack-updater./unpack-updater.shUnpack a firmware .img using the updater tool

Build Pipeline

1

Unpack original firmware

Download and unpack the original Denon firmware. This extracts the device tree source (.dts) and compressed rootfs images that primemixxx modifies.
./unpack.sh
2

Clone Buildroot

Clone the exact Buildroot version used by this project. Using a different version will cause toolchain or package incompatibilities.
./clone-buildroot.sh
3

Build toolchain and packages

Run the full Buildroot compilation. This compiles the ARMv7 cross-toolchain, MIXXX, Qt 5.15.8, all audio libraries, and every other package in the defconfig. Plan for 1–4 hours on first run.
./compile-buildroot.sh
compile-buildroot.sh requires sudo to set up loopback mounts when packing the rootfs image. The script only escalates for that specific step — the rest runs as your normal user.
4

Pack firmware image

Pack the modified rootfs and device tree back into a flashable firmware .dtb. The output is PRIMEGO-4.3.4-STOCK-SSH-Update.img.dtb (symlinked as .img).
./pack.sh

MIXXX Bundle Pipeline

After Buildroot finishes, collect the MIXXX binary and all its runtime dependencies into a mixxx-bundle/ directory that can be deployed to the device’s SD card.
1

Collect MIXXX bundle

Gather MIXXX, Qt 5.15.8 plugins, MIDI mappings, ALSA libraries, audio codecs, and all other shared libraries from the Buildroot output directory. The script uses readelf to recursively resolve all NEEDED entries and copies the result to mixxx-bundle/.
./scripts/dev-collect-mixxx-bundle.sh
The script also fixes the Mali GPU driver at this step: Buildroot ships the r0p0 DDK, but the device has hardware r1p0. The collected bundle replaces libEGL.so and libGLESv2.so with symlinks to the device’s native /usr/lib/libmali.so.14.0.
2

Remove system-critical libraries

Strip the nine libraries that must come from the device’s /lib. Bundling them causes an ABI mismatch with the running kernel and results in SIGABRT or SIGSEGV at startup.
./scripts/dev-fix-device-libs.sh
The following libraries must never be included in mixxx-bundle/lib/. They are provided by the device’s own /lib and must remain there to match the running kernel’s ABI:
LibraryRole
libc.so.6C standard library
libm.so.6Math library
libpthread.so.0POSIX threads
libdl.so.2Dynamic linker
librt.so.1POSIX real-time extensions
libstdc++.so.6C++ standard library
libgcc_s.so.1GCC runtime
ld-linux-armhf.so.3Dynamic linker/loader
libatomic.so.1GCC atomic operations
dev-fix-device-libs.sh removes these automatically. If you add them back manually, MIXXX will segfault immediately on launch.

Create a Distributable SD Card Bundle

To produce the prime-series-sdcard-*.tar.gz release archive for end users:
./scripts/dev-create-sdcard-bundle.sh
This assembles the complete SD card layout including the TKGL bootstrap framework, MIXXX bundle, install scripts, and device services into a single tarball.

Fast Iteration

When iterating on launcher scripts, MIDI mappings, or settings without changing the MIXXX binary, skip the full bundle collection step:
./scripts/dev-quick-fix-deploy.sh
This redeploys only changed files, significantly faster than a full dev-deploy-to-device.sh run.

PortAudio NDEBUG Fix

If MIXXX crashes with SIGABRT during ALSA device enumeration at startup, the PortAudio build is missing the -DNDEBUG flag. The fix is already applied in patches/portaudio-ndebug.mk via a post-configure hook that patches the generated Makefile after ./configure runs. Copy this file to buildroot/2021.02.10/package/portaudio/portaudio.mk to apply it:
# patches/portaudio-ndebug.mk — drop into package/portaudio/portaudio.mk
# Disable assertions for embedded ARM — PortAudio's assert(maxChans > 0)
# fires during ALSA device enumeration on strict embedded hardware (JP11/AKM DACs)
# where some plugin PCMs return 0 channels.
# The CFLAGS env var doesn't override Makefile CFLAGS, so we sed the Makefile.
define PORTAUDIO_ADD_NDEBUG
	$(SED) 's/^CFLAGS = /CFLAGS = -DNDEBUG /' $(@D)/Makefile
endef
PORTAUDIO_POST_CONFIGURE_HOOKS += PORTAUDIO_ADD_NDEBUG
Without this, PortAudio’s internal assert(maxChans > 0) fires during ALSA device enumeration on the JP11/AKM DAC and aborts the process before any audio device is opened. After replacing the .mk file, rebuild PortAudio with make portaudio-rebuild inside the Buildroot tree.

Build docs developers (and LLMs) love