@@ -684,33 +684,44 @@ pub(crate) const HOST_TARGET: &str =
684
684
fn rust_to_clang_target ( rust_target : & str ) -> Box < str > {
685
685
const TRIPLE_HYPHENS_MESSAGE : & str = "Target triple should contain hyphens" ;
686
686
687
- let mut clang_target = rust_target. to_owned ( ) ;
687
+ let mut triple : Vec < & str > = rust_target. split_terminator ( '-' ) . collect ( ) ;
688
688
689
- if clang_target . starts_with ( "riscv32" ) {
690
- let idx = clang_target . find ( '-' ) . expect ( TRIPLE_HYPHENS_MESSAGE ) ;
689
+ assert ! ( !triple . is_empty ( ) , "{}" , TRIPLE_HYPHENS_MESSAGE ) ;
690
+ triple . resize ( 4 , "" ) ;
691
691
692
- clang_target. replace_range ( ..idx, "riscv32" ) ;
693
- } else if clang_target. starts_with ( "riscv64" ) {
694
- let idx = clang_target. find ( '-' ) . expect ( TRIPLE_HYPHENS_MESSAGE ) ;
695
-
696
- clang_target. replace_range ( ..idx, "riscv64" ) ;
697
- } else if clang_target. starts_with ( "aarch64-apple-" ) {
698
- let idx = clang_target. find ( '-' ) . expect ( TRIPLE_HYPHENS_MESSAGE ) ;
699
-
700
- clang_target. replace_range ( ..idx, "arm64" ) ;
692
+ // RISC-V
693
+ if triple[ 0 ] . starts_with ( "riscv32" ) {
694
+ triple[ 0 ] = "riscv32" ;
695
+ } else if triple[ 0 ] . starts_with ( "riscv64" ) {
696
+ triple[ 0 ] = "riscv64" ;
701
697
}
702
698
703
- if clang_target. ends_with ( "-espidf" ) {
704
- let idx = clang_target. rfind ( '-' ) . expect ( TRIPLE_HYPHENS_MESSAGE ) ;
705
-
706
- clang_target. replace_range ( ( idx + 1 ) .., "elf" ) ;
707
- } else if clang_target. ends_with ( "apple-ios-sim" ) {
708
- let idx = clang_target. rfind ( '-' ) . expect ( TRIPLE_HYPHENS_MESSAGE ) ;
699
+ // Apple
700
+ if triple[ 1 ] == "apple" {
701
+ if triple[ 0 ] == "aarch64" {
702
+ triple[ 0 ] = "arm64" ;
703
+ }
704
+ if triple[ 3 ] == "sim" {
705
+ triple[ 3 ] = "simulator" ;
706
+ }
707
+ }
709
708
710
- clang_target. replace_range ( ( idx + 1 ) .., "simulator" ) ;
709
+ // ESP-IDF
710
+ if triple[ 2 ] == "espidf" {
711
+ triple[ 2 ] = "elf" ;
711
712
}
712
713
713
- clang_target. into ( )
714
+ triple
715
+ . iter ( )
716
+ . skip ( 1 )
717
+ . fold ( triple[ 0 ] . to_string ( ) , |triple, part| {
718
+ if part. is_empty ( ) {
719
+ triple
720
+ } else {
721
+ triple + "-" + part
722
+ }
723
+ } )
724
+ . into ( )
714
725
}
715
726
716
727
/// Returns the effective target, and whether it was explicitly specified on the
@@ -1400,4 +1411,12 @@ fn test_rust_to_clang_target_simulator() {
1400
1411
rust_to_clang_target( "aarch64-apple-ios-sim" ) . as_ref( ) ,
1401
1412
"arm64-apple-ios-simulator"
1402
1413
) ;
1414
+ assert_eq ! (
1415
+ rust_to_clang_target( "aarch64-apple-tvos-sim" ) . as_ref( ) ,
1416
+ "arm64-apple-tvos-simulator"
1417
+ ) ;
1418
+ assert_eq ! (
1419
+ rust_to_clang_target( "aarch64-apple-watchos-sim" ) . as_ref( ) ,
1420
+ "arm64-apple-watchos-simulator"
1421
+ ) ;
1403
1422
}
0 commit comments