@@ -2286,7 +2286,7 @@ impl Build {
22862286 } else if target. contains ( "apple-watchos" ) {
22872287 clang. to_string ( )
22882288 } else if target. contains ( "android" ) {
2289- autodetect_android_compiler ( & target, & host, gnu , clang)
2289+ autodetect_android_compiler ( & target, & host, clang)
22902290 } else if target. contains ( "cloudabi" ) {
22912291 format ! ( "{}-{}" , target, traditional)
22922292 } else if target == "wasm32-wasi"
@@ -3221,16 +3221,6 @@ fn command_add_output_file(
32213221 }
32223222}
32233223
3224- // Use by default minimum available API level
3225- // See note about naming here
3226- // https://android.googlesource.com/platform/ndk/+/refs/heads/ndk-release-r21/docs/BuildSystemMaintainers.md#Clang
3227- static NEW_STANDALONE_ANDROID_COMPILERS : [ & str ; 4 ] = [
3228- "aarch64-linux-android21-clang" ,
3229- "armv7a-linux-androideabi16-clang" ,
3230- "i686-linux-android16-clang" ,
3231- "x86_64-linux-android21-clang" ,
3232- ] ;
3233-
32343224// New "standalone" C/C++ cross-compiler executables from recent Android NDK
32353225// are just shell scripts that call main clang binary (from Android NDK) with
32363226// proper `--target` argument.
@@ -3253,7 +3243,7 @@ fn android_clang_compiler_uses_target_arg_internally(clang_path: &Path) -> bool
32533243
32543244#[ test]
32553245fn test_android_clang_compiler_uses_target_arg_internally ( ) {
3256- for version in 16 ..21 {
3246+ for version in 16 ..33 {
32573247 assert ! ( android_clang_compiler_uses_target_arg_internally(
32583248 & PathBuf :: from( format!( "armv7a-linux-androideabi{}-clang" , version) )
32593249 ) ) ;
@@ -3269,50 +3259,33 @@ fn test_android_clang_compiler_uses_target_arg_internally() {
32693259 ) ) ;
32703260}
32713261
3272- fn autodetect_android_compiler ( target : & str , host : & str , gnu : & str , clang : & str ) -> String {
3273- let new_clang_key = match target {
3274- "aarch64-linux-android" => Some ( "aarch64" ) ,
3275- "armv7-linux-androideabi" => Some ( "armv7a" ) ,
3276- "i686-linux-android" => Some ( "i686" ) ,
3277- "x86_64-linux-android" => Some ( "x86_64" ) ,
3278- _ => None ,
3262+ fn autodetect_android_compiler ( target : & str , host : & str , clang : & str ) -> String {
3263+ let mut triple_iter = target. split ( "-" ) ;
3264+ let triple_translated = if let Some ( arch) = triple_iter. next ( ) {
3265+ let arch_new = match arch {
3266+ "arm" | "armv7" | "armv7neon" | "thumbv7" | "thumbv7neon" => "armv7a" ,
3267+ other => other,
3268+ } ;
3269+ std:: iter:: once ( arch_new) . chain ( triple_iter) . collect :: < Vec < & str > > ( ) . join ( "-" )
3270+ } else {
3271+ target. to_string ( )
32793272 } ;
32803273
3281- let new_clang = new_clang_key
3282- . map ( |key| {
3283- NEW_STANDALONE_ANDROID_COMPILERS
3284- . iter ( )
3285- . find ( |x| x. starts_with ( key) )
3286- } )
3287- . unwrap_or ( None ) ;
3288-
3289- if let Some ( new_clang) = new_clang {
3290- if Command :: new ( new_clang) . output ( ) . is_ok ( ) {
3291- return ( * new_clang) . into ( ) ;
3292- }
3293- }
3294-
3295- let target = target
3296- . replace ( "armv7neon" , "arm" )
3297- . replace ( "armv7" , "arm" )
3298- . replace ( "thumbv7neon" , "arm" )
3299- . replace ( "thumbv7" , "arm" ) ;
3300- let gnu_compiler = format ! ( "{}-{}" , target, gnu) ;
3301- let clang_compiler = format ! ( "{}-{}" , target, clang) ;
3274+ // API 19 is the earliest API level supported by NDK r25b but AArch64 and x86_64 support
3275+ // begins at API level 21.
3276+ let api_level =
3277+ if target. contains ( "aarch64" ) || target. contains ( "x86_64" ) { "21" } else { "19" } ;
3278+ let compiler = format ! ( "{}{}-{}" , triple_translated, api_level, clang) ;
33023279
33033280 // On Windows, the Android clang compiler is provided as a `.cmd` file instead
33043281 // of a `.exe` file. `std::process::Command` won't run `.cmd` files unless the
33053282 // `.cmd` is explicitly appended to the command name, so we do that here.
3306- let clang_compiler_cmd = format ! ( "{}-{}.cmd" , target, clang) ;
3307-
3308- // Check if gnu compiler is present
3309- // if not, use clang
3310- if Command :: new ( & gnu_compiler) . output ( ) . is_ok ( ) {
3311- gnu_compiler
3312- } else if host. contains ( "windows" ) && Command :: new ( & clang_compiler_cmd) . output ( ) . is_ok ( ) {
3313- clang_compiler_cmd
3283+ let windows_compiler_cmd = format ! ( "{}.cmd" , compiler) ;
3284+
3285+ if host. contains ( "windows" ) && Command :: new ( & windows_compiler_cmd) . output ( ) . is_ok ( ) {
3286+ windows_compiler_cmd
33143287 } else {
3315- clang_compiler
3288+ compiler
33163289 }
33173290}
33183291
0 commit comments