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.
[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.
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 msvcA 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.
[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"