Bug 1686668 [wpt PR 27185] - Update wpt metadata, a=testonly
[gecko.git] / mobile / android / gradle.configure
blob2fc194fa8f85e0343fa793de0e0ac99833e5e1cd
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
10 # good in automation.
11 option(
12     "--without-gradle",
13     nargs="?",
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):
21     if not value:
22         die(
23             "Building --without-gradle is no longer supported: "
24             "see https://bugzilla.mozilla.org/show_bug.cgi?id=1414415."
25         )
27     if value:
28         return True
31 @depends(host, "--with-gradle", check_build_environment)
32 @imports(_from="os.path", _import="isfile")
33 def gradle(host, value, build_env):
34     if len(value):
35         gradle = value[0]
36     else:
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)
45     return gradle
48 set_config("GRADLE", gradle)
51 @dependable
52 @imports(_from="itertools", _import="chain")
53 def gradle_android_build_config():
54     def capitalize(s):
55         # str.capitalize lower cases trailing letters.
56         if s:
57             return s[0].upper() + s[1:]
58         else:
59             return s
61     def variant(productFlavors, buildType):
62         return namespace(
63             productFlavors=productFlavors,
64             buildType=buildType,
65             # Like 'WithoutGeckoBinariesDebug'
66             name="".join(capitalize(t) for t in chain(productFlavors, (buildType,))),
67         )
69     return namespace(
70         geckoview=namespace(
71             variant=variant(("withGeckoBinaries",), "debug"),
72         ),
73         geckoview_example=namespace(
74             variant=variant(("withGeckoBinaries",), "debug"),
75         ),
76     )
79 @depends(gradle_android_build_config)
80 def gradle_android_intermediates_folder(build_config):
81     """Path to intermediates classes folder."""
83     def uncapitalize(s):
84         if s:
85             return s[0].lower() + s[1:]
86         else:
87             return s
89     def capitalize(s):
90         # str.capitalize lower cases trailing letters.
91         if s:
92             return s[0].upper() + s[1:]
93         else:
94             return s
96     productFlavor = uncapitalize(
97         "".join(capitalize(f) for f in build_config.geckoview.variant.productFlavors)
98     )
99     buildType = uncapitalize(build_config.geckoview.variant.buildType)
101     return "gradle/build/mobile/android/geckoview/intermediates/javac/{}{}/compile{}{}JavaWithJavac/classes".format(
102         productFlavor,
103         capitalize(buildType),
104         capitalize(productFlavor),
105         capitalize(buildType),
106     )
109 set_config(
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"."""
118     def uncapitalize(s):
119         if s:
120             return s[0].lower() + s[1:]
121         else:
122             return s
124     return namespace(
125         geckoview=uncapitalize(build_config.geckoview.variant.name),
126     )
129 set_config(
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|."""
137     return [
138         "geckoview:generateJNIWrappersForGenerated{geckoview.variant.name}".format(
139             geckoview=build_config.geckoview
140         ),
141     ]
144 set_config("GRADLE_ANDROID_APP_TASKS", gradle_android_app_tasks)
147 @dependable
148 def gradle_android_generate_sdk_bindings_tasks():
149     """Gradle tasks run by |mach android generate-sdk-bindings|."""
150     return [
151         "geckoview:generateSDKBindings",
152     ]
155 set_config(
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|."""
164     return [
165         "geckoview:generateJNIWrappersForGenerated{geckoview.variant.name}".format(
166             geckoview=build_config.geckoview
167         ),
168     ]
171 set_config(
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|."""
180     return [
181         "geckoview:test{geckoview.variant.name}UnitTest".format(
182             geckoview=build_config.geckoview
183         ),
184     ]
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|."""
193     return [
194         "geckoview:lint{geckoview.variant.name}".format(
195             geckoview=build_config.geckoview
196         ),
197     ]
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|."""
206     return [
207         "geckoview:apiLint{geckoview.variant.name}".format(
208             geckoview=build_config.geckoview
209         ),
210     ]
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|."""
219     return [
220         "geckoview:checkstyle{geckoview.variant.name}".format(
221             geckoview=build_config.geckoview
222         ),
223     ]
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):
231     def uncapitalize(s):
232         if s:
233             return s[0].lower() + s[1:]
234         else:
235             return s
237     variant = uncapitalize(build_config.geckoview.variant.name)
239     """Output folder for checkstyle"""
240     return [
241         "gradle/build/mobile/android/geckoview/reports/checkstyle/{}.xml".format(
242             variant
243         ),
244     ]
247 set_config(
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|."""
255     return [
256         "geckoview:assemble{geckoview.variant.name}".format(
257             geckoview=build_config.geckoview
258         ),
259         "geckoview:assemble{geckoview.variant.name}AndroidTest".format(
260             geckoview=build_config.geckoview
261         ),
262         "geckoview_example:assemble{geckoview_example.variant.name}".format(
263             geckoview_example=build_config.geckoview_example
264         ),
265         "messaging_example:assemble{geckoview_example.variant.name}".format(
266             geckoview_example=build_config.geckoview_example
267         ),
268         "port_messaging_example:assemble{geckoview_example.variant.name}".format(
269             geckoview_example=build_config.geckoview_example
270         ),
271         "geckoview:publish{geckoview.variant.name}PublicationToMavenRepository".format(
272             geckoview=build_config.geckoview
273         ),
274     ]
277 set_config(
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|."""
285     return [
286         "geckoview:javadoc{geckoview.variant.name}".format(
287             geckoview=build_config.geckoview
288         ),
289     ]
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."""
298     return [
299         "geckoview:javadocCopyJar{geckoview.variant.name}".format(
300             geckoview=build_config.geckoview
301         ),
302     ]
305 set_config(
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."""
315     def uncapitalize(s):
316         if s:
317             return s[0].lower() + s[1:]
318         else:
319             return s
321     variant = uncapitalize(build_config.geckoview.variant.name)
323     return [
324         "gradle/build/mobile/android/geckoview/reports/javadoc-results-{}.json".format(
325             variant
326         ),
327     ]
330 set_config(
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|."""
339     return [
340         "geckoview:archiveClassfiles{geckoview.variant.name}".format(
341             geckoview=build_config.geckoview
342         ),
343         "geckoview:copyCoverageDependencies",
344     ]
347 set_config(
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|."""
356     return [
357         "geckoview_example:assemble{geckoview_example.variant.name}".format(
358             geckoview_example=build_config.geckoview_example
359         ),
360         "geckoview:assemble{geckoview.variant.name}AndroidTest".format(
361             geckoview=build_config.geckoview
362         ),
363     ]
366 set_config(
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|."""
375     return [
376         "geckoview_example:install{geckoview_example.variant.name}".format(
377             geckoview_example=build_config.geckoview_example
378         ),
379         "geckoview:install{geckoview.variant.name}AndroidTest".format(
380             geckoview=build_config.geckoview
381         ),
382     ]
385 set_config(
386     "GRADLE_ANDROID_INSTALL_GECKOVIEW_EXAMPLE_TASKS",
387     gradle_android_install_geckoview_example_tasks,
391 @dependable
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
396     return [
397         "downloadDependencies",
398     ]
401 @depends(
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
421 # offline mode.
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).
434 option(
435     env="GRADLE_MAVEN_REPOSITORIES",
436     nargs="+",
437     default=(
438         "https://maven.google.com/",
439         "https://jcenter.bintray.com/",
440         "https://plugins.gradle.org/m2/",
441     ),
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):
449     if not values:
450         die("GRADLE_MAVEN_REPOSITORIES must not be empty")
451     if not all(values):
452         die("GRADLE_MAVEN_REPOSITORIES entries must not be empty")
453     return values
456 set_config("GRADLE_MAVEN_REPOSITORIES", gradle_maven_repositories)