SUper COmpiler Grid β Distributed C/C++ Compilation and Caching System for Local Networks.
Compile once. Cache forever. Distributed builds with zero configuration.
SUCO is a high-performance, lightweight alternative to expensive proprietary solutions like IncrediBuild or legacy systems like Icecream/distcc. It is designed for maximum speed with minimal setup:
- π Heterogeneous Multi-Node Cross-Compilation β A Windows client (
suco-cl++.exe) dispatches compilation tasks to parallel Linux worker nodes running MinGW cross-compilers (x86_64-w64-mingw32-g++), returning native PE-x86-64 binary objects. - π€ CI-Verified Multi-Node Grid β Tested in GitHub Actions CI via a dedicated multi-runner network workflow (
multi-runner-grid.yml) verifying multi-node distribution across isolated virtual hosts. - π Prometheus & Grafana Telemetry (
:9001/metrics) β Open HTTP metrics exporter supplying real-time job counts, cache hit rates, active worker slots, and coordinator uptime. - π₯οΈ Native Qt 6 Control Center & Windows Installer β Modern desktop GUI (
suco-gui.exe) and automated NSIS Windows Installer (suco.nsi) for effortless setup. - π Zero-Config Auto-Discovery β Workers automatically discover the coordinator via UDP Broadcast.
- πΎ Intelligent SSD Cache β SHA-256-based LRU cache with metadata tracking and versioned keys.
- π Live Web Dashboard β Real-time monitoring of all workers, CPU cores, cache hit rate, and compile history.
- π Direct Data Path (Direct Dispatch) β Compilation data streams directly from clients to workers, avoiding coordinator bottlenecks.
- βοΈ Load-Aware CPU Scheduling β Heartbeat-based CPU load monitoring dynamically scores workers to prevent node saturation.
- π Least-Recently-Assigned Scheduling β Fair Round-Robin tie-breaking distributes parallel compile threads uniformly.
- π‘οΈ Transparent Grid Failover β If a worker goes offline, the coordinator immediately reschedules the jobs.
- β©οΈ Resilient Client Fallback β If the coordinator fails, the client seamlessly falls back to local compilation in <100ms.
- π οΈ CMake & IDE Integration β Easy integration via
SUCO.cmakeand automaticcompile_commands.jsonwrapper prefix cleaning. - π§Ό Grid-Wide Cache Clearing β Clean all local and remote caches via
suco cache clear. - π€ Path Normalization β Cross-directory cache hits via path mapping and
-ffile-prefix-mapintegration.
Head-to-head against Icecream under identical conditions
(same session, same flags, -j32), building the full librocksdb.a:
| Build System | Cold build | Warm rebuild |
|---|---|---|
| π¦ Icecream | 101.9s | 101.9s (no cache β every rebuild is a full compile) |
| π SUCO | 100.7s (parity) | 24.7s (4.1Γ faster) |
Cold builds are on par with Icecream; warm rebuilds are ~4Γ faster because SUCO serves unchanged objects straight from its content-addressed cache instead of recompiling them. Independently reproduced across two idle runs; three consecutive cold builds each completed all 342 objects.
Tested on a real grid with 4Γ Nodes (parallelized using
-j17):
| Build System | Duration | Speedup vs Native | Notes / Description |
|---|---|---|---|
| π₯οΈ Native g++ | 50.83s | 1.00x (Baseline) | Pure local compilation. |
| π¦ Icecream | 55.34s | 0.92x | Distributed compilation routed via iceccd daemon. |
| βοΈ SUCO Cold | 84.61s | 0.60x | First run on a cleared cache (includes preprocessor & network overhead). |
| π₯ SUCO Hot | 13.25s π | 3.84x β‘ | 100% Cache Hits. Bypasses compiler phases completely via global SSD caching! |
Tested on the same grid (parallelized using
-j8):
| Build System | Duration | Speedup vs Native | Notes / Description |
|---|---|---|---|
| π₯οΈ Native g++ | 1.13s | 1.00x (Baseline) | Local native build. |
| π¦ Icecream | 1.22s | 0.93x | Distributed via iceccd. |
| βοΈ SUCO Cold | 3.42s | 0.33x | Initial cold run. |
| π SUCO Warm | 1.12s β‘ | 1.01x | Skips compilation entirely and pulls .o objects from coordinator. |
Normal Build: SUCO Cache Hit:
ββββββββββββββββ ββββββββββββββββ
β Preprocessor β ~0.1s β Preprocessor β ~0.1s
ββββββββββββββββ€ ββββββββββββββββ€
β Parser/AST β ~3.0s β SHA-256 Hash β ~0.001s
ββββββββββββββββ€ ββββββββββββββββ€
β Optimization β ~15.0s β Cache Lookup β ~0.002s
ββββββββββββββββ€ ββββββββββββββββ€
β Codegen β ~7.0s β SSD β Client β ~0.5s
ββββββββββββββββ ββββββββββββββββ
~25s ~0.7s
The client performs only the preprocessing phase locally and computes a SHA-256 hash. On a cache hit, CPU-intensive compiler phases (parsing, optimization, codegen) are completely skipped β the finished .obj file is fetched directly from the SSD cache.
SUCO consists of several native C++20 components:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DEVELOPER MACHINE β
β βββββββββββββββββ β
β β suco β (Entry Point / Build Wrapper) β
β βββββββββ¬ββββββββ β
β β Sets CC/CXX to suco-cl/suco-cl++ β
β βΌ β
β βββββββββββββββββ ββββββββββββββββββββββββββββββ β
β β suco-cl/cl++ ββββββΆβ SUCO COORDINATOR β β
β β (Compiler Wrp)ββββββ ββββββββββββ ββββββββββββ β β
β βββββββββββββββββ β βSSD Cache β βDashboard β β β
β β β(5GB LRU) β β :9001 β β β
β β ββββββββββββ ββββββββββββ β β
ββββββββββββββββββββββββββ΄ββββββββ¬βββββββββββββββββββββ β
β TCP :9000
βββββββββββββββββΌββββββββββββββββ
βΌ βΌ βΌ
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β WORKER #1 β β WORKER #2 β β WORKER #3 β
β HP Mini G2 β β HP Mini G2 β β HP Mini G2 β
β 4 Cores β β 4 Cores β β 4 Cores β
ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
UDP Auto-Discovery :9002
| Component | Description |
|---|---|
suco (Wrapper) |
The main build wrapper. Intercepts build commands (make, ninja, cmake), overrides environment variables CC/CXX and delegates to suco-cl/suco-cl++. |
suco-cl / suco-cl++ |
The actual compiler wrappers. Preprocesses source files locally, calculates SHA-256 hashes and interacts with the coordinator. |
suco-coordinator |
Central grid hub. Manages the SSD LRU cache, distributes jobs (least-loaded scheduling), and hosts the live web dashboard. |
suco-worker |
Compilation node. Registers via UDP, compiles preprocessed sources, and returns compiled binaries. |
The suco wrapper includes a clean OOP-based subcommand system:
suco setup: Interactive setup assistant (configures Coordinator host, port, slots, log level, detects local compilers and performs connection verification).suco status: Shows grid coordinator state, cache hit rate, and real-time slots usage.suco workers: Lists all registered worker nodes grouped by compilers, tools and Qt versions.suco cache clear: Clears local caches and triggers PCH/object cache cleanup across the entire grid.suco config show: Displays currently active client configurations and paths.suco help: Prints usage instructions for available subcommands.
The cache uses a versioned, metadata-rich hash key:
v3:β¨0x1Fβ©Targetβ¨0x1Fβ©CompilerVersionβ¨0x1Fβ©Standardβ¨0x1Fβ©Definesβ¨0x1Fβ©Includesβ¨0x1Fβ©Flagsβ¨0x1Fβ©NormalizedSource
- Versioning:
v3:prefix for schema migrations (updated for path normalization and compression flags). - Metadata: Target architecture, compiler version, language standard, sorted defines & include paths.
- Source Normalization: Strips
#linedirectives, empty lines, and normalizes paths (optimized usingmemchrfor 300k+ lines in <5ms). - Separator: ASCII
0x1F(Unit Separator) β guaranteed not to conflict with normal code contents.
SUCO includes a hybrid PCH processing mechanism:
- PCH Detection: Parses common PCH options for MSVC (
/Yu,/Yc,/Y-,/Fp) and GCC/Clang (-include-pch,-fpch-preprocess,.gch,.pch). - Hybrid Distribution:
- PCH Creation (e.g. compiling
stdafx.hto.gch): Executed locally on the client to avoid copying large header sets over the network. - PCH Usage (compiling
.cppsource files using the PCH): Executed remotely in the grid. The client strips PCH flags and preprocessor directives, and uploads fully expanded source code to ensure portability on grid workers.
- PCH Creation (e.g. compiling
Client, coordinator, and worker use a unified thread-safe logging library:
- Granular Log Levels: Configured via the
SUCO_LOG_LEVELenvironment variable (DEBUG,INFO,WARN,ERROR- default isINFO). - Performance Optimized: Inline compile-time guards prevent
std::formatstring construction for disabled log levels. - Timestamps: Console output is structured as:
[YYYY-MM-DD HH:MM:SS] [LEVEL] Message.
Install directly from the official SUCO APT repository:
# 1. Download & register the official GPG keyring
curl -fsSL https://micbur.github.io/suco/suco-archive-keyring.asc | sudo tee /etc/apt/keyrings/suco.asc >/dev/null
# 2. Add the SUCO APT repository source list
echo "deb [signed-by=/etc/apt/keyrings/suco.asc] https://micbur.github.io/suco stable main" | sudo tee /etc/apt/sources.list.d/suco.list >/dev/null
# 3. Update and install
sudo apt update && sudo apt install -y suco| Platform | Packages |
|---|---|
| Linux | build-essential, cmake, libssl-dev, libzstd-dev |
| Windows (MinGW, recommended) | MinGW-w64 GCC β₯ 13 (e.g. MSYS2 or the Qt toolchain), CMake β₯ 3.15, Ninja, OpenSSL, SQLite3, zstd |
| Windows (MSVC) | Visual Studio Build Tools (MSVC), CMake β₯ 3.15, OpenSSL + zstd + sqlite3 (via vcpkg) |
Don't want to build? Grab the self-contained
suco-<version>-windows-x64.zip
from the latest release β the six .exe plus the runtime DLLs they need, no toolchain
required. Run clients with SUCO_NO_DAEMON=1.
# Linux / WSL
cmake -B build_linux -S . -DCMAKE_BUILD_TYPE=Release
cmake --build build_linux
# Windows (MSYS2 MinGW64 shell)
pacman -S --needed mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja \
mingw-w64-x86_64-openssl mingw-w64-x86_64-sqlite3 mingw-w64-x86_64-zstd
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build
# Windows (Qt MinGW toolchain, PowerShell) β build zstd once into thirdparty/, see docs
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH="C:/Qt/Tools/mingw1310_64/opt"
cmake --build build --config Release
# Windows (MSVC) β vcpkg install openssl zstd sqlite3 --triplet x64-windows first
cmake -B build_msvc -S . -G "Visual Studio 17 2022" -A x64 -DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
cmake --build build_msvc --config Releaseπͺ Windows notes: run clients with
SUCO_NO_DAEMON=1(the IPC daemon uses Unix sockets). The header-set/PCH optimization works on Windows: MinGW system headers are recognized, workers cache the header text, build PCHs and serve stripped TUs (~KB instead of MB payloads). Windows clients dispatch MinGW jobs under the target-qualified namex86_64-w64-mingw32-g++, so Linux workers can serve them oncemingw-w64is installed there β nodes without it are skipped safely (the client compiles locally).
π Full setup walkthrough (grid, verify, use, auth, troubleshooting): docs/INSTALL.md
Option A β one line (recommended): sets up the signed APT repo and installs suco. Works on Debian and Ubuntu.
curl -fsSL https://micbur.github.io/suco/install.sh | sudo shThen enable the role each node should play (nothing starts automatically):
sudo systemctl enable --now suco-worker # compile node
sudo systemctl enable --now suco-coordinator suco-worker # head node
suco --version # verifyOption Aβ² β the same thing by hand (if you'd rather not pipe to a shell)
curl -fsSL https://micbur.github.io/suco/suco-archive-keyring.asc \
| sudo tee /etc/apt/keyrings/suco.asc >/dev/null
echo "deb [signed-by=/etc/apt/keyrings/suco.asc] https://micbur.github.io/suco stable main" \
| sudo tee /etc/apt/sources.list.d/suco.list >/dev/null
sudo apt update && sudo apt install sucoInstalls binaries to /usr/bin/, systemd units to /usr/lib/systemd/system/ (shipped disabled β
a fresh install never silently joins a running grid), dashboard to /usr/share/suco/. To enable
grid-wide auth, set SUCO_SECRET in the unit (or an EnvironmentFile) on every node and restart.
Option B β build the .deb yourself:
cmake -B build -DCMAKE_BUILD_TYPE=Release && cmake --build build -j
( cd build && cpack -G DEB )
sudo apt install ./build/suco_*_amd64.debOption B β interactive installer:
sudo bash install.sh
# Choose: 1) Coordinator + Worker 2) Worker OnlyThe installer installs binaries to /usr/local/bin/, registers systemd daemons, and opens ports in the firewall.
./suco-coordinator
# Dashboard: http://localhost:9001
# Cache: ~/.cache/suco/ (Default: 5 GB SSD cache with LRU eviction)# Auto-Discovery (discovers coordinator automatically via UDP)
./suco-worker --slots 4
# Manual Address config
./suco-worker --coordinator 192.168.0.200:9000 --slots 8# Linux (GCC)
suco g++ -O3 -std=c++20 -c myfile.cpp -o myfile.o
# Windows (MinGW, PowerShell)
$env:SUCO_NO_DAEMON = "1"
.\suco-cl++.exe -O2 -std=c++20 -c myfile.cpp -o myfile.o
# Windows (MSVC)
suco cl.exe /O2 /EHsc /c myfile.cpp /Fo myfile.obj
# In CMake Lists
set(CMAKE_CXX_COMPILER_LAUNCHER suco)The built-in dashboard on port 9001 visualizes:
- π’ Worker Nodes Status and CPU core utilization.
- π Cache Hit Rate via animated circular gauges.
- β‘ Active Compilations with runtime indicators.
- π Job History with hit/miss indicators.
| Port | Protocol | Purpose |
|---|---|---|
9000 |
TCP | Remote compilations (Client β Coordinator β Worker) |
9001 |
TCP | Live dashboard and REST stats API |
9002 |
UDP | Grid auto-discovery broadcasts |
| Feature | SUCO | IncrediBuild | Icecream | distcc |
|---|---|---|---|---|
| Price | β Free | β ~$2000/license | β Free | β Free |
| SSD Caching | β SHA-256 LRU | β Proprietary | β No | β No |
| Auto-Discovery | β UDP Broadcast | β Central Broker | β mDNS | β Manual config |
| Web Dashboard | β Glassmorphism | β GUI Client | β No | |
| Windows + Linux | β Native | β Yes | β Yes | |
| Zero-Config Worker | β Yes | β Agent needed | β Yes | β Manual config |
| Resilient Fallback | β <100ms | β No | β No | |
| Setup Time | β ~2 mins | β ~30 mins |
- β
v0.12.0 (Current / Released): Prometheus & Grafana Telemetry Exporter (
:9001/metrics), Multi-Node Distributed CI Verification Grid Workflow (multi-runner-grid.yml), Heterogeneous Windows-to-Linux Parallel Cross-Compilation, Linux Service Deployment (k3master), Native Qt 6 Desktop Control Center (suco-gui.exe). - π v1.0.0 (Production Target): Worker Sandboxing (
bubblewrap), Remote Preprocessing, TLS/mTLS Encryption, macOS ARM64 Support.
For detailed technical specifications, view the full Project Roadmap and Portfolio Showcase.
MIT License β See LICENSE for details.
Created by Michael Burzlaff. Developed with β‘ by MicBur



