diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 5d273295a..ced55770e 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -661,12 +661,34 @@ pub fn create_bcx<'a, 'cfg>( continue; } + let guidance = if ws.is_ephemeral() { + if ws.ignore_lock() { + "Try re-running cargo install with `--locked`".to_string() + } else { + String::new() + } + } else if !unit.is_local() { + format!( + "Either upgrade to rustc {} or newer, or use\n\ + cargo update -p {}@{} --precise ver\n\ + where `ver` is the latest version of `{}` supporting rustc {}", + version, + unit.pkg.name(), + unit.pkg.version(), + unit.pkg.name(), + current_version, + ) + } else { + String::new() + }; + anyhow::bail!( "package `{}` cannot be built because it requires rustc {} or newer, \ - while the currently active rustc version is {}", + while the currently active rustc version is {}\n{}", unit.pkg, version, current_version, + guidance, ); } } diff --git a/tests/testsuite/rust_version.rs b/tests/testsuite/rust_version.rs index 6f849141f..68d54190c 100644 --- a/tests/testsuite/rust_version.rs +++ b/tests/testsuite/rust_version.rs @@ -124,7 +124,7 @@ fn rust_version_too_high() { .with_status(101) .with_stderr( "error: package `foo v0.0.1 ([..])` cannot be built because it requires \ - rustc 1.9876.0 or newer, while the currently active rustc version is [..]", + rustc 1.9876.0 or newer, while the currently active rustc version is [..]\n\n", ) .run(); p.cargo("build --ignore-rust-version").run(); @@ -159,7 +159,10 @@ fn rust_version_dependency_fails() { Downloading crates ...\n \ Downloaded bar v0.0.1 (registry `[..]`)\n\ error: package `bar v0.0.1` cannot be built because it requires \ - rustc 1.2345.0 or newer, while the currently active rustc version is [..]", + rustc 1.2345.0 or newer, while the currently active rustc version is [..]\n\ + Either upgrade to rustc 1.2345.0 or newer, or use\n\ + cargo update -p bar@0.0.1 --precise ver\n\ + where `ver` is the latest version of `bar` supporting rustc [..]", ) .run(); p.cargo("build --ignore-rust-version").run();