4343
4444KNOWN_PLATFORMS = (
4545 'linux-x86' , 'linux-x86_64' , 'linux-armv6hf' , 'linux-armv7' ,
46- 'android-armv6' ,
46+ 'android-armv6' , 'android-armv7' , 'android-arm64' , 'android-x86' , 'android-x86_64' ,
4747 'mac' , 'ios' ,
4848 'win-x86' , 'win-x86_64' ,
4949 'emscripten'
@@ -263,6 +263,9 @@ def validate_os(opts):
263263 if opts ['OS' ] is None :
264264 opts ['OS' ] = opts ['PLATFORM' ].split ('-' )[0 ]
265265
266+ def host_platform (opts ):
267+ opts ['HOST_PLATFORM' ] = guess_platform ()
268+
266269def guess_xcode_arch (target_sdk ):
267270 sdk , ver = re .match ('^([^\d]*)(\d*)' , target_sdk ).groups ()
268271 if sdk == 'macosx' :
@@ -285,7 +288,7 @@ def validate_target_arch(opts):
285288 opts ['UNIFORM_ARCH' ] = opts ['TARGET_ARCH' ]
286289 return
287290
288- platform_arch = re .search ('-(x86|x86_64|armv( 6(hf)?|7))$' , platform )
291+ platform_arch = re .search ('-(x86|x86_64|arm(64|v( 6(hf)?|7) ))$' , platform )
289292 if platform_arch is not None :
290293 opts ['TARGET_ARCH' ] = platform_arch .group (1 )
291294 opts ['UNIFORM_ARCH' ] = opts ['TARGET_ARCH' ]
@@ -359,7 +362,7 @@ def guess_java_home(platform):
359362def validate_java_tools (opts ):
360363 if opts ['JAVA_SDK' ] is None :
361364 validate_platform (opts )
362- sdk = guess_java_home (opts ['PLATFORM ' ])
365+ sdk = guess_java_home (opts ['HOST_PLATFORM ' ])
363366 if sdk is None :
364367 error ('Java SDK not found; set $JAVA_SDK' )
365368 opts ['JAVA_SDK' ] = sdk
@@ -521,6 +524,72 @@ def guess_android_build_tools(sdkdir):
521524 return dirs [0 ]
522525 return None
523526
527+ # Guess the standalone toolchain directory name.
528+ def guess_standalone_toolchain_dir_name (target_arch ):
529+ if target_arch == 'armv6' or target_arch == 'armv7' :
530+ return 'standalone-arm'
531+ else :
532+ return 'standalone-' + target_arch
533+
534+ # Guess the triple to use for a given Android target architecture.
535+ def guess_android_triple (target_arch ):
536+ if target_arch == 'armv6' :
537+ return 'arm-linux-androideabi'
538+ elif target_arch == 'armv7' :
539+ return 'armv7-linux-androideabi'
540+ elif target_arch == 'arm64' :
541+ return 'aarch64-linux-android'
542+ elif target_arch == 'x86' :
543+ return 'i686-linux-android'
544+ elif target_arch == 'x86_64' :
545+ return 'x86_64-linux-android'
546+ else :
547+ return target_arch
548+
549+ # Guess the value to pass with the -march flag for Android builds.
550+ def guess_android_march (target_arch ):
551+ if target_arch == 'armv7' :
552+ return 'armv7-a'
553+ elif target_arch == 'arm64' :
554+ # The -march flag is not used for baseline arm64.
555+ return ''
556+ elif target_arch == 'x86' :
557+ return 'i686'
558+ elif target_arch == 'x86_64' :
559+ # The -march flag is not used for baseline x86_64
560+ return ''
561+ return target_arch
562+
563+ # Guess the prefix used on the compiler's name.
564+ def guess_compiler_prefix (target_arch ):
565+ if target_arch == 'armv7' :
566+ # The ARMv7 triple is different from its compiler's prefix.
567+ triple = guess_android_triple ('armv6' )
568+ else :
569+ triple = guess_android_triple (target_arch )
570+ if triple == target_arch :
571+ return ''
572+ return triple + '-'
573+
574+ # Returns any extra C/C++ compiler flags required when targeting Android on the
575+ # given architecture.
576+ def android_extra_cflags (target_arch ):
577+ if target_arch == 'armv7' :
578+ # The first three flags are required in order to guarantee ABI compatibility.
579+ # Additionally, Google recommends generating thumb instructions on Android.
580+ return '-mfloat-abi=softfp -mfpu=vfpv3-d16 -Wl,--fix-cortex-a8 -mthumb'
581+ elif target_arch == 'armv6' :
582+ # Google recommends generating thumb instructions on Android.
583+ return '-mthumb'
584+ return ''
585+
586+ # Returns any extra linker flags required when targeting Android on the given
587+ # architecture.
588+ def android_extra_ldflags (target_arch ):
589+ if target_arch == 'armv7' :
590+ return '-Wl,--fix-cortex-a8'
591+ return ''
592+
524593def validate_android_tools (opts ):
525594 if opts ['ANDROID_NDK_VERSION' ] is None :
526595 opts ['ANDROID_NDK_VERSION' ] = 'r14'
@@ -548,10 +617,11 @@ def validate_android_tools(opts):
548617 opts ['ANDROID_BUILD_TOOLS' ] = tools
549618
550619 if opts ['ANDROID_TOOLCHAIN' ] is None :
551- dir = guess_android_tooldir ('standalone' )
620+ dir = guess_android_tooldir (guess_standalone_toolchain_dir_name ( opts [ 'TARGET_ARCH' ]) )
552621 if dir is None :
553- error ('Android toolchain not found; set $ANDROID_TOOLCHAIN' )
554- opts ['ANDROID_TOOLCHAIN' ] = os .path .join (dir ,'bin' ,'arm-linux-androideabi-' )
622+ error ('Android toolchain not found for architecture {}; set $ANDROID_TOOLCHAIN' .format (opts ['TARGET_ARCH' ]))
623+ prefix = guess_compiler_prefix (opts ['TARGET_ARCH' ])
624+ opts ['ANDROID_TOOLCHAIN' ] = os .path .join (dir ,'bin' ,prefix )
555625
556626 def android_tool (name , env , extra = "" ):
557627 if opts [env ] is None :
@@ -560,13 +630,25 @@ def android_tool(name, env, extra=""):
560630 tool += ' ' + extra
561631 opts [env ] = tool
562632
633+ target_arch = opts ['TARGET_ARCH' ]
634+ march = guess_android_march (target_arch )
635+ triple = guess_android_triple (target_arch )
636+ cflags = android_extra_cflags (target_arch )
637+ ldflags = android_extra_ldflags (target_arch )
638+
639+ # All Android builds use Clang and make a lot of noise about unused
640+ # arguments (e.g. linker-specific arguments). Suppress them.
641+ cflags += ' -Qunused-arguments'
642+
643+ if march != '' :
644+ march = '-march=' + march
563645 android_tool ('ar' , 'AR' )
564646 android_tool ('clang' , 'CC' ,
565- '-target arm-linux-androideabi -march=armv6 -integrated-as' )
647+ '-target {} {} -integrated-as {}' . format ( triple , march , cflags ) )
566648 android_tool ('clang++' , 'CXX' ,
567- '-target arm-linux-androideabi -march=armv6 -integrated-as' )
649+ '-target {} {} -integrated-as {}' . format ( triple , march , cflags ) )
568650 android_tool ('clang++' , 'LINK' ,
569- '-target arm-linux-androideabi -march=armv6 -integrated-as -fuse-ld=bfd' )
651+ '-target {} {} -integrated-as -fuse-ld=bfd {}' . format ( triple , march , ldflags ) )
570652 android_tool ('objcopy' , 'OBJCOPY' )
571653 android_tool ('objdump' , 'OBJDUMP' )
572654 android_tool ('strip' , 'STRIP' )
@@ -626,6 +708,7 @@ def gyp_define_args(opts, names):
626708 if opts [value ] is not None ]
627709
628710def configure_linux (opts ):
711+ host_platform (opts )
629712 validate_target_arch (opts )
630713 validate_java_tools (opts )
631714
@@ -637,6 +720,7 @@ def configure_linux(opts):
637720 exec_gyp (args + opts ['GYP_OPTIONS' ])
638721
639722def configure_emscripten (opts ):
723+ host_platform (opts )
640724 validate_target_arch (opts )
641725 validate_emscripten_tools (opts )
642726
@@ -645,6 +729,7 @@ def configure_emscripten(opts):
645729 exec_gyp (args + opts ['GYP_OPTIONS' ])
646730
647731def configure_android (opts ):
732+ host_platform (opts )
648733 validate_target_arch (opts )
649734 validate_android_tools (opts )
650735 validate_java_tools (opts )
@@ -660,6 +745,7 @@ def configure_android(opts):
660745 exec_gyp (args + opts ['GYP_OPTIONS' ])
661746
662747def configure_win (opts ):
748+ host_platform (opts )
663749 validate_target_arch (opts )
664750 validate_windows_tools (opts )
665751
@@ -682,6 +768,7 @@ def configure_win(opts):
682768 exec_gyp (args + opts ['GYP_OPTIONS' ])
683769
684770def configure_mac (opts ):
771+ host_platform (opts )
685772 validate_target_arch (opts )
686773 validate_xcode_sdks (opts )
687774 validate_java_tools (opts )
0 commit comments