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 Performance

schmoothie 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.

ScenarioStock JUCEschmoothieImprovement Factor
Three-target build327.0 CPU-s (126 objs)131.3 CPU-s (69 objs)0.40x CPU time
Second build directory109.0 CPU-s (31 objs)2.3 CPU-s (1 obj)0.02x CPU time
Config flag change94.3 CPU-s (31 objs)8.2 CPU-s (4 objs)0.09x CPU time
Configure execution22.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
)

Back to Quilio Blog