1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
# -*- 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/.
# Ensure Android SDK and build-tools versions depending on mobile target.
@depends(host, toolchains_base_dir, "--help")
@imports(_from="os.path", _import="isdir")
def default_android_sdk_root(host, toolchains_base_dir, _):
sdk_basename = {
"Darwin": "android-sdk-macosx",
"Linux": "android-sdk-linux",
"WINNT": "android-sdk-windows",
}.get(host.kernel, "android-sdk")
for sdk_basename in (sdk_basename, "android-sdk"):
path = os.path.join(toolchains_base_dir, sdk_basename)
if isdir(path):
return path
option(
"--with-android-sdk",
nargs=1,
default=default_android_sdk_root,
help="location where the Android SDK can be found (like ~/.mozbuild/android-sdk-linux){|}",
)
@depends("--with-android-sdk")
@imports(_from="os.path", _import="isdir")
def android_sdk_root(value):
if value:
if not isdir(value[0]):
die(
"The path you specified with --with-android-sdk (%s) is not "
"a directory" % value[0]
)
return value[0]
die(
"You must specify --with-android-sdk=/path/to/sdk when targeting Android, "
"or try |mach bootstrap|."
)
@dependable
def android_sdk_version():
# We support Android SDK version 21 and up by default.
# See the --enable-android-min-sdk option below.
#
# Warning: Before increasing the with-android-min-sdk value, please note several places in
# and out of tree have to be changed. Otherwise, places like Treeherder or archive.mozilla.org
# will advertise a bad API level. This may confuse people. As an example, please look at
# bug 1384482.
# If you think you can't handle the whole set of changes, please reach out to the Release
# Engineering team.
return namespace(
build_tools_version="34.0.0",
target_sdk_version="34",
min_sdk_version="21",
)
option(
"--with-android-min-sdk",
default=android_sdk_version.min_sdk_version,
help="Impose a minimum Firefox for Android SDK version",
)
@depends("--with-android-min-sdk", android_sdk_version.target_sdk_version)
@imports(_from="__builtin__", _import="ValueError")
def valid_android_min_sdk(min_sdk_version, target_sdk_version):
if not min_sdk_version:
die("--without-android-min-sdk is not a valid option")
try:
if int(min_sdk_version[0]) > int(target_sdk_version):
die(
"--with-android-min-sdk is expected to be less than {}".format(
target_sdk_version
)
)
except ValueError:
die("--with-android-min-sdk takes a numerical value")
return min_sdk_version[0]
set_config("MOZ_ANDROID_MIN_SDK_VERSION", valid_android_min_sdk)
@depends(android_sdk_root, android_sdk_version)
@checking("for Android build-tools")
@imports(_from="os.path", _import="exists")
@imports(_from="os.path", _import="isdir")
def android_build_tools(sdk_root, sdk_version):
android_build_tools_base = os.path.join(sdk_root, "build-tools")
version = sdk_version.build_tools_version
if isdir(os.path.join(android_build_tools_base, version)):
tools = os.path.join(android_build_tools_base, version)
for zipalign in ("zipalign", "zipalign.exe"):
if exists(os.path.join(tools, zipalign)):
return [tools]
die(
"You must install the Android build-tools version %s. "
"Try |mach bootstrap|. (Looked for %s/%s)"
% (version, android_build_tools_base, version)
)
@depends(android_sdk_root)
@checking("for Android platform-tools")
@imports(_from="os.path", _import="exists")
@imports(_from="os.path", _import="isdir")
def android_platform_tools(sdk_root):
tools = os.path.join(sdk_root, "platform-tools")
for adb in ("adb", "adb.exe"):
if exists(os.path.join(tools, adb)):
return [tools]
die(
"You must install the Android platform-tools. Try |mach bootstrap|. (Looked for %s)"
% tools
)
@depends(android_sdk_root)
def android_emulator_path(sdk_root):
return [os.path.join(sdk_root, "emulator")]
@template
def check_android_tools(tool, tool_dir):
check = check_prog(
tool.upper(), (tool, tool + ".exe"), paths=tool_dir, allow_missing=True
)
@depends(check)
def require_tool(result):
if result is None:
die("The program %s was not found. Try |mach bootstrap|" % tool)
return result
return require_tool
check_android_tools("zipalign", android_build_tools)
check_android_tools("adb", android_platform_tools)
check_android_tools("emulator", android_emulator_path)
set_config("ANDROID_SDK_ROOT", android_sdk_root)
set_config("ANDROID_BUILD_TOOLS_VERSION", android_sdk_version.build_tools_version)
set_config("ANDROID_TARGET_SDK", android_sdk_version.target_sdk_version)
|