diff options
| author | Wesley Wiser <wwiser@gmail.com> | 2022-10-12 22:52:31 -0400 |
|---|---|---|
| committer | Wesley Wiser <wwiser@gmail.com> | 2022-10-13 07:35:36 -0400 |
| commit | 097b6d3bafb1d61bfe8fd3f5e9d9acfd9ee2c702 (patch) | |
| tree | 6513d8c3204973d3b7e122680e7f62ac0976ba8b /compiler/rustc_metadata/src | |
| parent | 0938e1680daf66ca6aad428aedf9a920a0dab5ad (diff) | |
| download | rust-097b6d3bafb1d61bfe8fd3f5e9d9acfd9ee2c702.tar.gz rust-097b6d3bafb1d61bfe8fd3f5e9d9acfd9ee2c702.zip | |
Add suggestion to the "missing native library" error
If we fail to locate a native library that we are linking with, it could be the case the user entered a complete file name like `foo.lib` or `libfoo.a` when we expect them to simply provide `foo`. In this situation, we now detect that case and suggest the user only provide the library name itself.
Diffstat (limited to 'compiler/rustc_metadata/src')
| -rw-r--r-- | compiler/rustc_metadata/src/errors.rs | 36 | ||||
| -rw-r--r-- | compiler/rustc_metadata/src/native_libs.rs | 2 |
2 files changed, 36 insertions, 2 deletions
diff --git a/compiler/rustc_metadata/src/errors.rs b/compiler/rustc_metadata/src/errors.rs index 1cd550644bf..dbfa22aaff0 100644 --- a/compiler/rustc_metadata/src/errors.rs +++ b/compiler/rustc_metadata/src/errors.rs @@ -372,7 +372,41 @@ pub struct FailedWriteError { #[derive(Diagnostic)] #[diag(metadata::missing_native_library)] pub struct MissingNativeLibrary<'a> { - pub libname: &'a str, + libname: &'a str, + #[subdiagnostic] + suggest_name: Option<SuggestLibraryName<'a>>, +} + +impl<'a> MissingNativeLibrary<'a> { + pub fn new(libname: &'a str, verbatim: bool) -> Self { + // if it looks like the user has provided a complete filename rather just the bare lib name, + // then provide a note that they might want to try trimming the name + let suggested_name = if !verbatim { + if let Some(libname) = libname.strip_prefix("lib") && let Some(libname) = libname.strip_suffix(".a") { + // this is a unix style filename so trim prefix & suffix + Some(libname) + } else if let Some(libname) = libname.strip_suffix(".lib") { + // this is a Windows style filename so just trim the suffix + Some(libname) + } else { + None + } + } else { + None + }; + + Self { + libname, + suggest_name: suggested_name + .map(|suggested_name| SuggestLibraryName { suggested_name }), + } + } +} + +#[derive(Subdiagnostic)] +#[help(metadata::only_provide_library_name)] +pub struct SuggestLibraryName<'a> { + suggested_name: &'a str, } #[derive(Diagnostic)] diff --git a/compiler/rustc_metadata/src/native_libs.rs b/compiler/rustc_metadata/src/native_libs.rs index 9abb5c74895..676c67bad82 100644 --- a/compiler/rustc_metadata/src/native_libs.rs +++ b/compiler/rustc_metadata/src/native_libs.rs @@ -52,7 +52,7 @@ pub fn find_native_static_library( } } - sess.emit_fatal(MissingNativeLibrary { libname: name }); + sess.emit_fatal(MissingNativeLibrary::new(name, verbatim.unwrap_or(false))); } fn find_bundled_library( |
