rust-lang/rust · error · anyhow::Error

Failed to parse `build.target` as an array of target

Error message

Failed to parse `build.target` as an array of target

What it means

Returned by the target_tuple parser when the Cargo build.target config value is neither a TOML string nor an array (or an array element is not a string). rust-analyzer reads build.target to learn the set of target triples Cargo will build for; anything else is rejected.

Source

Thrown at src/tools/rust-analyzer/crates/project-model/src/toolchain_info/target_tuple.rs:103

            s.to_owned()
        }
    };

    let parse_err = "Failed to parse `build.target` as an array of target";

    match target.as_ref() {
        toml::de::DeValue::String(s) => {
            Ok(Some(vec![join_to_origin_if_json_path(s.as_ref(), target)]))
        }
        toml::de::DeValue::Array(arr) => arr
            .iter()
            .map(|v| {
                let s = v.as_ref().as_str().context(parse_err)?;
                Ok(join_to_origin_if_json_path(s, v))
            })
            .collect::<anyhow::Result<_>>()
            .map(Option::Some),
        _ => Err(anyhow::anyhow!(parse_err)),
    }
}

#[cfg(test)]
mod tests {
    use paths::{AbsPathBuf, Utf8PathBuf};

    use crate::{ManifestPath, Sysroot};

    use super::*;

    #[test]
    fn cargo() {
        let manifest_path = concat!(env!("CARGO_MANIFEST_DIR"), "/Cargo.toml");
        let sysroot = Sysroot::empty();
        let manifest_path =
            ManifestPath::try_from(AbsPathBuf::assert(Utf8PathBuf::from(manifest_path))).unwrap();
        let cfg = QueryConfig::Cargo(&sysroot, &manifest_path, &None);

View on GitHub (pinned to 7088e4b63a)

Solutions

  1. Open .cargo/config.toml (and ~/.cargo/config.toml, and the global config) and set build.target to a string or array of strings.
  2. Validate the file with a TOML linter.
  3. If you meant a single target, use build.target = "<triple>"; for several, build.target = ["<triple1>", "<triple2>"].

Example fix

# before (in .cargo/config.toml)
[build]
target = 42

# after
[build]
target = ["x86_64-unknown-linux-gnu", "wasm32-unknown-unknown"]
Defensive patterns

Strategy: type-guard

Validate before calling

// Lint the cargo config before rust-analyzer loads the workspace:
fn valid_build_target(cfg: &toml::Value) -> bool {
    match cfg.get("build").and_then(|b| b.get("target")) {
        None => true,
        Some(toml::Value::String(_)) => true,
        Some(toml::Value::Array(a)) => a.iter().all(|v| matches!(v, toml::Value::String(_))),
        _ => false,
    }
}

Type guard

// Type-guard for the parsed build.target value:
fn build_target_is_valid(t: &toml::de::DeValue) -> bool {
    match t.as_ref() {
        toml::de::DeValue::String(_) => true,
        toml::de::DeValue::Array(arr) => arr.iter().all(|v| v.as_ref().as_str().is_some()),
        _ => false,
    }
}

Try / catch

match load_target_tuple(&target) {
    Ok(t) => Ok(t),
    Err(e) if e.to_string().contains("build.target") => {
        eprintln!("fix .cargo/config.toml: build.target must be a string or array of strings");
        Err(e)
    }
    Err(e) => Err(e),
}

Prevention

When it happens

Trigger: Parsed from the Cargo config (config.toml or .cargo/config.toml) build.target key when its value is a number, boolean, table, or an array containing non-strings. The parse_err is also attached via .context() when an array element fails as_str().

Common situations: A typo in config.toml writing build.target = 42 or build.target = true; a malformed array like build.target = ["x86_64", 64]; inheriting a config from a template that used a different schema; Cargo config from a future Cargo version that added a new shape.

Understand the failure class

Related errors


AI-assisted analysis of rust-lang/rust@7088e4b63a (2026-08-10). Data as JSON: /api/errors/3fab87da73c41c26. Report an issue: GitHub.