{"record":{"id":"fc70f227b05f60a0","repo":"rust-lang/cargo","slug":"the-binary-target-name-name-is-forbidden-it-c","errorCode":null,"errorMessage":"the binary target name `{name}` is forbidden, it conflicts with cargo's build directory names","messagePattern":"the binary target name `(.+?)` is forbidden, it conflicts with cargo's build directory names","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/workspace/parser/targets.rs","lineNumber":1162,"sourceCode":"        .as_deref()\n        .unwrap_or_else(|| panic!(\"target name is required\"))\n}\n\nfn validate_lib_name(target: &TomlTarget, warnings: &mut Vec<String>) -> CargoResult<()> {\n    validate_target_name(target, TARGET_KIND_HUMAN_LIB, TARGET_KIND_LIB, warnings)?;\n    let name = name_or_panic(target);\n    if name.contains('-') {\n        anyhow::bail!(\"library target names cannot contain hyphens: {}\", name)\n    }\n\n    Ok(())\n}\n\nfn validate_bin_name(bin: &TomlTarget, warnings: &mut Vec<String>) -> CargoResult<()> {\n    validate_target_name(bin, TARGET_KIND_HUMAN_BIN, TARGET_KIND_BIN, warnings)?;\n    let name = name_or_panic(bin).to_owned();\n    if restricted_names::is_conflicting_artifact_name(&name) {\n        anyhow::bail!(\n            \"the binary target name `{name}` is forbidden, \\\n                 it conflicts with cargo's build directory names\",\n        )\n    }\n\n    Ok(())\n}\n\nfn validate_target_name(\n    target: &TomlTarget,\n    target_kind_human: &str,\n    target_kind: &str,\n    warnings: &mut Vec<String>,\n) -> CargoResult<()> {\n    match target.name {\n        Some(ref name) => {\n            if name.trim().is_empty() {\n                anyhow::bail!(\"{} target names cannot be empty\", target_kind_human)","sourceCodeStart":1144,"sourceCodeEnd":1180,"githubUrl":"https://github.com/rust-lang/cargo/blob/eb98b54bc9f3c74519f43d066cb3fd02ebc88df0/src/workspace/parser/targets.rs#L1144-L1180","documentation":"A binary target name cannot collide with Cargo's own output directory/layout names (`build`, `deps`, `examples`, `incremental`, `native`, `registry`, etc.), because the artifact would be written into or confused with those directories. `restricted_names::is_conflicting_artifact_name` catches these at targets.rs:1168-1172.","triggerScenarios":"`[[bin]] name = \"deps\"` (or `\"build\"`, `\"examples\"`, etc.). The `is_conflicting_artifact_name` predicate returns true and bails.","commonSituations":"Naming a CLI tool generically (e.g. `build`). Templated scaffolding that produces short directory-style names. Copying a workspace member name that happens to match a Cargo dir.","solutions":["Rename the binary to something not in Cargo's reserved artifact set.","Check `is_conflicting_artifact_name` against your chosen name before committing.","If the on-disk binary must keep that name, set `[[bin]] name = \"...\"` to a safe name and `filename = \"build\"` only if truly required."],"exampleFix":"# before\n[[bin]]\nname = \"build\"\n\n# after\n[[bin]]\nname = \"my-builder\"","handlingStrategy":"validation","validationCode":"fn is_safe_bin_name(name: &str) -> bool {\n    !matches!(name,\n        \"deps\" | \"build\" | \"examples\" | \"incremental\" | \"native\" | \"registry\")\n}\n// (mirrors cargo_core::restricted_names::is_conflicting_artifact_name)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid generic directory-style binary names.","Check names against Cargo's reserved artifact list before committing.","Use prefixed names like `myapp-build` instead of bare `build`."],"tags":["cargo","config","binary","naming","restricted-names"],"backgroundTag":null,"analyzedSha":"eb98b54bc9f3c74519f43d066cb3fd02ebc88df0","analyzedAt":"2026-08-11T17:42:36.556Z","contentChangedAt":"2026-08-11T17:42:36.556Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}