Installation¶
Prerequisites¶
Before building Crucible, ensure the following tools are installed:
| Tool | Version | Purpose |
|---|---|---|
| Go | 1.23.0 module minimum | Build Crucible CLI tools |
| clang | 14+ | Compile libFuzzer harnesses |
| cmake | 3.14+ | Build llama.cpp |
| AFL++ | (optional) | Alternative fuzzing engine |
| make | any | Build orchestration |
The module declares Go 1.23.0 as its minimum. This walkthrough was checked with Go 1.27.1; the minimum version was not separately retested here.
AFL++ is optional
You only need AFL++ if you plan to use the AFL fuzzing engine. The default workflow uses libFuzzer, which ships with clang.
macOS: use Homebrew LLVM
Apple clang does not include -fsanitize=fuzzer. Install LLVM via Homebrew and use it instead:
Install from source¶
Clone the repository and build all binaries:
make build produces exactly three binaries in the project root. These are the supported public tools:
| Binary | What it does | Reference |
|---|---|---|
crucible | Main CLI: environment checks, corpus work, campaigns, triage | crucible |
crucible-gen | Synthetic GGUF seed generator | crucible-gen |
crucible-triage | Crash triage and report generation | crucible-triage |
If you would rather choose the output directory, build each one by name:
mkdir -p bin
go build -o bin/crucible ./cmd/crucible
go build -o bin/crucible-gen ./cmd/crucible-gen
go build -o bin/crucible-triage ./cmd/crucible-triage
Build these three by name, not the whole cmd/ tree
cmd/ also holds mutator archives, experiment drivers and fixture tools that are developer-only: they are not part of the supported surface, several are not CLIs at all, and one is a CGo archive with no argv interface. Building the tree with a wildcard produces binaries with no documentation and no stability expectation. make build and the three commands above are the supported set.
What is supported, and what is not¶
Every capability in the documentation carries one of these labels. If a page does not say otherwise, treat it as stable.
| Label | Meaning |
|---|---|
| Stable | Built by make build, documented under CLI Reference, covered by make test |
| Advanced | Shipped and supported, but narrow, evolving, or needing background to interpret |
| Developer-only | Present in cmd/ or tools/, not built by make build, no stability expectation |
| Target-dependent | Needs a local upstream source checkout and a compiled native harness |
| Not publicly shipped | Work in the tree that is not part of the public tool and is not documented as if it were |
Nothing outside the three binaries above is part of the public tool today.
Building harnesses¶
Target-dependent
Everything in this section needs a local checkout of the upstream project you intend to test. The Quick start runs end to end without it.
Crucible ships harness source that links against llama.cpp to exercise the GGUF parsing paths. Building a harness requires a local llama.cpp checkout.
1. Clone llama.cpp:
2. Build the instrumented llama.cpp library:
The harness links against llama.cpp static libraries built with ASan, UBSan, and fuzzer-no-link. Update the target checkout to current upstream HEAD and record its commit. Pass that commit explicitly because the recipe's default pin is historical. This step produces build-fuzz/ inside the llama.cpp tree:
TARGET_COMMIT=$(git -C ~/src/llama.cpp rev-parse HEAD)
make -C targets/llamacpp build-fuzz LLAMA_CPP=~/src/llama.cpp \
LLAMA_CPP_VERSION="$TARGET_COMMIT"
Use a clean checkout and a fresh build directory or one with a matching build-fuzz/.crucible-commit marker. The recipe rejects an existing unmarked build because its objects cannot be tied to the recorded commit.
3. Build the libFuzzer harness:
This compiles crucible-libfuzzer, a standalone binary instrumented with libFuzzer coverage feedback.
AFL++ harness
To build the AFL++ harness instead, run:
See Configuration: Makefile targets for the full list of build targets.
Docker¶
There is no canonical project image. Containers can be useful for reproducible Linux toolchains, but the image must still pin the target source, compiler, sanitizer runtimes, architecture, build flags, and runtime limits. A container tag by itself is not provenance.
scripts/build-linux.sh is a starting point for Linux builds; read and record the actual commands for the target being tested.
Verify installation¶
After building, confirm that the tools are available:
The command list changes as capabilities are added, so the live output is authoritative. It should include environment checks (doctor), campaign controls (harness-smoke, preflight), analysis and live regression (regress, validate-oracle), and capability preservation (capability-capture, capability).
Then run the environment check:
You can also verify the other binaries:
Next: Quick start to generate a synthetic corpus, inspect it, and mutate it, with no target checkout required.