Fixing JUCE Build Graph Duplication with schmoothie
Published: August 21, 2026 · Read Time: 5 min read · Category: Systems
Author: Abhishek Shivakumar (Systems & Audio Engineering)
How multi-target JUCE projects compile framework modules repeatedly, and how a clean cache layer reduces three-target builds to 0.40x CPU time.
Multi-Target Duplication in JUCE
In a standard JUCE CMake project containing multiple plugin formats (VST3, AU, CLAP, and Standalone), each target compiles the entire framework independently. Defining three plugin formats compiles 23 framework modules three separate times.
Measured on an Apple M4 Max against JUCE 9.0.1, three identical targets cost 327.0 CPU-seconds in upstream builds. Compiling identical source files with separate target definitions accounts for this overhead.
Configure Step Compilation
Standard JUCE configure steps compile a helper binary before project object files are generated. This step runs serially without multicore parallelization, adding latency to every fresh build directory and CI invocation.
Cold configure in stock JUCE consumes 8.4 seconds wall-clock time and 22.4 CPU-seconds. With schmoothie, configure completes in 0.6 seconds wall-clock and 0.7 CPU-seconds.
Configure Performanceschmoothie eliminates configure-time compilation. Pre-built helper metadata resolves definitions instantly across fresh build folders.
Measured CPU Time
All measurements reflect macOS arm64 on an Apple M4 Max in Release mode with C++20, -j14, and LTO disabled. Scenarios were interleaved to control for hardware temperature drift.
| Scenario | Stock JUCE | schmoothie | Improvement Factor |
|---|---|---|---|
| Three-target build | 327.0 CPU-s (126 objs) | 131.3 CPU-s (69 objs) | 0.40x CPU time |
| Second build directory | 109.0 CPU-s (31 objs) | 2.3 CPU-s (1 obj) | 0.02x CPU time |
| Config flag change | 94.3 CPU-s (31 objs) | 8.2 CPU-s (4 objs) | 0.09x CPU time |
| Configure execution | 22.4 CPU-s (8.4s wall) | 0.7 CPU-s (0.6s wall) | 0.03x CPU time |
Binary and Symbol Parity
Binary verification validates all 23 linkable JUCE modules built through both pipelines. A two-product VST3 and CLAP tree produces 7,908 symbols per VST3 binary with zero exported differences.
Audio output, parameter automation sweeps, and state serialization produce bit-identical results. AU, VST3, and Standalone bundles pass pluginval 1.0.4 at strictness level 10.
Integration with CMake
schmoothie integrates as a drop-in CMake include file. Existing juce_add_plugin and juce_add_gui_app invocations operate without modifications to target properties or source lists.
cmake_minimum_required(VERSION 3.22)
project(AudioPlugin VERSION 1.0.0)
# Include schmoothie cache layer before JUCE target definitions
include(cmake/schmoothie.cmake)
juce_add_plugin(AudioPlugin
COMPANY_NAME "Quilio"
IS_SYNTH FALSE
NEEDS_MIDI_INPUT FALSE
FORMATS VST3 AU Standalone
PRODUCT_NAME "AudioPlugin"
)
target_sources(AudioPlugin PRIVATE
Source/PluginProcessor.cpp
Source/PluginEditor.cpp
)