Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 51d0d3f

Browse files
Fraser J. Gordonlivecodeian
authored andcommitted
Add support to our configure scripts for more Android architectures
The script now recognises armv7, arm64, x86 and x86_64 architectures in addition to the existing armv6 architecture.
1 parent 45292c5 commit 51d0d3f

File tree

3 files changed

+100
-10
lines changed

3 files changed

+100
-10
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ $(addsuffix -linux,all config compile check): %: %-$(guess_linux_arch)
134134
# Android rules
135135
################################################################
136136

137-
ANDROID_ARCHS = armv6
137+
ANDROID_ARCHS = armv6 armv7 arm64 x86 x86_64
138138

139139
config-android-%:
140140
./config.sh --platform android-$*

config-rpi.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#/bin/bash
2+
3+
./config.sh --cross --platform linux-armv6hf --cc-prefix ${HOME}/x-tools/arm-rpi-linux-gnueabihf/bin/arm-rpi-linux-gnueabihf- --sysroot ${HOME}/x-tools/arm-rpi-linux-gnueabihf/arm-rpi-linux-gnueabihf/sysroot --aux-sysroot /var/lib/schroot/chroots/jessie-armhf --triple arm-linux-gnueabihf

config.py

Lines changed: 96 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
KNOWN_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+
266269
def 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):
359362
def 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+
524593
def 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

628710
def 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

639722
def 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

647731
def 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

662747
def 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

684770
def 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

Comments
 (0)