summaryrefslogtreecommitdiffstats
path: root/mobile/android/fenix/build.gradle
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/fenix/build.gradle')
-rw-r--r--mobile/android/fenix/build.gradle216
1 files changed, 216 insertions, 0 deletions
diff --git a/mobile/android/fenix/build.gradle b/mobile/android/fenix/build.gradle
new file mode 100644
index 0000000000..097d30e937
--- /dev/null
+++ b/mobile/android/fenix/build.gradle
@@ -0,0 +1,216 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+import io.gitlab.arturbosch.detekt.Detekt
+import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+import java.nio.file.Files
+import java.nio.file.Paths
+import java.nio.file.StandardCopyOption
+
+buildscript {
+ // This logic is duplicated in the allprojects block: I don't know how to fix that.
+ repositories {
+ gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORIES.each { repository ->
+ maven {
+ url repository
+ if (gradle.mozconfig.substs.ALLOW_INSECURE_GRADLE_REPOSITORIES) {
+ allowInsecureProtocol = true
+ }
+ }
+ }
+ }
+
+ dependencies {
+ classpath ComponentsDependencies.tools_androidgradle
+ classpath ComponentsDependencies.tools_kotlingradle
+ classpath FenixDependencies.tools_benchmarkgradle
+ classpath ComponentsDependencies.androidx_safeargs
+ classpath FenixDependencies.osslicenses_plugin
+ classpath "org.mozilla.telemetry:glean-gradle-plugin:${Versions.mozilla_glean}"
+ classpath "${ApplicationServicesConfig.groupId}:tooling-nimbus-gradle:${ApplicationServicesConfig.version}"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+
+ // Variables in plugins {} aren't directly supported. Hack around it by setting an
+ // intermediate variable which can pull from FenixDependenciesPlugin.kt and be used later.
+ ext {
+ detekt_plugin = Versions.detekt
+ ksp_plugin = Versions.ksp_plugin
+ protobuf_plugin = FenixVersions.protobuf_plugin
+ python_envs_plugin = Versions.python_envs_plugin
+ }
+}
+
+plugins {
+ id("io.gitlab.arturbosch.detekt").version("$detekt_plugin")
+ id("com.google.devtools.ksp").version("$ksp_plugin")
+}
+
+allprojects {
+ // This logic is duplicated in the buildscript block: I don't know how to fix that.
+ repositories {
+ gradle.mozconfig.substs.GRADLE_MAVEN_REPOSITORIES.each { repository ->
+ maven {
+ url repository
+ if (gradle.mozconfig.substs.ALLOW_INSECURE_GRADLE_REPOSITORIES) {
+ allowInsecureProtocol = true
+ }
+ }
+ }
+
+ maven {
+ url "${gradle.mozconfig.topobjdir}/gradle/maven"
+ }
+ }
+
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions.allWarningsAsErrors = true
+ kotlinOptions.freeCompilerArgs += [
+ "-opt-in=kotlin.RequiresOptIn", "-Xjvm-default=all-compatibility"
+ ]
+ }
+}
+
+subprojects {
+ afterEvaluate {
+ kotlin {
+ jvmToolchain(config.jvmTargetCompatibility)
+ }
+ }
+
+ tasks.withType(KotlinCompile).configureEach { task ->
+ // Translate Kotlin messages like "w: ..." and "e: ..." into
+ // "...: warning: ..." and "...: error: ...", to make Treeherder understand.
+ def listener = {
+
+ if (it.startsWith("e: warnings found")) {
+ return
+ }
+
+ if (it.startsWith('w: ') || it.startsWith('e: ')) {
+ def matches = (it =~ /([ew]): (.+):(\d+):(\d+) (.*)/)
+ if (!matches) {
+ logger.quiet "kotlinc message format has changed!"
+ if (it.startsWith('w: ')) {
+ // For warnings, don't continue because we don't want to throw an
+ // exception. For errors, we want the exception so that the new error
+ // message format gets translated properly.
+ return
+ }
+ }
+ def (_, type, file, line, column, message) = matches[0]
+ type = (type == 'w') ? 'warning' : 'error'
+ // Use logger.lifecycle, which does not go through stderr again.
+ logger.lifecycle "$file:$line:$column: $type: $message"
+ }
+ } as StandardOutputListener
+
+ doFirst {
+ logging.addStandardErrorListener(listener)
+ }
+ doLast {
+ logging.removeStandardErrorListener(listener)
+ }
+ }
+}
+
+tasks.register('clean', Delete) {
+ delete rootProject.layout.buildDirectory
+}
+
+detekt {
+ input = files("$projectDir/app/src")
+ config = files("$projectDir/config/detekt.yml")
+
+ reports {
+ html {
+ enabled = true
+ destination = file("$projectDir/build/reports/detekt.html")
+ }
+ xml {
+ enabled = false
+ }
+ txt {
+ enabled = false
+ }
+ }
+}
+
+tasks.withType(Detekt).configureEach() {
+ autoCorrect = true
+
+ exclude "**/test/**"
+ exclude "**/androidTest/**"
+ exclude "**/build/**"
+ exclude "**/resources/**"
+ exclude "**/tmp/**"
+}
+
+// Apply same path exclusions as for the main task
+tasks.withType(DetektCreateBaselineTask).configureEach() {
+ exclude "**/test/**"
+ exclude "**/androidTest/**"
+ exclude "**/build/**"
+ exclude "**/resources/**"
+ exclude "**/tmp/**"
+}
+
+configurations {
+ ktlint
+}
+
+dependencies {
+ ktlint("com.pinterest:ktlint:${Versions.ktlint}") {
+ attributes {
+ attribute(Bundling.BUNDLING_ATTRIBUTE, getObjects().named(Bundling, Bundling.EXTERNAL))
+ }
+ }
+
+ detekt project(":mozilla-detekt-rules")
+ detekt "io.gitlab.arturbosch.detekt:detekt-cli:${Versions.detekt}"
+}
+
+tasks.register('ktlint', JavaExec) {
+ group = "verification"
+ description = "Check Kotlin code style."
+ classpath = configurations.ktlint
+ mainClass.set("com.pinterest.ktlint.Main")
+ args "app/src/**/*.kt", "!**/build/**/*.kt", "--baseline=ktlint-baseline.xml"
+}
+
+tasks.register('ktlintFormat', JavaExec) {
+ description = "Fix Kotlin code style deviations."
+ classpath = configurations.ktlint
+ mainClass.set("com.pinterest.ktlint.Main")
+ args "-F", "app/src/**/*.kt", "!**/build/**/*.kt", "--baseline=ktlint-baseline.xml"
+ jvmArgs("--add-opens", "java.base/java.lang=ALL-UNNAMED")
+}
+
+tasks.withType(Detekt.class).configureEach {
+ exclude("**/resources/**")
+ exclude("**/tmp/**")
+}
+
+tasks.register("listRepositories") {
+ doLast {
+ println "Repositories:"
+ project.repositories.each { println "Name: " + it.name + "; url: " + it.url }
+ }
+}
+
+// Task to copy generated baseline profile to the app module nightly variant.
+tasks.register("copyBaselineProfile", DefaultTask) {
+ doLast {
+ File profileFile = fileTree('benchmark/build/outputs') {
+ include '**/*baseline-prof.txt'
+ }.getSingleFile()
+ def destinationPath = Paths.get("app", "src", "nightly", "baselineProfiles", "baseline-prof.txt")
+ File destinationDir = destinationPath.toFile().parentFile
+ if (!destinationDir.exists()) {
+ destinationDir.mkdirs()
+ }
+ Files.copy(profileFile.toPath(), destinationPath, StandardCopyOption.REPLACE_EXISTING)
+ }
+}