Skip to content

Commit 44e96dc

Browse files
committed
Fix --meson-paths for import libs under MinGW
Ensure import libraries under MinGW are named `libfoo.dll.a` when using `--meson-paths`.
1 parent c4e6c08 commit 44e96dc

File tree

3 files changed

+27
-18
lines changed

3 files changed

+27
-18
lines changed

src/build.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ fn write_def_file<W: std::io::Write>(
174174
/// Build import library for windows-gnu
175175
fn build_implib_file(
176176
ws: &Workspace,
177+
build_targets: &BuildTargets,
177178
name: &str,
178179
target: &target::Target,
179180
targetdir: &Path,
@@ -201,10 +202,7 @@ fn build_implib_file(
201202
}
202203
};
203204

204-
let lib_path = match flavor {
205-
Flavor::Msvc => targetdir.join(format!("{name}.dll.lib")),
206-
Flavor::Gnu => targetdir.join(format!("{name}.dll.a")),
207-
};
205+
let lib_path = build_targets.impl_lib.as_ref().unwrap();
208206

209207
let lib_file = cargo_util::paths::create(lib_path)?;
210208
write_implib(lib_file, machine_type, flavor, &def_contents)?;
@@ -1200,7 +1198,7 @@ pub fn cbuild(
12001198
if !library_types.only_staticlib() && capi_config.library.import_library {
12011199
let lib_name = name;
12021200
build_def_file(ws, lib_name, &rustc_target, &root_output)?;
1203-
build_implib_file(ws, lib_name, &rustc_target, &root_output)?;
1201+
build_implib_file(ws, build_targets, lib_name, &rustc_target, &root_output)?;
12041202
}
12051203

12061204
if capi_config.header.enabled {

src/build_targets.rs

+23-8
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ impl BuildTargets {
7474
None
7575
};
7676

77-
let Some(file_names) = FileNames::from_target(target, name, targetdir) else {
77+
let Some(file_names) =
78+
FileNames::from_target(target, name, targetdir, use_meson_naming_convention)
79+
else {
7880
return Err(anyhow::anyhow!(
7981
"The target {}-{} is not supported yet",
8082
target.os,
@@ -145,7 +147,12 @@ struct FileNames {
145147
}
146148

147149
impl FileNames {
148-
fn from_target(target: &Target, lib_name: &str, targetdir: &Path) -> Option<Self> {
150+
fn from_target(
151+
target: &Target,
152+
lib_name: &str,
153+
targetdir: &Path,
154+
use_meson_naming_convention: bool,
155+
) -> Option<Self> {
149156
let (shared_lib, static_lib, impl_lib, debug_info, def) = match target.os.as_str() {
150157
"none" | "linux" | "freebsd" | "dragonfly" | "netbsd" | "android" | "haiku"
151158
| "illumos" | "openbsd" | "emscripten" | "hurd" => {
@@ -164,13 +171,19 @@ impl FileNames {
164171

165172
if target.env == "msvc" {
166173
let static_lib = targetdir.join(format!("{lib_name}.lib"));
167-
let impl_lib = targetdir.join(format!("{lib_name}.dll.lib"));
174+
let impl_lib = match use_meson_naming_convention {
175+
false => targetdir.join(format!("{lib_name}.dll.lib")),
176+
true => targetdir.join(format!("{lib_name}.lib")),
177+
};
168178
let pdb = Some(targetdir.join(format!("{lib_name}.pdb")));
169179

170180
(shared_lib, static_lib, Some(impl_lib), pdb, Some(def))
171181
} else {
172182
let static_lib = targetdir.join(format!("lib{lib_name}.a"));
173-
let impl_lib = targetdir.join(format!("{lib_name}.dll.a"));
183+
let impl_lib = match use_meson_naming_convention {
184+
false => targetdir.join(format!("{lib_name}.dll.a")),
185+
true => targetdir.join(format!("lib{lib_name}.dll.a")),
186+
};
174187
let pdb = None;
175188

176189
(shared_lib, static_lib, Some(impl_lib), pdb, Some(def))
@@ -215,7 +228,8 @@ mod test {
215228
os: os.to_string(),
216229
env: String::from(""),
217230
};
218-
let file_names = FileNames::from_target(&target, "ferris", Path::new("/foo/bar"));
231+
let file_names =
232+
FileNames::from_target(&target, "ferris", Path::new("/foo/bar"), false);
219233

220234
let expected = FileNames {
221235
static_lib: PathBuf::from("/foo/bar/libferris.a"),
@@ -238,7 +252,8 @@ mod test {
238252
os: os.to_string(),
239253
env: String::from(""),
240254
};
241-
let file_names = FileNames::from_target(&target, "ferris", Path::new("/foo/bar"));
255+
let file_names =
256+
FileNames::from_target(&target, "ferris", Path::new("/foo/bar"), false);
242257

243258
let expected = FileNames {
244259
static_lib: PathBuf::from("/foo/bar/libferris.a"),
@@ -260,7 +275,7 @@ mod test {
260275
os: String::from("windows"),
261276
env: String::from("msvc"),
262277
};
263-
let file_names = FileNames::from_target(&target, "ferris", Path::new("/foo/bar"));
278+
let file_names = FileNames::from_target(&target, "ferris", Path::new("/foo/bar"), false);
264279

265280
let expected = FileNames {
266281
static_lib: PathBuf::from("/foo/bar/ferris.lib"),
@@ -281,7 +296,7 @@ mod test {
281296
os: String::from("windows"),
282297
env: String::from("gnu"),
283298
};
284-
let file_names = FileNames::from_target(&target, "ferris", Path::new("/foo/bar"));
299+
let file_names = FileNames::from_target(&target, "ferris", Path::new("/foo/bar"), false);
285300

286301
let expected = FileNames {
287302
static_lib: PathBuf::from("/foo/bar/libferris.a"),

src/install.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -270,11 +270,7 @@ pub fn cinstall(ws: &Workspace, packages: &[CPackage]) -> anyhow::Result<()> {
270270
}
271271
if capi_config.library.import_library {
272272
let impl_lib = build_targets.impl_lib.as_ref().unwrap();
273-
let impl_lib_name = if build_targets.use_meson_naming_convention {
274-
format!("{}.lib", build_targets.name).into()
275-
} else {
276-
impl_lib.file_name().unwrap().to_owned()
277-
};
273+
let impl_lib_name = impl_lib.file_name().unwrap();
278274
copy(ws, impl_lib, install_path_lib.join(impl_lib_name))?;
279275
let def = build_targets.def.as_ref().unwrap();
280276
let def_name = def.file_name().unwrap();

0 commit comments

Comments
 (0)