C++20 build orchestration

Build C++ by declaration,
not by script.

Origami keeps build intent inside your project. Ice files describe identity, actions, dependencies, artifacts and plugins explicitly — the CLI only selects an action and injects declared parameters.

Project identifies · Action executes · Param configures · Dependency requires · Origin locates · Artifact delivers · Plugin adapts · Cache materializes

Origami bird logo
"src"
    |> io.list(".*[.]cpp")
    |> ori.genExe("hello", "g++")

The model

Every fold has a name

Origami separates concepts by responsibility. Each one participates in a different part of the build lifecycle.

Declarative Ice files

Identity, actions, params and artifacts are data in origami.ice — never a pile of shell commands.

Incremental by signature

Objects are cached per compile signature and headers are tracked with -MMD. A current target runs zero processes.

Typed pipelines

The |> operator chains plugin stages, passing each typed result to the next operation.

Dependencies from anywhere

Git branches or refs, SHA-256-verified archives, sibling project paths, or libraries already installed on the system.

Native plugins

Compilation and filesystem work happens in native code. Origami never invokes a command shell.

Publishable artifacts

Static and shared libraries with exported headers, consumed directly by other Origami projects.

The anatomy

How a build reads

  1. 01

    Generate the library

    ori.genLib returns its path as a string — the call order itself is the dependency.

  2. 02

    Link it into the executable

    The library path goes straight into the consumer profile. No target graph to maintain.

  3. 03

    Change it, and only it

    Tracked link inputs relink consumers without recompiling their sources.

coreSrc: io.list("src/core/.*[.]cpp")
core: ori.genLib(
  "libcore.a",
  ${coreSrc},
  ${compiler},
  ${flags[params.mode]}
)

appSrc: io.list("src/app/.*[.]cpp")
ori.genExe(
  ${params.output},
  ${appSrc},
  ${compiler},
  { link: [${core}] }
)

The trigger

The CLI selects. It never configures.

origami build --params mode:release output:calculator
origami dependency-tree
origami clean-cache --all
  • build runs the declared action with overridden params
  • dependency-tree prints the resolved dependency tree
  • clean-cache removes local and global caches