1 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
2 # vim: set filetype=python:
3 # This Source Code Form is subject to the terms of the Mozilla Public
4 # License, v. 2.0. If a copy of the MPL was not distributed with this
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 # If --with-gradle is specified, build mobile/android with Gradle. If no
8 # Gradle binary is specified use the in tree Gradle wrapper. The wrapper
9 # downloads and installs Gradle, which is good for local developers but not
14 help="Disable building mobile/android with Gradle "
15 "(argument: location of binary or wrapper (gradle/gradlew))",
19 @depends("--with-gradle")
20 def with_gradle(value):
23 "Building --without-gradle is no longer supported: "
24 "see https://bugzilla.mozilla.org/show_bug.cgi?id=1414415."
31 @depends(host, "--with-gradle", check_build_environment)
32 @imports(_from="os.path", _import="isfile")
33 def gradle(host, value, build_env):
37 gradle = os.path.join(build_env.topsrcdir, "gradlew")
38 if host.os == "WINNT":
39 gradle = gradle + ".bat"
41 # TODO: verify that $GRADLE is executable.
42 if not isfile(gradle):
43 die("GRADLE must be executable: %s", gradle)
48 set_config("GRADLE", gradle)
52 @imports(_from="itertools", _import="chain")
53 def gradle_android_build_config():
55 # str.capitalize lower cases trailing letters.
57 return s[0].upper() + s[1:]
61 def variant(productFlavors, buildType):
63 productFlavors=productFlavors,
65 # Like 'WithoutGeckoBinariesDebug'
66 name="".join(capitalize(t) for t in chain(productFlavors, (buildType,))),
71 variant=variant(("withGeckoBinaries",), "debug"),
73 geckoview_example=namespace(
74 variant=variant(("withGeckoBinaries",), "debug"),
79 @depends(gradle_android_build_config)
80 def gradle_android_intermediates_folder(build_config):
81 """Path to intermediates classes folder."""
85 return s[0].lower() + s[1:]
90 # str.capitalize lower cases trailing letters.
92 return s[0].upper() + s[1:]
96 productFlavor = uncapitalize(
97 "".join(capitalize(f) for f in build_config.geckoview.variant.productFlavors)
99 buildType = uncapitalize(build_config.geckoview.variant.buildType)
101 return "gradle/build/mobile/android/geckoview/intermediates/javac/{}{}/compile{}{}JavaWithJavac/classes".format(
103 capitalize(buildType),
104 capitalize(productFlavor),
105 capitalize(buildType),
110 "GRADLE_ANDROID_GECKOVIEW_APILINT_FOLDER", gradle_android_intermediates_folder
114 @depends(gradle_android_build_config)
115 def gradle_android_variant_name(build_config):
116 """Like "withoutGeckoBinariesDebug"."""
120 return s[0].lower() + s[1:]
125 geckoview=uncapitalize(build_config.geckoview.variant.name),
130 "GRADLE_ANDROID_GECKOVIEW_VARIANT_NAME", gradle_android_variant_name.geckoview
134 @depends(gradle_android_build_config)
135 def gradle_android_app_tasks(build_config):
136 """Gradle tasks run by |mach android assemble-app|."""
138 "geckoview:generateJNIWrappersForGenerated{geckoview.variant.name}".format(
139 geckoview=build_config.geckoview
144 set_config("GRADLE_ANDROID_APP_TASKS", gradle_android_app_tasks)
148 def gradle_android_generate_sdk_bindings_tasks():
149 """Gradle tasks run by |mach android generate-sdk-bindings|."""
151 "geckoview:generateSDKBindings",
156 "GRADLE_ANDROID_GENERATE_SDK_BINDINGS_TASKS",
157 gradle_android_generate_sdk_bindings_tasks,
161 @depends(gradle_android_build_config)
162 def gradle_android_generate_generated_jni_wrappers_tasks(build_config):
163 """Gradle tasks run by |mach android generate-generated-jni-wrappers|."""
165 "geckoview:generateJNIWrappersForGenerated{geckoview.variant.name}".format(
166 geckoview=build_config.geckoview
172 "GRADLE_ANDROID_GENERATE_GENERATED_JNI_WRAPPERS_TASKS",
173 gradle_android_generate_generated_jni_wrappers_tasks,
177 @depends(gradle_android_build_config)
178 def gradle_android_test_tasks(build_config):
179 """Gradle tasks run by |mach android test|."""
181 "geckoview:test{geckoview.variant.name}UnitTest".format(
182 geckoview=build_config.geckoview
187 set_config("GRADLE_ANDROID_TEST_TASKS", gradle_android_test_tasks)
190 @depends(gradle_android_build_config)
191 def gradle_android_lint_tasks(build_config):
192 """Gradle tasks run by |mach android lint|."""
194 "geckoview:lint{geckoview.variant.name}".format(
195 geckoview=build_config.geckoview
200 set_config("GRADLE_ANDROID_LINT_TASKS", gradle_android_lint_tasks)
203 @depends(gradle_android_build_config)
204 def gradle_android_api_lint_tasks(build_config):
205 """Gradle tasks run by |mach android api-lint|."""
207 "geckoview:apiLint{geckoview.variant.name}".format(
208 geckoview=build_config.geckoview
213 set_config("GRADLE_ANDROID_API_LINT_TASKS", gradle_android_api_lint_tasks)
216 @depends(gradle_android_build_config)
217 def gradle_android_checkstyle_tasks(build_config):
218 """Gradle tasks run by |mach android checkstyle|."""
220 "geckoview:checkstyle{geckoview.variant.name}".format(
221 geckoview=build_config.geckoview
226 set_config("GRADLE_ANDROID_CHECKSTYLE_TASKS", gradle_android_checkstyle_tasks)
229 @depends(gradle_android_build_config)
230 def gradle_android_checkstyle_output_files(build_config):
233 return s[0].lower() + s[1:]
237 variant = uncapitalize(build_config.geckoview.variant.name)
239 """Output folder for checkstyle"""
241 "gradle/build/mobile/android/geckoview/reports/checkstyle/{}.xml".format(
248 "GRADLE_ANDROID_CHECKSTYLE_OUTPUT_FILES", gradle_android_checkstyle_output_files
252 @depends(gradle_android_build_config)
253 def gradle_android_archive_geckoview_tasks(build_config):
254 """Gradle tasks run by |mach android archive-geckoview|."""
256 "geckoview:assemble{geckoview.variant.name}".format(
257 geckoview=build_config.geckoview
259 "geckoview:assemble{geckoview.variant.name}AndroidTest".format(
260 geckoview=build_config.geckoview
262 "geckoview_example:assemble{geckoview_example.variant.name}".format(
263 geckoview_example=build_config.geckoview_example
265 "messaging_example:assemble{geckoview_example.variant.name}".format(
266 geckoview_example=build_config.geckoview_example
268 "port_messaging_example:assemble{geckoview_example.variant.name}".format(
269 geckoview_example=build_config.geckoview_example
271 "geckoview:publish{geckoview.variant.name}PublicationToMavenRepository".format(
272 geckoview=build_config.geckoview
278 "GRADLE_ANDROID_ARCHIVE_GECKOVIEW_TASKS", gradle_android_archive_geckoview_tasks
282 @depends(gradle_android_build_config)
283 def gradle_android_geckoview_docs_tasks(build_config):
284 """Gradle tasks run by |mach android geckoview-docs|."""
286 "geckoview:javadoc{geckoview.variant.name}".format(
287 geckoview=build_config.geckoview
292 set_config("GRADLE_ANDROID_GECKOVIEW_DOCS_TASKS", gradle_android_geckoview_docs_tasks)
295 @depends(gradle_android_build_config)
296 def gradle_android_geckoview_docs_archive_tasks(build_config):
297 """Gradle tasks run by |mach android geckoview-docs --archive| or |... --upload."""
299 "geckoview:javadocCopyJar{geckoview.variant.name}".format(
300 geckoview=build_config.geckoview
306 "GRADLE_ANDROID_GECKOVIEW_DOCS_ARCHIVE_TASKS",
307 gradle_android_geckoview_docs_archive_tasks,
311 @depends(gradle_android_build_config)
312 def gradle_android_geckoview_docs_output_files(build_config):
313 """Output files for GeckoView javadoc."""
317 return s[0].lower() + s[1:]
321 variant = uncapitalize(build_config.geckoview.variant.name)
324 "gradle/build/mobile/android/geckoview/reports/javadoc-results-{}.json".format(
331 "GRADLE_ANDROID_GECKOVIEW_DOCS_OUTPUT_FILES",
332 gradle_android_geckoview_docs_output_files,
336 @depends(gradle_android_build_config)
337 def gradle_android_archive_coverage_artifacts_tasks(build_config):
338 """Gradle tasks run by |mach android archive-coverage-artifacts|."""
340 "geckoview:archiveClassfiles{geckoview.variant.name}".format(
341 geckoview=build_config.geckoview
343 "geckoview:copyCoverageDependencies",
348 "GRADLE_ANDROID_ARCHIVE_COVERAGE_ARTIFACTS_TASKS",
349 gradle_android_archive_coverage_artifacts_tasks,
353 @depends(gradle_android_build_config)
354 def gradle_android_build_geckoview_example_tasks(build_config):
355 """Gradle tasks run by |mach android build-geckoview_example|."""
357 "geckoview_example:assemble{geckoview_example.variant.name}".format(
358 geckoview_example=build_config.geckoview_example
360 "geckoview:assemble{geckoview.variant.name}AndroidTest".format(
361 geckoview=build_config.geckoview
367 "GRADLE_ANDROID_BUILD_GECKOVIEW_EXAMPLE_TASKS",
368 gradle_android_build_geckoview_example_tasks,
372 @depends(gradle_android_build_config)
373 def gradle_android_install_geckoview_example_tasks(build_config):
374 """Gradle tasks run by |mach android install-geckoview_example|."""
376 "geckoview_example:install{geckoview_example.variant.name}".format(
377 geckoview_example=build_config.geckoview_example
379 "geckoview:install{geckoview.variant.name}AndroidTest".format(
380 geckoview=build_config.geckoview
386 "GRADLE_ANDROID_INSTALL_GECKOVIEW_EXAMPLE_TASKS",
387 gradle_android_install_geckoview_example_tasks,
392 def gradle_android_dependencies():
393 """Gradle tasks that download all dependencies."""
394 # These tasks download most dependencies from each configuration, the
395 # notable exception is dependencies added at runtime by gradle plugins
397 "downloadDependencies",
402 gradle_android_api_lint_tasks,
403 gradle_android_checkstyle_tasks,
404 gradle_android_dependencies,
406 @imports(_from="itertools", _import="chain")
407 def gradle_android_dependencies_tasks(*tasks):
408 """Gradle tasks run by |mach android dependencies|."""
409 # The union, plus a bit more, of all of the Gradle tasks
410 # invoked by the android-* automation jobs.
411 def withoutGeckoBinaries(task):
412 return task.replace("withGeckoBinaries", "withoutGeckoBinaries")
414 return list(withoutGeckoBinaries(t) for t in chain(*tasks))
417 set_config("GRADLE_ANDROID_DEPENDENCIES_TASKS", gradle_android_dependencies_tasks)
420 # Automation uses this to change log levels, not use the daemon, and use
422 option(env="GRADLE_FLAGS", default="", help="Flags to pass to Gradle.")
425 @depends("GRADLE_FLAGS")
426 def gradle_flags(value):
427 return value[0] if value else ""
430 set_config("GRADLE_FLAGS", gradle_flags)
432 # Automation will set this to (file:///path/to/local, ...) via the mozconfig.
433 # Local developer default is (jcenter, maven.google.com).
435 env="GRADLE_MAVEN_REPOSITORIES",
438 "https://maven.google.com/",
439 "https://jcenter.bintray.com/",
440 "https://plugins.gradle.org/m2/",
442 help="Comma-separated URLs of Maven repositories containing Gradle dependencies.",
446 @depends("GRADLE_MAVEN_REPOSITORIES")
447 @imports(_from="os.path", _import="isdir")
448 def gradle_maven_repositories(values):
450 die("GRADLE_MAVEN_REPOSITORIES must not be empty")
452 die("GRADLE_MAVEN_REPOSITORIES entries must not be empty")
456 set_config("GRADLE_MAVEN_REPOSITORIES", gradle_maven_repositories)