@@ -2666,13 +2666,7 @@ impl Build {
26662666 }
26672667
26682668 fn get_ar ( & self ) -> Result < ( Command , String , bool ) , Error > {
2669- let ( cmd, any_flags) = self . try_get_archiver_and_flags ( ) ?;
2670- let name = Path :: new ( cmd. get_program ( ) )
2671- . file_name ( )
2672- . ok_or_else ( || Error :: new ( ErrorKind :: IOError , "Failed to get archiver path." ) ) ?
2673- . to_string_lossy ( )
2674- . into_owned ( ) ;
2675- Ok ( ( cmd, name, any_flags) )
2669+ self . try_get_archiver_and_flags ( )
26762670 }
26772671
26782672 /// Get the archiver (ar) that's in use for this configuration.
@@ -2704,21 +2698,21 @@ impl Build {
27042698 Ok ( self . try_get_archiver_and_flags ( ) ?. 0 )
27052699 }
27062700
2707- fn try_get_archiver_and_flags ( & self ) -> Result < ( Command , bool ) , Error > {
2708- let mut cmd = self . get_base_archiver ( ) ?;
2701+ fn try_get_archiver_and_flags ( & self ) -> Result < ( Command , String , bool ) , Error > {
2702+ let ( mut cmd, name ) = self . get_base_archiver ( ) ?;
27092703 let flags = self . envflags ( "ARFLAGS" ) ;
27102704 let mut any_flags = !flags. is_empty ( ) ;
27112705 cmd. args ( flags) ;
27122706 for flag in & self . ar_flags {
27132707 any_flags = true ;
27142708 cmd. arg ( flag) ;
27152709 }
2716- Ok ( ( cmd, any_flags) )
2710+ Ok ( ( cmd, name , any_flags) )
27172711 }
27182712
2719- fn get_base_archiver ( & self ) -> Result < Command , Error > {
2713+ fn get_base_archiver ( & self ) -> Result < ( Command , String ) , Error > {
27202714 if let Some ( ref a) = self . archiver {
2721- return Ok ( self . cmd ( a) ) ;
2715+ return Ok ( ( self . cmd ( a) , a . to_string_lossy ( ) . into_owned ( ) ) ) ;
27222716 }
27232717
27242718 self . get_base_archiver_variant ( "AR" , "ar" )
@@ -2760,11 +2754,12 @@ impl Build {
27602754 return Ok ( self . cmd ( r) ) ;
27612755 }
27622756
2763- self . get_base_archiver_variant ( "RANLIB" , "ranlib" )
2757+ Ok ( self . get_base_archiver_variant ( "RANLIB" , "ranlib" ) ? . 0 )
27642758 }
27652759
2766- fn get_base_archiver_variant ( & self , env : & str , tool : & str ) -> Result < Command , Error > {
2760+ fn get_base_archiver_variant ( & self , env : & str , tool : & str ) -> Result < ( Command , String ) , Error > {
27672761 let target = self . get_target ( ) ?;
2762+ let mut name = String :: new ( ) ;
27682763 let tool_opt: Option < Command > = self
27692764 . env_tool ( env)
27702765 . map ( |( tool, _wrapper, args) | {
@@ -2777,10 +2772,12 @@ impl Build {
27772772 // Windows use bat files so we have to be a bit more specific
27782773 if cfg ! ( windows) {
27792774 let mut cmd = self . cmd ( "cmd" ) ;
2780- cmd. arg ( "/c" ) . arg ( format ! ( "em{}.bat" , tool) ) ;
2775+ name = format ! ( "em{}.bat" , tool) ;
2776+ cmd. arg ( "/c" ) . arg ( & name) ;
27812777 Some ( cmd)
27822778 } else {
2783- Some ( self . cmd ( format ! ( "em{}" , tool) ) )
2779+ name = format ! ( "em{}" , tool) ;
2780+ Some ( self . cmd ( & name) )
27842781 }
27852782 } else {
27862783 None
@@ -2792,7 +2789,8 @@ impl Build {
27922789 Some ( t) => t,
27932790 None => {
27942791 if target. contains ( "android" ) {
2795- self . cmd ( format ! ( "{}-{}" , target. replace( "armv7" , "arm" ) , tool) )
2792+ name = format ! ( "{}-{}" , target. replace( "armv7" , "arm" ) , tool) ;
2793+ self . cmd ( & name)
27962794 } else if target. contains ( "msvc" ) {
27972795 // NOTE: There isn't really a ranlib on msvc, so arguably we should return
27982796 // `None` somehow here. But in general, callers will already have to be aware
@@ -2817,19 +2815,22 @@ impl Build {
28172815 }
28182816
28192817 if lib. is_empty ( ) {
2818+ name = String :: from ( "lib.exe" ) ;
28202819 match windows_registry:: find ( & target, "lib.exe" ) {
28212820 Some ( t) => t,
28222821 None => self . cmd ( "lib.exe" ) ,
28232822 }
28242823 } else {
2825- self . cmd ( lib)
2824+ name = lib;
2825+ self . cmd ( & name)
28262826 }
28272827 } else if target. contains ( "illumos" ) {
28282828 // The default 'ar' on illumos uses a non-standard flags,
28292829 // but the OS comes bundled with a GNU-compatible variant.
28302830 //
28312831 // Use the GNU-variant to match other Unix systems.
2832- self . cmd ( format ! ( "g{}" , tool) )
2832+ name = format ! ( "g{}" , tool) ;
2833+ self . cmd ( & name)
28332834 } else if self . get_host ( ) ? != target {
28342835 match self . prefix_for_target ( & target) {
28352836 Some ( p) => {
@@ -2848,17 +2849,22 @@ impl Build {
28482849 break ;
28492850 }
28502851 }
2851- self . cmd ( chosen)
2852+ name = chosen;
2853+ self . cmd ( & name)
2854+ }
2855+ None => {
2856+ name = default;
2857+ self . cmd ( & name)
28522858 }
2853- None => self . cmd ( default) ,
28542859 }
28552860 } else {
2856- self . cmd ( default)
2861+ name = default;
2862+ self . cmd ( & name)
28572863 }
28582864 }
28592865 } ;
28602866
2861- Ok ( tool)
2867+ Ok ( ( tool, name ) )
28622868 }
28632869
28642870 fn prefix_for_target ( & self , target : & str ) -> Option < String > {
0 commit comments