Declarative Ice files
Identity, actions, params and artifacts are data in
origami.ice — never a pile of shell commands.
Origami
C++20 build orchestration
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
"src"
|> io.list(".*[.]cpp")
|> ori.genExe("hello", "g++")
The model
Origami separates concepts by responsibility. Each one participates in a different part of the build lifecycle.
Identity, actions, params and artifacts are data in
origami.ice — never a pile of shell commands.
Objects are cached per compile signature and headers are tracked
with -MMD. A current target runs zero processes.
The |> operator chains plugin stages, passing each
typed result to the next operation.
Git branches or refs, SHA-256-verified archives, sibling project paths, or libraries already installed on the system.
Compilation and filesystem work happens in native code. Origami never invokes a command shell.
Static and shared libraries with exported headers, consumed directly by other Origami projects.
The anatomy
ori.genLib returns its path as a string — the
call order itself is the dependency.
The library path goes straight into the consumer profile. No target graph to maintain.
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
origami build --params mode:release output:calculator
origami dependency-tree
origami clean-cache --all
build runs the declared action with overridden paramsdependency-tree prints the resolved dependency treeclean-cache removes local and global caches