The missing everything tool for C and C++

TOML manifests! Cross compilation! Really, really fast builds! And so, so much more, packed into a single file static binary

Install an alpha build, get notified by updates, or send me an email.

$ curl -fsSL https://spn.spader.zone/install | sh
One binary replaces

An extremely fast build system

Write project manifests in TOML, and spn turns them into a build graph and executes it in parallel. You don’t have to be jealous of Rust programmers any more.

spn doesn’t wrap legacy build systems. Software needs fewer layers, not more.

spn.toml
[package]
name = "hello"

[[bin]]
name   = "hello"
source = ["main.c"]
$ spn build
Compiled profile debug in 22.5 ms (0 executed, 807 cached)

Reproducible, sandboxed builds

Build scripts are sandboxed, with no ambient access to your machine, written in the same language as your project and compiled automatically to WASM modules.

Build scripts are first class programs. They can have their own dependencies, and are only rerun when the files they read change.

build.c
spn_err_t build(spn_t* spn) {
  read_json("endpoints.json");
  generate_code();
  add_to_build("/source/gen/endpoint.c");
}

Zero dependency, single file deployment

spn ships as a single file static executable, or an embeddable library with a C ABI. It runs natively on Linux, macOS, and Windows, supports most common toolchains, and supports your toolchain’s cross compilation matrix.

spn build --target x86_64-windows-gnu
spn build --target aarch64-macos
spn build --target x86_64-windows-msvc --toolchain msvc

A package manager built for C and C++

spn includes a sophisticated package manager with first class Git integration. Pick from existing package versions, write your own, or ignore versions completely and pin to one commit at a time.

C/C++ are not JS. There isn’t a package culture. spn takes great care to provide a package manager as robust and easy to use as the best in class, while ensuring that it fits into your existing workflow like a glove.

spn.toml
[deps.package.sdl3]
version = "3.4.14"
options = { x11 = true }

[deps.package.imgui]
version = "1.92.8"
options = { sdl3 = true, sdlgpu3 = true, freetype = false }

[patch.imgui]
files = ["patches/oopsie-daisy.patch"]

[deps.build]
yyjson = "0.14.0"
$ curl -fsSL https://spn.spader.zone/install | sh