BoundaryML/baml · error
cargo build failed for pack ({} + {})
Error message
cargo build failed for pack ({} + {}) What it means
build_pack builds both the pack's CLI binary and host binary with a single `cargo build -p <cli_package> --bin <cli_bin> -p <host_package> --bin <host_bin>` invocation. If cargo exits non-zero, it bails naming both packages. Cargo's own diagnostics are already on stderr.
Source
Thrown at baml_language/crates/tools_size_gate/src/measure.rs:105
/// Build the CLI + pack host, then run `baml pack` on the fixture and
/// return the path to the produced standalone executable.
fn build_pack(workspace_root: &Path, name: &str, config: &ArtifactConfig) -> Result<PathBuf> {
let pack = config.require_pack()?;
// Build the CLI and the pack host in one release invocation. The host
// binary must land next to the CLI in target/release so `baml pack`
// resolves it locally (no GitHub download).
eprintln!(" building {} + {}", pack.cli_package, pack.host_package);
let status = Command::new("cargo")
.arg("build")
.arg("--release")
.args(["-p", &pack.cli_package, "--bin", &pack.cli_bin])
.args(["-p", &pack.host_package, "--bin", &pack.host_bin])
.current_dir(workspace_root)
.status()
.context("failed to run cargo build for pack")?;
if !status.success() {
bail!(
"cargo build failed for pack ({} + {})",
pack.cli_package,
pack.host_package
);
}
run_baml_pack(workspace_root, name, pack)
}
/// Run the freshly built CLI's `baml pack` on the fixture, writing the
/// output to a deterministic path under `target/size-gate/`.
fn run_baml_pack(workspace_root: &Path, name: &str, pack: &PackConfig) -> Result<PathBuf> {
let cli_path = workspace_root
.join("target/release")
.join(exe_filename(&pack.cli_bin));
if !cli_path.exists() {
bail!("pack CLI not found at {}", cli_path.display());
}View on GitHub (pinned to bd85ce9dee)
Solutions
- Read cargo's error output above the message to see which of the two targets failed
- Build each target manually: cargo build -p <cli_package> --bin <cli_bin>, then the host
- Verify package/bin names in the pack config match Cargo.toml
- Fix the compile errors or test on a clean checkout
Example fix
// before: bin renamed in Cargo.toml but not in config cli_bin = "baml-old" // after cli_bin = "baml"
Defensive patterns
Strategy: try-catch
Validate before calling
let status = std::process::Command::new("cargo")
.args(["build", "-p", cli_pkg, "--bin", cli_bin, "-p", host_pkg, "--bin", host_bin])
.status()?;
if !status.success() { eprintln!("pack targets do not build; check bin/package names"); std::process::exit(1); } Try / catch
if let Err(e) = measure() {
if e.to_string().contains("cargo build failed for pack") {
eprintln!("build the two pack targets manually to see which failed");
}
return Err(e);
} Prevention
- Verify cli/host package and bin names against Cargo.toml when renaming targets
- Build both pack targets in a preflight CI job before measuring
- Gate size measurements on the unit-test CI job passing
- Test pack builds on all target platforms the gate runs on
When it happens
Trigger: Failure building either the CLI or host package/bin pair defined in the PackConfig during size-gate measure: compile errors in either crate, missing bins, or broken build scripts.
Common situations: Renamed bin or package targets in Cargo.toml without updating the pack config; compile errors introduced on the branch under test; host crate requiring a feature only available on certain platforms.
Understand the failure class
Background: "git command failed": what it means when a tool shells out to git and git exits non-zero — this error's family across 21 libraries.
Related errors
- cargo build failed for {package}
- cargo metadata failed
- cargo metadata failed
- packed artifact not found (expected at {})
- artifact not found: {} (expected at {})
AI-assisted analysis of BoundaryML/baml@bd85ce9dee (2026-09-12).
Data as JSON: /api/errors/4b271435464088a8.
Report an issue: GitHub.