xref: /aosp_15_r20/external/accompanist/build.gradle (revision fa44fe6ae8e729aa3cfe5c03eedbbf98fb44e2c6)
1*fa44fe6aSInna Palant/*
2*fa44fe6aSInna Palant * Copyright 2020 The Android Open Source Project
3*fa44fe6aSInna Palant *
4*fa44fe6aSInna Palant * Licensed under the Apache License, Version 2.0 (the "License");
5*fa44fe6aSInna Palant * you may not use this file except in compliance with the License.
6*fa44fe6aSInna Palant * You may obtain a copy of the License at
7*fa44fe6aSInna Palant *
8*fa44fe6aSInna Palant *      https://www.apache.org/licenses/LICENSE-2.0
9*fa44fe6aSInna Palant *
10*fa44fe6aSInna Palant * Unless required by applicable law or agreed to in writing, software
11*fa44fe6aSInna Palant * distributed under the License is distributed on an "AS IS" BASIS,
12*fa44fe6aSInna Palant * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*fa44fe6aSInna Palant * See the License for the specific language governing permissions and
14*fa44fe6aSInna Palant * limitations under the License.
15*fa44fe6aSInna Palant */
16*fa44fe6aSInna Palant
17*fa44fe6aSInna Palantbuildscript {
18*fa44fe6aSInna Palant    repositories {
19*fa44fe6aSInna Palant        google()
20*fa44fe6aSInna Palant        mavenCentral()
21*fa44fe6aSInna Palant        gradlePluginPortal()
22*fa44fe6aSInna Palant    }
23*fa44fe6aSInna Palant
24*fa44fe6aSInna Palant    dependencies {
25*fa44fe6aSInna Palant        classpath libs.android.tools.build.gradle
26*fa44fe6aSInna Palant        classpath libs.android.gradlePlugin
27*fa44fe6aSInna Palant        classpath libs.kotlin.gradlePlugin
28*fa44fe6aSInna Palant
29*fa44fe6aSInna Palant        classpath libs.gradleMavenPublishPlugin
30*fa44fe6aSInna Palant
31*fa44fe6aSInna Palant        classpath libs.metalavaGradle
32*fa44fe6aSInna Palant
33*fa44fe6aSInna Palant        classpath libs.affectedmoduledetector
34*fa44fe6aSInna Palant    }
35*fa44fe6aSInna Palant}
36*fa44fe6aSInna Palant
37*fa44fe6aSInna Palantplugins {
38*fa44fe6aSInna Palant    id "com.diffplug.spotless" version "6.5.2"
39*fa44fe6aSInna Palant    alias(libs.plugins.jetbrains.dokka)
40*fa44fe6aSInna Palant}
41*fa44fe6aSInna Palant
42*fa44fe6aSInna Palantapply plugin: 'com.dropbox.affectedmoduledetector'
43*fa44fe6aSInna Palantapply plugin: 'com.diffplug.spotless'
44*fa44fe6aSInna Palant
45*fa44fe6aSInna Palanttasks.withType(org.jetbrains.dokka.gradle.DokkaMultiModuleTask).configureEach {
46*fa44fe6aSInna Palant    outputDirectory = rootProject.file('docs/api')
47*fa44fe6aSInna Palant    failOnWarning = true
48*fa44fe6aSInna Palant}
49*fa44fe6aSInna Palant
50*fa44fe6aSInna PalantaffectedModuleDetector {
51*fa44fe6aSInna Palant    baseDir = "${project.rootDir}"
52*fa44fe6aSInna Palant    pathsAffectingAllModules = [
53*fa44fe6aSInna Palant            "gradle/libs.versions.toml",
54*fa44fe6aSInna Palant    ]
55*fa44fe6aSInna Palant    excludedModules = [
56*fa44fe6aSInna Palant            "sample"
57*fa44fe6aSInna Palant    ]
58*fa44fe6aSInna Palant
59*fa44fe6aSInna Palant    logFilename = "output.log"
60*fa44fe6aSInna Palant    logFolder = "${rootProject.buildDir}/affectedModuleDetector"
61*fa44fe6aSInna Palant
62*fa44fe6aSInna Palant    String baseRef = findProperty("affected_base_ref")
63*fa44fe6aSInna Palant    // If we have a base ref to diff against, extract the branch name and use it
64*fa44fe6aSInna Palant    if (baseRef != null && !baseRef.isEmpty()) {
65*fa44fe6aSInna Palant        // Remove the prefix from the head.
66*fa44fe6aSInna Palant        // TODO: need to support other types of git refs
67*fa44fe6aSInna Palant        specifiedBranch = baseRef.replace('refs/heads/', '')
68*fa44fe6aSInna Palant        compareFrom = "SpecifiedBranchCommit"
69*fa44fe6aSInna Palant    } else {
70*fa44fe6aSInna Palant        // Otherwise we use the previous commit. This is mostly used for commits to main.
71*fa44fe6aSInna Palant        compareFrom = "PreviousCommit"
72*fa44fe6aSInna Palant    }
73*fa44fe6aSInna Palant}
74*fa44fe6aSInna Palant
75*fa44fe6aSInna Palantallprojects {
76*fa44fe6aSInna Palant    repositories {
77*fa44fe6aSInna Palant        google()
78*fa44fe6aSInna Palant        mavenCentral()
79*fa44fe6aSInna Palant
80*fa44fe6aSInna Palant        def composeSnapshot = libs.versions.composesnapshot.get()
81*fa44fe6aSInna Palant        if (composeSnapshot.length() > 1) {
82*fa44fe6aSInna Palant            maven { url "https://androidx.dev/snapshots/builds/$composeSnapshot/artifacts/repository/" }
83*fa44fe6aSInna Palant        }
84*fa44fe6aSInna Palant    }
85*fa44fe6aSInna Palant}
86*fa44fe6aSInna Palant
87*fa44fe6aSInna Palantsubprojects {
88*fa44fe6aSInna Palant    apply plugin: 'com.diffplug.spotless'
89*fa44fe6aSInna Palant
90*fa44fe6aSInna Palant    spotless {
91*fa44fe6aSInna Palant        kotlin {
92*fa44fe6aSInna Palant            target "**/*.kt"
93*fa44fe6aSInna Palant            ktlint(libs.versions.ktlint.get())
94*fa44fe6aSInna Palant            licenseHeaderFile rootProject.file('spotless/copyright.txt')
95*fa44fe6aSInna Palant        }
96*fa44fe6aSInna Palant
97*fa44fe6aSInna Palant        groovyGradle {
98*fa44fe6aSInna Palant            target '**/*.gradle'
99*fa44fe6aSInna Palant            greclipse().configFile(rootProject.file('spotless/greclipse.properties'))
100*fa44fe6aSInna Palant            licenseHeaderFile rootProject.file('spotless/copyright.txt'),
101*fa44fe6aSInna Palant                    '(buildscript|apply|import|plugins)'
102*fa44fe6aSInna Palant        }
103*fa44fe6aSInna Palant    }
104*fa44fe6aSInna Palant
105*fa44fe6aSInna Palant    // Remove all test apps after running UI tests.
106*fa44fe6aSInna Palant    // This is specially important in CI so that test emulators don't run out of space.
107*fa44fe6aSInna Palant    tasks.whenTaskAdded { task ->
108*fa44fe6aSInna Palant        if (task.name == 'connectedDebugAndroidTest') {
109*fa44fe6aSInna Palant            task.finalizedBy 'uninstallDebugAndroidTest'
110*fa44fe6aSInna Palant        }
111*fa44fe6aSInna Palant    }
112*fa44fe6aSInna Palant
113*fa44fe6aSInna Palant    configurations.configureEach {
114*fa44fe6aSInna Palant        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
115*fa44fe6aSInna Palant            // Make sure that we're using the Android version of Guava
116*fa44fe6aSInna Palant            if (details.requested.group == 'com.google.guava'
117*fa44fe6aSInna Palant                    && details.requested.module.name == 'guava'
118*fa44fe6aSInna Palant                    && details.requested.version.contains('jre')) {
119*fa44fe6aSInna Palant                details.useVersion details.requested.version.replace('jre', 'android')
120*fa44fe6aSInna Palant            }
121*fa44fe6aSInna Palant        }
122*fa44fe6aSInna Palant    }
123*fa44fe6aSInna Palant
124*fa44fe6aSInna Palant    tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { compile ->
125*fa44fe6aSInna Palant        kotlinOptions {
126*fa44fe6aSInna Palant            // Treat all Kotlin warnings as errors
127*fa44fe6aSInna Palant            allWarningsAsErrors = true
128*fa44fe6aSInna Palant            // Set JVM target to 1.8
129*fa44fe6aSInna Palant            jvmTarget = "1.8"
130*fa44fe6aSInna Palant            // Allow use of @OptIn
131*fa44fe6aSInna Palant            freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
132*fa44fe6aSInna Palant            // Enable default methods in interfaces
133*fa44fe6aSInna Palant            freeCompilerArgs += "-Xjvm-default=all"
134*fa44fe6aSInna Palant        }
135*fa44fe6aSInna Palant    }
136*fa44fe6aSInna Palant
137*fa44fe6aSInna Palant    // Read in the signing.properties file if it is exists
138*fa44fe6aSInna Palant    def signingPropsFile = rootProject.file('release/signing.properties')
139*fa44fe6aSInna Palant    if (signingPropsFile.exists()) {
140*fa44fe6aSInna Palant        def localProperties = new Properties()
141*fa44fe6aSInna Palant        signingPropsFile.withInputStream { is -> localProperties.load(is) }
142*fa44fe6aSInna Palant        localProperties.each { prop ->
143*fa44fe6aSInna Palant            if (prop.key == "signing.secretKeyRingFile") {
144*fa44fe6aSInna Palant                // If this is the key ring, treat it as a relative path
145*fa44fe6aSInna Palant                project.ext.set(prop.key, rootProject.file(prop.value).absolutePath)
146*fa44fe6aSInna Palant            } else {
147*fa44fe6aSInna Palant                project.ext.set(prop.key, prop.value)
148*fa44fe6aSInna Palant            }
149*fa44fe6aSInna Palant        }
150*fa44fe6aSInna Palant    }
151*fa44fe6aSInna Palant
152*fa44fe6aSInna Palant    // Must be afterEvaluate or else com.vanniktech.maven.publish will overwrite our
153*fa44fe6aSInna Palant    // dokka and version configuration.
154*fa44fe6aSInna Palant    afterEvaluate {
155*fa44fe6aSInna Palant        if (tasks.findByName('dokkaHtmlPartial') == null) {
156*fa44fe6aSInna Palant            // If dokka isn't enabled on this module, skip
157*fa44fe6aSInna Palant            return
158*fa44fe6aSInna Palant        }
159*fa44fe6aSInna Palant
160*fa44fe6aSInna Palant        tasks.named('dokkaHtmlPartial') {
161*fa44fe6aSInna Palant            dokkaSourceSets.configureEach {
162*fa44fe6aSInna Palant                reportUndocumented.set(true)
163*fa44fe6aSInna Palant                skipEmptyPackages.set(true)
164*fa44fe6aSInna Palant                skipDeprecated.set(true)
165*fa44fe6aSInna Palant                jdkVersion.set(8)
166*fa44fe6aSInna Palant
167*fa44fe6aSInna Palant                // Add Android SDK packages
168*fa44fe6aSInna Palant                noAndroidSdkLink.set(false)
169*fa44fe6aSInna Palant
170*fa44fe6aSInna Palant                // Add samples from :sample module
171*fa44fe6aSInna Palant                samples.from(rootProject.file("sample/src/main/java/"))
172*fa44fe6aSInna Palant
173*fa44fe6aSInna Palant                // AndroidX + Compose docs
174*fa44fe6aSInna Palant                externalDocumentationLink {
175*fa44fe6aSInna Palant                    url.set(new URL("https://developer.android.com/reference/"))
176*fa44fe6aSInna Palant                    packageListUrl.set(new URL("https://developer.android.com/reference/androidx/package-list"))
177*fa44fe6aSInna Palant                }
178*fa44fe6aSInna Palant                externalDocumentationLink {
179*fa44fe6aSInna Palant                    url.set(new URL("https://developer.android.com/reference/kotlin/"))
180*fa44fe6aSInna Palant                    packageListUrl.set(new URL("https://developer.android.com/reference/kotlin/androidx/package-list"))
181*fa44fe6aSInna Palant                }
182*fa44fe6aSInna Palant
183*fa44fe6aSInna Palant                sourceLink {
184*fa44fe6aSInna Palant                    localDirectory.set(project.file("src/main/java"))
185*fa44fe6aSInna Palant                    // URL showing where the source code can be accessed through the web browser
186*fa44fe6aSInna Palant                    remoteUrl.set(new URL("https://github.com/google/accompanist/blob/main/${project.name}/src/main/java"))
187*fa44fe6aSInna Palant                    // Suffix which is used to append the line number to the URL. Use #L for GitHub
188*fa44fe6aSInna Palant                    remoteLineSuffix.set("#L")
189*fa44fe6aSInna Palant                }
190*fa44fe6aSInna Palant            }
191*fa44fe6aSInna Palant        }
192*fa44fe6aSInna Palant    }
193*fa44fe6aSInna Palant
194*fa44fe6aSInna Palant    afterEvaluate {
195*fa44fe6aSInna Palant        def composeSnapshot = libs.versions.composesnapshot.get()
196*fa44fe6aSInna Palant        if (composeSnapshot.length() > 1) {
197*fa44fe6aSInna Palant            // We're depending on a Jetpack Compose snapshot, update the library version name
198*fa44fe6aSInna Palant            // to indicate it's from a Compose snapshot
199*fa44fe6aSInna Palant            def versionName = project.properties.get('VERSION_NAME')
200*fa44fe6aSInna Palant            if (versionName.contains("SNAPSHOT")) {
201*fa44fe6aSInna Palant                version = versionName.replace('-SNAPSHOT', ".compose-${composeSnapshot}-SNAPSHOT")
202*fa44fe6aSInna Palant            }
203*fa44fe6aSInna Palant        }
204*fa44fe6aSInna Palant
205*fa44fe6aSInna Palant        if (!version.endsWith('SNAPSHOT')) {
206*fa44fe6aSInna Palant            // If we're not a SNAPSHOT library version, we fail the build if we're relying on
207*fa44fe6aSInna Palant            // any snapshot dependencies
208*fa44fe6aSInna Palant            configurations.configureEach { configuration ->
209*fa44fe6aSInna Palant                configuration.dependencies.configureEach { dependency ->
210*fa44fe6aSInna Palant                    if (dependency instanceof ProjectDependency) {
211*fa44fe6aSInna Palant                        // We don't care about internal project dependencies
212*fa44fe6aSInna Palant                        return
213*fa44fe6aSInna Palant                    }
214*fa44fe6aSInna Palant
215*fa44fe6aSInna Palant                    def depVersion = dependency.version
216*fa44fe6aSInna Palant                    if (depVersion != null && depVersion.endsWith('SNAPSHOT')) {
217*fa44fe6aSInna Palant                        throw new IllegalArgumentException(
218*fa44fe6aSInna Palant                                "Using SNAPSHOT dependency with non-SNAPSHOT library version: $dependency"
219*fa44fe6aSInna Palant                        )
220*fa44fe6aSInna Palant                    }
221*fa44fe6aSInna Palant                }
222*fa44fe6aSInna Palant            }
223*fa44fe6aSInna Palant        }
224*fa44fe6aSInna Palant    }
225*fa44fe6aSInna Palant}
226