@@ -69,18 +69,13 @@ pub fn get_linker(sess: &Session, linker: &Path, flavor: LinkerFlavor) -> (PathB
69
69
// This worked historically but is needed manually since #42436 (regression
70
70
// was tagged as #42791) and some more info can be found on #44443 for
71
71
// emscripten itself.
72
- let mut cmd = ( || {
73
- if let Some ( linker) = linker. to_str ( ) {
74
- if cfg ! ( windows) && linker. ends_with ( ".bat" ) {
75
- return Command :: bat_script ( linker)
76
- }
77
- }
78
- match flavor {
72
+ let mut cmd = match linker. to_str ( ) {
73
+ Some ( linker) if cfg ! ( windows) && linker. ends_with ( ".bat" ) => Command :: bat_script ( linker) ,
74
+ _ => match flavor {
79
75
LinkerFlavor :: Lld ( f) => Command :: lld ( linker, f) ,
80
76
_ => Command :: new ( linker) ,
81
-
82
77
}
83
- } ) ( ) ;
78
+ } ;
84
79
85
80
let msvc_tool = windows_registry:: find_tool ( & sess. opts . target_triple . triple ( ) , "link.exe" ) ;
86
81
@@ -600,33 +595,26 @@ fn print_native_static_libs(sess: &Session, all_native_libs: &[NativeLibrary]) {
600
595
}
601
596
}
602
597
603
- pub fn linker_and_flavor ( sess : & Session ) -> Result < ( PathBuf , LinkerFlavor ) , ( ) > {
604
- fn from < F > (
598
+ pub fn linker_and_flavor ( sess : & Session ) -> ( PathBuf , LinkerFlavor ) {
599
+ fn infer_from (
605
600
sess : & Session ,
606
601
linker : Option < PathBuf > ,
607
602
flavor : Option < LinkerFlavor > ,
608
- otherwise : F ,
609
- ) -> Result < ( PathBuf , LinkerFlavor ) , ( ) >
610
- where
611
- F : FnOnce ( ) -> Result < ( PathBuf , LinkerFlavor ) , ( ) >
612
- {
603
+ ) -> Option < ( PathBuf , LinkerFlavor ) > {
613
604
match ( linker, flavor) {
614
- ( Some ( linker) , Some ( flavor) ) => Ok ( ( linker, flavor) ) ,
605
+ ( Some ( linker) , Some ( flavor) ) => Some ( ( linker, flavor) ) ,
615
606
// only the linker flavor is known; use the default linker for the selected flavor
616
- ( None , Some ( flavor) ) => Ok ( ( PathBuf :: from ( match flavor {
617
- LinkerFlavor :: Em => "emcc" ,
607
+ ( None , Some ( flavor) ) => Some ( ( PathBuf :: from ( match flavor {
608
+ LinkerFlavor :: Em => if cfg ! ( windows ) { "emcc.bat" } else { "emcc" } ,
618
609
LinkerFlavor :: Gcc => "gcc" ,
619
610
LinkerFlavor :: Ld => "ld" ,
620
611
LinkerFlavor :: Msvc => "link.exe" ,
621
612
LinkerFlavor :: Lld ( _) => "lld" ,
622
613
} ) , flavor) ) ,
623
- // infer the linker flavor from the linker name
624
614
( Some ( linker) , None ) => {
625
- let stem = linker. file_stem ( ) . and_then ( |stem| stem. to_str ( ) ) . ok_or_else ( || {
626
- sess
627
- . struct_err ( & format ! ( "couldn't extract file stem from specified linker" ) )
628
- . emit ( ) ;
629
- } ) ?. to_owned ( ) ;
615
+ let stem = linker. file_stem ( ) . and_then ( |stem| stem. to_str ( ) ) . unwrap_or_else ( || {
616
+ sess. fatal ( "couldn't extract file stem from specified linker" ) ;
617
+ } ) . to_owned ( ) ;
630
618
631
619
let flavor = if stem == "emcc" {
632
620
LinkerFlavor :: Em
@@ -637,32 +625,35 @@ pub fn linker_and_flavor(sess: &Session) -> Result<(PathBuf, LinkerFlavor), ()>
637
625
} else if stem == "link" || stem == "lld-link" {
638
626
LinkerFlavor :: Msvc
639
627
} else {
640
- sess
641
- . struct_err ( & format ! ( "couldn't infer linker flavor from specified linker" ) )
642
- . emit ( ) ;
643
- return Err ( ( ) ) ;
628
+ // fall back to the value in the target spec
629
+ sess. target . target . linker_flavor
644
630
} ;
645
631
646
- Ok ( ( linker, flavor) )
632
+ Some ( ( linker, flavor) )
647
633
} ,
648
- ( None , None ) => otherwise ( ) ,
634
+ ( None , None ) => None ,
649
635
}
650
636
}
651
637
652
638
// linker and linker flavor specified via command line have precedence over what the target
653
639
// specification specifies
654
- from ( sess, sess. opts . cg . linker . clone ( ) , sess. opts . debugging_opts . linker_flavor , || {
655
- from (
656
- sess,
657
- sess. target . target . options . linker . clone ( ) . map ( PathBuf :: from) ,
658
- Some ( sess. target . target . linker_flavor ) ,
659
- || {
660
- sess
661
- . struct_err ( & format ! ( "no linker or linker flavor information provided" ) )
662
- . emit ( ) ;
663
- Err ( ( ) )
664
- } )
665
- } )
640
+ if let Some ( ret) = infer_from (
641
+ sess,
642
+ sess. opts . cg . linker . clone ( ) ,
643
+ sess. opts . debugging_opts . linker_flavor ,
644
+ ) {
645
+ return ret;
646
+ }
647
+
648
+ if let Some ( ret) = infer_from (
649
+ sess,
650
+ sess. target . target . options . linker . clone ( ) . map ( PathBuf :: from) ,
651
+ Some ( sess. target . target . linker_flavor ) ,
652
+ ) {
653
+ return ret;
654
+ }
655
+
656
+ sess. fatal ( "Not enough information provided to determine how to invoke the linker" ) ;
666
657
}
667
658
668
659
// Create a dynamic library or executable
@@ -675,12 +666,7 @@ fn link_natively(sess: &Session,
675
666
codegen_results : & CodegenResults ,
676
667
tmpdir : & Path ) {
677
668
info ! ( "preparing {:?} to {:?}" , crate_type, out_filename) ;
678
- let ( linker, flavor) = if let Ok ( ( linker, flavor) ) = linker_and_flavor ( sess) {
679
- ( linker, flavor)
680
- } else {
681
- sess. abort_if_errors ( ) ;
682
- return ;
683
- } ;
669
+ let ( linker, flavor) = linker_and_flavor ( sess) ;
684
670
685
671
// The invocations of cc share some flags across platforms
686
672
let ( pname, mut cmd) = get_linker ( sess, & linker, flavor) ;
0 commit comments