diff --git a/src/cargo/util/config/mod.rs b/src/cargo/util/config/mod.rs index 40102a62fc3..7c386a2e238 100644 --- a/src/cargo/util/config/mod.rs +++ b/src/cargo/util/config/mod.rs @@ -1745,8 +1745,27 @@ impl Config { .env_config .try_borrow_with(|| self.get::("env"))?; - if env_config.get("CARGO_HOME").is_some() { - bail!("setting the `CARGO_HOME` environment variable is not supported in the `[env]` configuration table") + // Reasons for disallowing these values: + // + // - CARGO_HOME: The initial call to cargo does not honor this value + // from the [env] table. Recursive calls to cargo would use the new + // value, possibly behaving differently from the outer cargo. + // + // - RUSTUP_HOME: Under normal usage with rustup, this will have no + // effect because the rustup proxy sets RUSTUP_HOME, and that would + // override the [env] table. If the outer cargo is executed directly + // circumventing the rustup proxy, then this would affect calls to + // rustc (assuming that is a proxy), which could potentially cause + // problems with cargo and rustc being from different toolchains. We + // consider this to be not a use case we would like to support, + // since it will likely cause problems or lead to confusion. + for disallowed in &["CARGO_HOME", "RUSTUP_HOME"] { + if env_config.contains_key(*disallowed) { + bail!( + "setting the `{disallowed}` environment variable is not supported \ + in the `[env]` configuration table" + ); + } } Ok(env_config) diff --git a/tests/testsuite/cargo_env_config.rs b/tests/testsuite/cargo_env_config.rs index 0b787bebd3c..938205d6443 100644 --- a/tests/testsuite/cargo_env_config.rs +++ b/tests/testsuite/cargo_env_config.rs @@ -59,29 +59,31 @@ fn env_invalid() { } #[cargo_test] -fn env_no_cargo_home() { +fn env_no_disallowed() { + // Checks for keys that are not allowed in the [env] table. let p = project() - .file("Cargo.toml", &basic_bin_manifest("foo")) - .file( - "src/main.rs", - r#" - fn main() { - } - "#, - ) - .file( - ".cargo/config", - r#" - [env] - CARGO_HOME = "/" - "#, - ) + .file("Cargo.toml", &basic_manifest("foo", "1.0.0")) + .file("src/lib.rs", "") .build(); - p.cargo("check") - .with_status(101) - .with_stderr_contains("[..]setting the `CARGO_HOME` environment variable is not supported in the `[env]` configuration table") - .run(); + for disallowed in &["CARGO_HOME", "RUSTUP_HOME"] { + p.change_file( + ".cargo/config", + &format!( + r#" + [env] + {disallowed} = "foo" + "# + ), + ); + p.cargo("check") + .with_status(101) + .with_stderr(&format!( + "[ERROR] setting the `{disallowed}` environment variable \ + is not supported in the `[env]` configuration table" + )) + .run(); + } } #[cargo_test]