summaryrefslogtreecommitdiffstats
path: root/build/moz.configure/android-ndk.configure
diff options
context:
space:
mode:
Diffstat (limited to 'build/moz.configure/android-ndk.configure')
-rw-r--r--build/moz.configure/android-ndk.configure150
1 files changed, 150 insertions, 0 deletions
diff --git a/build/moz.configure/android-ndk.configure b/build/moz.configure/android-ndk.configure
new file mode 100644
index 000000000..6a0b30529
--- /dev/null
+++ b/build/moz.configure/android-ndk.configure
@@ -0,0 +1,150 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+js_option('--with-android-ndk', nargs=1,
+ help='location where the Android NDK can be found')
+
+js_option('--with-android-toolchain', nargs=1,
+ help='location of the Android toolchain')
+
+js_option('--with-android-gnu-compiler-version', nargs=1,
+ help='GNU compiler version to use')
+
+min_android_version = dependable(lambda: '9')
+
+js_option('--with-android-version',
+ nargs=1,
+ help='android platform version',
+ default=min_android_version)
+
+@depends('--with-android-version', min_android_version)
+@imports(_from='__builtin__', _import='ValueError')
+def android_version(value, min_version):
+ if not value:
+ # Someone has passed --without-android-version.
+ die('--with-android-version cannot be disabled.')
+
+ try:
+ version = int(value[0])
+ except ValueError:
+ die('--with-android-version expects an integer value')
+
+ if version < int(min_version):
+ die('--with-android-version must be at least %s (got %s)',
+ min_version, value[0])
+
+ return version
+
+add_old_configure_assignment('android_version', android_version)
+
+@depends('--with-android-ndk', build_project)
+def ndk(value, build_project):
+ if build_project == 'mobile/android' and not value:
+ die('You must specify --with-android-ndk=/path/to/ndk when '
+ 'building mobile/android')
+ if value:
+ return value[0]
+
+set_config('ANDROID_NDK', ndk)
+add_old_configure_assignment('android_ndk', ndk)
+
+@depends(target, android_version, ndk)
+@checking('for android platform directory')
+@imports(_from='os.path', _import='isdir')
+def android_platform(target, android_version, ndk):
+ if target.os != 'Android':
+ return
+
+ if 'mips' in target.cpu:
+ target_dir_name = 'mips'
+ elif 'aarch64' == target.cpu:
+ target_dir_name = 'arm64'
+ else:
+ target_dir_name = target.cpu
+
+ # Not all Android releases have their own platform release. We use
+ # the next lower platform version in these cases.
+ if android_version in (11, 10):
+ platform_version = 9
+ elif android_version in (20, 22):
+ platform_version = android_version - 1
+ else:
+ platform_version = android_version
+
+ platform_dir = os.path.join(ndk,
+ 'platforms',
+ 'android-%s' % platform_version,
+ 'arch-%s' % target_dir_name)
+
+ if not isdir(platform_dir):
+ die("Android platform directory not found. With the current "
+ "configuration, it should be in %s" % platform_dir)
+
+ return platform_dir
+
+add_old_configure_assignment('android_platform', android_platform)
+
+@depends(android_platform)
+def extra_toolchain_flags(platform_dir):
+ if not platform_dir:
+ return []
+ return ['-idirafter',
+ os.path.join(platform_dir, 'usr', 'include')]
+
+@depends(target, host, ndk, '--with-android-toolchain',
+ '--with-android-gnu-compiler-version')
+@checking('for the Android toolchain directory', lambda x: x or 'not found')
+@imports(_from='os.path', _import='isdir')
+@imports(_from='mozbuild.shellutil', _import='quote')
+def android_toolchain(target, host, ndk, toolchain, gnu_compiler_version):
+ if not ndk:
+ return
+ if toolchain:
+ return toolchain[0]
+ else:
+ if target.cpu == 'arm' and target.endianness == 'little':
+ target_base = 'arm-linux-androideabi'
+ elif target.cpu == 'x86':
+ target_base = 'x86'
+ elif target.cpu == 'mips32' and target.endianness == 'little':
+ target_base = 'mipsel-linux-android'
+ elif target.cpu == 'aarch64' and target.endianness == 'little':
+ target_base = 'aarch64-linux-android'
+ else:
+ die('Target cpu is not supported.')
+
+ toolchain_format = '%s/toolchains/%s-%s/prebuilt/%s-%s'
+
+ for version in gnu_compiler_version or ['4.9', '4.8', '4.7']:
+ toolchain = toolchain_format % (ndk, target_base, version,
+ host.kernel.lower(), host.cpu)
+ log.debug('Trying %s' % quote(toolchain))
+ if not isdir(toolchain) and host.cpu == 'x86_64':
+ toolchain = toolchain_format % (ndk, target_base, version,
+ host.kernel.lower(), 'x86')
+ log.debug('Trying %s' % quote(toolchain))
+ if isdir(toolchain):
+ return toolchain
+ else:
+ if gnu_compiler_version:
+ die('Your --with-android-gnu-compiler-version may be wrong')
+ die('You have to specify --with-android-toolchain='
+ '/path/to/ndk/toolchain.')
+
+set_config('ANDROID_TOOLCHAIN', android_toolchain)
+
+@depends(target, android_toolchain)
+def android_toolchain_prefix(target, toolchain):
+ if toolchain:
+ if target.cpu == 'x86':
+ # Ideally, the --target should just have the right x86 variant
+ # in the first place.
+ return '%s/bin/i686-linux-android-' % toolchain
+ return '%s/bin/%s-' % (toolchain, target.toolchain)
+
+imply_option('--with-toolchain-prefix', android_toolchain_prefix,
+ reason='--with-android-ndk')