Skip to content

Commit 7f116c7

Browse files
committed
Auto merge of #128876 - ColinFinck:rust-lld-with-runtime-dlls, r=<try>
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 try-job: dist-x86_64-mingw
2 parents 4d5b3b1 + 71d98a8 commit 7f116c7

File tree

1 file changed

+24
-13
lines changed
  • src/bootstrap/src/core/build_steps

1 file changed

+24
-13
lines changed

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

+24-13
Original file line numberDiff line numberDiff line change
@@ -269,34 +269,45 @@ fn make_win_dist(
269269
let target_libs = find_files(&target_libs, &lib_path);
270270

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

278287
//Copy platform tools to platform-specific bin directory
279-
let target_bin_dir =
280-
plat_root.join("lib").join("rustlib").join(target).join("bin").join("self-contained");
281-
fs::create_dir_all(&target_bin_dir).expect("creating target_bin_dir failed");
288+
let plat_target_bin_self_contained_dir =
289+
plat_root.join("lib/rustlib").join(target).join("bin/self-contained");
290+
fs::create_dir_all(&plat_target_bin_self_contained_dir)
291+
.expect("creating plat_target_bin_self_contained_dir failed");
282292
for src in target_tools {
283-
builder.copy_link_to_folder(&src, &target_bin_dir);
293+
builder.copy_link_to_folder(&src, &plat_target_bin_self_contained_dir);
284294
}
285295

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

294304
//Copy platform libs to platform-specific lib directory
295-
let target_lib_dir =
296-
plat_root.join("lib").join("rustlib").join(target).join("lib").join("self-contained");
297-
fs::create_dir_all(&target_lib_dir).expect("creating target_lib_dir failed");
305+
let plat_target_lib_self_contained_dir =
306+
plat_root.join("lib/rustlib").join(target).join("lib/self-contained");
307+
fs::create_dir_all(&plat_target_lib_self_contained_dir)
308+
.expect("creating plat_target_lib_self_contained_dir failed");
298309
for src in target_libs {
299-
builder.copy_link_to_folder(&src, &target_lib_dir);
310+
builder.copy_link_to_folder(&src, &plat_target_lib_self_contained_dir);
300311
}
301312
}
302313

0 commit comments

Comments
 (0)