rustc_session: Add a helper function for obtaining staticlib prefix and suffix

This commit is contained in:
Vadim Petrochenkov 2025-03-25 00:00:10 +03:00
parent 27e95f95e6
commit 7c55782e0c
5 changed files with 24 additions and 24 deletions

View file

@ -1494,11 +1494,7 @@ fn print_native_static_libs(
| NativeLibKind::Unspecified => {
let verbatim = lib.verbatim;
if sess.target.is_like_msvc {
let (prefix, suffix) = if verbatim {
("", "")
} else {
(&*sess.target.staticlib_prefix, &*sess.target.staticlib_suffix)
};
let (prefix, suffix) = sess.staticlib_components(verbatim);
Some(format!("{prefix}{name}{suffix}"))
} else if sess.target.linker_flavor.is_gnu() {
Some(format!("-l{}{}", if verbatim { ":" } else { "" }, name))

View file

@ -450,9 +450,10 @@ impl<'a> GccLinker<'a> {
// The output filename already contains `dll_suffix` so
// the resulting import library will have a name in the
// form of libfoo.dll.a
let mut implib_name = OsString::from(&*self.sess.target.staticlib_prefix);
let (prefix, suffix) = self.sess.staticlib_components(false);
let mut implib_name = OsString::from(prefix);
implib_name.push(name);
implib_name.push(&*self.sess.target.staticlib_suffix);
implib_name.push(suffix);
let mut out_implib = OsString::from("--out-implib=");
out_implib.push(out_filename.with_file_name(implib_name));
self.link_arg(out_implib);
@ -959,11 +960,7 @@ impl<'a> Linker for MsvcLinker<'a> {
self.link_staticlib_by_path(&path, whole_archive);
} else {
let opts = if whole_archive { "/WHOLEARCHIVE:" } else { "" };
let (prefix, suffix) = if verbatim {
("", "")
} else {
(&*self.sess.target.staticlib_prefix, &*self.sess.target.staticlib_suffix)
};
let (prefix, suffix) = self.sess.staticlib_components(verbatim);
self.link_arg(format!("{opts}{prefix}{name}{suffix}"));
}
}

View file

@ -95,14 +95,14 @@ pub fn try_find_native_static_library(
name: &str,
verbatim: bool,
) -> Option<PathBuf> {
let default = sess.staticlib_components(verbatim);
let formats = if verbatim {
vec![("".into(), "".into())]
vec![default]
} else {
let os = (sess.target.staticlib_prefix.clone(), sess.target.staticlib_suffix.clone());
// On Windows, static libraries sometimes show up as libfoo.a and other
// times show up as foo.lib
let unix = ("lib".into(), ".a".into());
if os == unix { vec![os] } else { vec![os, unix] }
let unix = ("lib", ".a");
if default == unix { vec![default] } else { vec![default, unix] }
};
walk_native_lib_search_dirs(sess, None, |dir, is_framework| {
@ -124,18 +124,17 @@ pub fn try_find_native_dynamic_library(
name: &str,
verbatim: bool,
) -> Option<PathBuf> {
let default = sess.staticlib_components(verbatim);
let formats = if verbatim {
vec![("".into(), "".into())]
vec![default]
} else {
// While the official naming convention for MSVC import libraries
// is foo.lib...
let os = (sess.target.staticlib_prefix.clone(), sess.target.staticlib_suffix.clone());
// ... Meson follows the libfoo.dll.a convention to
// is foo.lib, Meson follows the libfoo.dll.a convention to
// disambiguate .a for static libraries
let meson = ("lib".into(), ".dll.a".into());
let meson = ("lib", ".dll.a");
// and MinGW uses .a altogether
let mingw = ("lib".into(), ".a".into());
vec![os, meson, mingw]
let mingw = ("lib", ".a");
vec![default, meson, mingw]
};
walk_native_lib_search_dirs(sess, None, |dir, is_framework| {

View file

@ -103,7 +103,7 @@ pub fn filename_for_input(
OutFileName::Real(outputs.out_directory.join(&format!("{prefix}{libname}{suffix}")))
}
CrateType::Staticlib => {
let (prefix, suffix) = (&sess.target.staticlib_prefix, &sess.target.staticlib_suffix);
let (prefix, suffix) = sess.staticlib_components(false);
OutFileName::Real(outputs.out_directory.join(&format!("{prefix}{libname}{suffix}")))
}
CrateType::Executable => {

View file

@ -586,6 +586,14 @@ impl Session {
.or(self.target.options.default_visibility)
.unwrap_or(SymbolVisibility::Interposable)
}
pub fn staticlib_components(&self, verbatim: bool) -> (&str, &str) {
if verbatim {
("", "")
} else {
(&*self.target.staticlib_prefix, &*self.target.staticlib_suffix)
}
}
}
// JUSTIFICATION: defn of the suggested wrapper fns