151 lines
5.4 KiB
Python
151 lines
5.4 KiB
Python
# -*- 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')
|