@@ -174,36 +174,12 @@ fn find_files(files: &[&str], path: &[PathBuf]) -> Vec<PathBuf> {
174174 found
175175}
176176
177- fn make_win_dist (
178- rust_root : & Path ,
179- plat_root : & Path ,
180- target : TargetSelection ,
181- builder : & Builder < ' _ > ,
182- ) {
177+ fn make_win_dist ( plat_root : & Path , target : TargetSelection , builder : & Builder < ' _ > ) {
183178 if builder. config . dry_run ( ) {
184179 return ;
185180 }
186181
187- //Ask gcc where it keeps its stuff
188- let mut cmd = command ( builder. cc ( target) ) ;
189- cmd. arg ( "-print-search-dirs" ) ;
190- let gcc_out = cmd. run_capture_stdout ( builder) . stdout ( ) ;
191-
192- let mut bin_path: Vec < _ > = env:: split_paths ( & env:: var_os ( "PATH" ) . unwrap_or_default ( ) ) . collect ( ) ;
193- let mut lib_path = Vec :: new ( ) ;
194-
195- for line in gcc_out. lines ( ) {
196- let idx = line. find ( ':' ) . unwrap ( ) ;
197- let key = & line[ ..idx] ;
198- let trim_chars: & [ _ ] = & [ ' ' , '=' ] ;
199- let value = env:: split_paths ( line[ ( idx + 1 ) ..] . trim_start_matches ( trim_chars) ) ;
200-
201- if key == "programs" {
202- bin_path. extend ( value) ;
203- } else if key == "libraries" {
204- lib_path. extend ( value) ;
205- }
206- }
182+ let ( bin_path, lib_path) = get_cc_search_dirs ( target, builder) ;
207183
208184 let compiler = if target == "i686-pc-windows-gnu" {
209185 "i686-w64-mingw32-gcc.exe"
@@ -213,12 +189,6 @@ fn make_win_dist(
213189 "gcc.exe"
214190 } ;
215191 let target_tools = [ compiler, "ld.exe" , "dlltool.exe" , "libwinpthread-1.dll" ] ;
216- let mut rustc_dlls = vec ! [ "libwinpthread-1.dll" ] ;
217- if target. starts_with ( "i686-" ) {
218- rustc_dlls. push ( "libgcc_s_dw2-1.dll" ) ;
219- } else {
220- rustc_dlls. push ( "libgcc_s_seh-1.dll" ) ;
221- }
222192
223193 // Libraries necessary to link the windows-gnu toolchains.
224194 // System libraries will be preferred if they are available (see #67429).
@@ -274,25 +244,8 @@ fn make_win_dist(
274244
275245 //Find mingw artifacts we want to bundle
276246 let target_tools = find_files ( & target_tools, & bin_path) ;
277- let rustc_dlls = find_files ( & rustc_dlls, & bin_path) ;
278247 let target_libs = find_files ( & target_libs, & lib_path) ;
279248
280- // Copy runtime dlls next to rustc.exe
281- let rust_bin_dir = rust_root. join ( "bin/" ) ;
282- fs:: create_dir_all ( & rust_bin_dir) . expect ( "creating rust_bin_dir failed" ) ;
283- for src in & rustc_dlls {
284- builder. copy_link_to_folder ( src, & rust_bin_dir) ;
285- }
286-
287- if builder. config . lld_enabled {
288- // rust-lld.exe also needs runtime dlls
289- let rust_target_bin_dir = rust_root. join ( "lib/rustlib" ) . join ( target) . join ( "bin" ) ;
290- fs:: create_dir_all ( & rust_target_bin_dir) . expect ( "creating rust_target_bin_dir failed" ) ;
291- for src in & rustc_dlls {
292- builder. copy_link_to_folder ( src, & rust_target_bin_dir) ;
293- }
294- }
295-
296249 //Copy platform tools to platform-specific bin directory
297250 let plat_target_bin_self_contained_dir =
298251 plat_root. join ( "lib/rustlib" ) . join ( target) . join ( "bin/self-contained" ) ;
@@ -320,6 +273,82 @@ fn make_win_dist(
320273 }
321274}
322275
276+ fn runtime_dll_dist ( rust_root : & Path , target : TargetSelection , builder : & Builder < ' _ > ) {
277+ if builder. config . dry_run ( ) {
278+ return ;
279+ }
280+
281+ let ( bin_path, libs_path) = get_cc_search_dirs ( target, builder) ;
282+
283+ let mut rustc_dlls = vec ! [ ] ;
284+ // windows-gnu and windows-gnullvm require different runtime libs
285+ if target. ends_with ( "windows-gnu" ) {
286+ rustc_dlls. push ( "libwinpthread-1.dll" ) ;
287+ if target. starts_with ( "i686-" ) {
288+ rustc_dlls. push ( "libgcc_s_dw2-1.dll" ) ;
289+ } else {
290+ rustc_dlls. push ( "libgcc_s_seh-1.dll" ) ;
291+ }
292+ } else if target. ends_with ( "windows-gnullvm" ) {
293+ rustc_dlls. push ( "libunwind.dll" ) ;
294+ } else {
295+ panic ! ( "Vendoring of runtime DLLs for `{target}` is not supported`" ) ;
296+ }
297+ // FIXME(#144656): Remove this whole `let ...`
298+ let bin_path = if target. ends_with ( "windows-gnullvm" ) && builder. host_target != target {
299+ bin_path
300+ . into_iter ( )
301+ . chain ( libs_path. iter ( ) . map ( |path| path. with_file_name ( "bin" ) ) )
302+ . collect ( )
303+ } else {
304+ bin_path
305+ } ;
306+ let rustc_dlls = find_files ( & rustc_dlls, & bin_path) ;
307+
308+ // Copy runtime dlls next to rustc.exe
309+ let rust_bin_dir = rust_root. join ( "bin/" ) ;
310+ fs:: create_dir_all ( & rust_bin_dir) . expect ( "creating rust_bin_dir failed" ) ;
311+ for src in & rustc_dlls {
312+ builder. copy_link_to_folder ( src, & rust_bin_dir) ;
313+ }
314+
315+ if builder. config . lld_enabled {
316+ // rust-lld.exe also needs runtime dlls
317+ let rust_target_bin_dir = rust_root. join ( "lib/rustlib" ) . join ( target) . join ( "bin" ) ;
318+ fs:: create_dir_all ( & rust_target_bin_dir) . expect ( "creating rust_target_bin_dir failed" ) ;
319+ for src in & rustc_dlls {
320+ builder. copy_link_to_folder ( src, & rust_target_bin_dir) ;
321+ }
322+ }
323+ }
324+
325+ fn get_cc_search_dirs (
326+ target : TargetSelection ,
327+ builder : & Builder < ' _ > ,
328+ ) -> ( Vec < PathBuf > , Vec < PathBuf > ) {
329+ //Ask gcc where it keeps its stuff
330+ let mut cmd = command ( builder. cc ( target) ) ;
331+ cmd. arg ( "-print-search-dirs" ) ;
332+ let gcc_out = cmd. run_capture_stdout ( builder) . stdout ( ) ;
333+
334+ let mut bin_path: Vec < _ > = env:: split_paths ( & env:: var_os ( "PATH" ) . unwrap_or_default ( ) ) . collect ( ) ;
335+ let mut lib_path = Vec :: new ( ) ;
336+
337+ for line in gcc_out. lines ( ) {
338+ let idx = line. find ( ':' ) . unwrap ( ) ;
339+ let key = & line[ ..idx] ;
340+ let trim_chars: & [ _ ] = & [ ' ' , '=' ] ;
341+ let value = env:: split_paths ( line[ ( idx + 1 ) ..] . trim_start_matches ( trim_chars) ) ;
342+
343+ if key == "programs" {
344+ bin_path. extend ( value) ;
345+ } else if key == "libraries" {
346+ lib_path. extend ( value) ;
347+ }
348+ }
349+ ( bin_path, lib_path)
350+ }
351+
323352#[ derive( Debug , PartialOrd , Ord , Clone , Hash , PartialEq , Eq ) ]
324353pub struct Mingw {
325354 pub host : TargetSelection ,
@@ -350,11 +379,7 @@ impl Step for Mingw {
350379 let mut tarball = Tarball :: new ( builder, "rust-mingw" , & host. triple ) ;
351380 tarball. set_product_name ( "Rust MinGW" ) ;
352381
353- // The first argument is a "temporary directory" which is just
354- // thrown away (this contains the runtime DLLs included in the rustc package
355- // above) and the second argument is where to place all the MinGW components
356- // (which is what we want).
357- make_win_dist ( & tmpdir ( builder) , tarball. image_dir ( ) , host, builder) ;
382+ make_win_dist ( tarball. image_dir ( ) , host, builder) ;
358383
359384 Some ( tarball. generate ( ) )
360385 }
@@ -394,17 +419,14 @@ impl Step for Rustc {
394419 prepare_image ( builder, compiler, tarball. image_dir ( ) ) ;
395420
396421 // On MinGW we've got a few runtime DLL dependencies that we need to
397- // include. The first argument to this script is where to put these DLLs
398- // (the image we're creating), and the second argument is a junk directory
399- // to ignore all other MinGW stuff the script creates.
400- //
422+ // include.
401423 // On 32-bit MinGW we're always including a DLL which needs some extra
402424 // licenses to distribute. On 64-bit MinGW we don't actually distribute
403425 // anything requiring us to distribute a license, but it's likely the
404426 // install will *also* include the rust-mingw package, which also needs
405427 // licenses, so to be safe we just include it here in all MinGW packages.
406- if host. ends_with ( "pc-windows-gnu" ) && builder. config . dist_include_mingw_linker {
407- make_win_dist ( tarball. image_dir ( ) , & tmpdir ( builder ) , host, builder) ;
428+ if host. contains ( "pc-windows-gnu" ) && builder. config . dist_include_mingw_linker {
429+ runtime_dll_dist ( tarball. image_dir ( ) , host, builder) ;
408430 tarball. add_dir ( builder. src . join ( "src/etc/third-party" ) , "share/doc" ) ;
409431 }
410432
0 commit comments