Skip to content

Commit

Permalink
Ship MinGW-w64 runtime DLLs along with rust-lld.exe for `-pc-window…
Browse files Browse the repository at this point in the history
…s-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 rust-lang#125809
  • Loading branch information
ColinFinck committed Aug 13, 2024
1 parent 80eb5a8 commit 71d98a8
Showing 1 changed file with 24 additions and 13 deletions.
37 changes: 24 additions & 13 deletions src/bootstrap/src/core/build_steps/dist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -268,34 +268,45 @@ fn make_win_dist(
let target_libs = find_files(&target_libs, &lib_path);

// Copy runtime dlls next to rustc.exe
let dist_bin_dir = rust_root.join("bin/");
fs::create_dir_all(&dist_bin_dir).expect("creating dist_bin_dir failed");
for src in rustc_dlls {
builder.copy_link_to_folder(&src, &dist_bin_dir);
let rust_bin_dir = rust_root.join("bin/");
fs::create_dir_all(&rust_bin_dir).expect("creating rust_bin_dir failed");
for src in &rustc_dlls {
builder.copy_link_to_folder(src, &rust_bin_dir);
}

if builder.config.lld_enabled {
// rust-lld.exe also needs runtime dlls
let rust_target_bin_dir = rust_root.join("lib/rustlib").join(target).join("bin");
fs::create_dir_all(&rust_target_bin_dir).expect("creating rust_target_bin_dir failed");
for src in &rustc_dlls {
builder.copy_link_to_folder(src, &rust_target_bin_dir);
}
}

//Copy platform tools to platform-specific bin directory
let target_bin_dir =
plat_root.join("lib").join("rustlib").join(target).join("bin").join("self-contained");
fs::create_dir_all(&target_bin_dir).expect("creating target_bin_dir failed");
let plat_target_bin_self_contained_dir =
plat_root.join("lib/rustlib").join(target).join("bin/self-contained");
fs::create_dir_all(&plat_target_bin_self_contained_dir)
.expect("creating plat_target_bin_self_contained_dir failed");
for src in target_tools {
builder.copy_link_to_folder(&src, &target_bin_dir);
builder.copy_link_to_folder(&src, &plat_target_bin_self_contained_dir);
}

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

//Copy platform libs to platform-specific lib directory
let target_lib_dir =
plat_root.join("lib").join("rustlib").join(target).join("lib").join("self-contained");
fs::create_dir_all(&target_lib_dir).expect("creating target_lib_dir failed");
let plat_target_lib_self_contained_dir =
plat_root.join("lib/rustlib").join(target).join("lib/self-contained");
fs::create_dir_all(&plat_target_lib_self_contained_dir)
.expect("creating plat_target_lib_self_contained_dir failed");
for src in target_libs {
builder.copy_link_to_folder(&src, &target_lib_dir);
builder.copy_link_to_folder(&src, &plat_target_lib_self_contained_dir);
}
}

Expand Down

0 comments on commit 71d98a8

Please sign in to comment.