rust-lang/cargo · error

could not find specification for target

Error message

could not find specification for target `{target}`.
  Dependency `{dependency}` requires to build for target `{target}`.

What it means

A dependency requires building for a target (`CompileKind::Target(s)` or Host) whose spec is not present in `target_data`. Cargo resolved the unit graph but cannot find a target specification (no rustc target spec loaded for that triple), so it bails with the dependency and target names.

Solutions

  1. Install the target: `rustup target add <triple>`.
  2. Verify the triple spelling matches `rustc --print=target-list`.
  3. For custom targets, pass the full path: `--target ./specs/foo.json`.
  4. Remove or correct the `build.target` entry in `.cargo/config.toml`.

Example fix

// before
cargo build --target aarch64-unkown-linux-gnu   # typo

// after
rustup target add aarch64-unknown-linux-gnu
cargo build --target aarch64-unknown-linux-gnu
Defensive patterns

Strategy: validation

Validate before calling

fn target_installed(triple: &str) -> bool {
    let out = std::process::Command::new("rustup").args(["target", "list", "--installed"]).output();
    matches!(out, Ok(o) if String::from_utf8_lossy(&o.stdout).lines().any(|l| l.trim()==triple))
}

Type guard

null

Try / catch

null

Prevention

When it happens

Trigger: Passing `--target <triple>` for an unknown/uninstalled target; a dependency's build-script or proc-macro forces a kind whose spec wasn't loaded; `.cargo/config.toml` references a target not installed via rustup.

Common situations: Forgetting `rustup target add <triple>`; typos in `build.target`; custom target JSON path wrong; CI missing target components.

Related errors


AI-assisted analysis of rust-lang/cargo@42eee92bc9 (2026-08-11). Data as JSON: /api/errors/a252d45af7ada73c. Report an issue: GitHub.

Appendix: source

Thrown at src/compiler/compilation.rs:506

fn get_sysroot_target_libdir(
    bcx: &BuildContext<'_, '_>,
) -> CargoResult<HashMap<CompileKind, PathBuf>> {
    bcx.all_kinds
        .iter()
        .map(|&kind| {
            let Some(info) = bcx.target_data.get_info(kind) else {
                let target = match kind {
                    CompileKind::Host => "host".to_owned(),
                    CompileKind::Target(s) => s.short_name().to_owned(),
                };

                let dependency = bcx
                    .unit_graph
                    .iter()
                    .find_map(|(u, _)| (u.kind == kind).then_some(u.pkg.summary().package_id()))
                    .unwrap();

                anyhow::bail!(
                    "could not find specification for target `{target}`.\n  \
                    Dependency `{dependency}` requires to build for target `{target}`."
                )
            };

            Ok((kind, info.sysroot_target_libdir.clone()))
        })
        .collect()
}

fn target_runner(
    bcx: &BuildContext<'_, '_>,
    kind: CompileKind,
) -> CargoResult<Option<(PathBuf, Vec<String>)>> {
    if let Some(runner) = bcx.target_data.target_config(kind).runner.as_ref() {
        let path = runner.val.path.clone().resolve_program(bcx.gctx);
        return Ok(Some((path, runner.val.args.clone())));
    }

View on GitHub (pinned to 42eee92bc9)