Skip to content

Commit a29b75a

Browse files
committedAug 13, 2024
Ship MinGW-w64 runtime DLLs along with rust-lld.exe for -pc-windows-gnu targets
`rust-lld.exe` built for `x86_64-pc-windows-gnu` depends on `libgcc_s_seh-1.dll` and `libwinpthread-1.dll` from MinGW-w64. Until now, they were not shipped alongside `rust-lld.exe`, and you could not run `rust-lld.exe` on most systems. This problem didn't surface until now because: * Most targets don't use `rust-lld` by default. * Some people had these DLLs in their `PATH` from some other MinGW binary. * `rustup` used to add `bin` to the `PATH`, which contains these DLLs for `rustc.exe`. But it no longer does that: rust-lang/rustup@ce3c09a Fixes #125809
1 parent 80eb5a8 commit a29b75a

File tree

1 file changed

+29
-14
lines changed
  • src/bootstrap/src/core/build_steps

1 file changed

+29
-14
lines changed
 

‎src/bootstrap/src/core/build_steps/dist.rs

+29-14
Original file line numberDiff line numberDiff line change
@@ -268,34 +268,45 @@ fn make_win_dist(
268268
let target_libs = find_files(&target_libs, &lib_path);
269269

270270
// Copy runtime dlls next to rustc.exe
271-
let dist_bin_dir = rust_root.join("bin/");
272-
fs::create_dir_all(&dist_bin_dir).expect("creating dist_bin_dir failed");
273-
for src in rustc_dlls {
274-
builder.copy_link_to_folder(&src, &dist_bin_dir);
271+
let rust_bin_dir = rust_root.join("bin/");
272+
fs::create_dir_all(&rust_bin_dir).expect("creating rust_bin_dir failed");
273+
for src in &rustc_dlls {
274+
builder.copy_link_to_folder(src, &rust_bin_dir);
275+
}
276+
277+
if builder.config.lld_enabled {
278+
// rust-lld.exe also needs runtime dlls
279+
let rust_target_bin_dir = rust_root.join("lib/rustlib").join(target).join("bin");
280+
fs::create_dir_all(&rust_target_bin_dir).expect("creating rust_target_bin_dir failed");
281+
for src in &rustc_dlls {
282+
builder.copy_link_to_folder(src, &rust_target_bin_dir);
283+
}
275284
}
276285

277286
//Copy platform tools to platform-specific bin directory
278-
let target_bin_dir =
279-
plat_root.join("lib").join("rustlib").join(target).join("bin").join("self-contained");
280-
fs::create_dir_all(&target_bin_dir).expect("creating target_bin_dir failed");
287+
let plat_target_bin_self_contained_dir =
288+
plat_root.join("lib/rustlib").join(target).join("bin/self-contained");
289+
fs::create_dir_all(&plat_target_bin_self_contained_dir)
290+
.expect("creating plat_target_bin_self_contained_dir failed");
281291
for src in target_tools {
282-
builder.copy_link_to_folder(&src, &target_bin_dir);
292+
builder.copy_link_to_folder(&src, &plat_target_bin_self_contained_dir);
283293
}
284294

285295
// Warn windows-gnu users that the bundled GCC cannot compile C files
286296
builder.create(
287-
&target_bin_dir.join("GCC-WARNING.txt"),
297+
&plat_target_bin_self_contained_dir.join("GCC-WARNING.txt"),
288298
"gcc.exe contained in this folder cannot be used for compiling C files - it is only \
289299
used as a linker. In order to be able to compile projects containing C code use \
290300
the GCC provided by MinGW or Cygwin.",
291301
);
292302

293303
//Copy platform libs to platform-specific lib directory
294-
let target_lib_dir =
295-
plat_root.join("lib").join("rustlib").join(target).join("lib").join("self-contained");
296-
fs::create_dir_all(&target_lib_dir).expect("creating target_lib_dir failed");
304+
let plat_target_lib_self_contained_dir =
305+
plat_root.join("lib/rustlib").join(target).join("lib/self-contained");
306+
fs::create_dir_all(&plat_target_lib_self_contained_dir)
307+
.expect("creating plat_target_lib_self_contained_dir failed");
297308
for src in target_libs {
298-
builder.copy_link_to_folder(&src, &target_lib_dir);
309+
builder.copy_link_to_folder(&src, &plat_target_lib_self_contained_dir);
299310
}
300311
}
301312

@@ -2430,6 +2441,10 @@ impl Step for ReproducibleArtifacts {
24302441
tarball.add_file(profile, ".", 0o644);
24312442
added_anything = true;
24322443
}
2433-
if added_anything { Some(tarball.generate()) } else { None }
2444+
if added_anything {
2445+
Some(tarball.generate())
2446+
} else {
2447+
None
2448+
}
24342449
}
24352450
}

0 commit comments

Comments
 (0)