blob: c1c80c0b7f46bf7d8a9bd9da59fa51f058e4851b [file] [log] [blame]
/*
* Copyright 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
buildscript {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath libs.android.tools.build.gradle
classpath libs.android.gradlePlugin
classpath libs.kotlin.gradlePlugin
classpath libs.gradleMavenPublishPlugin
classpath libs.metalavaGradle
classpath libs.affectedmoduledetector
}
}
plugins {
id "com.diffplug.spotless" version "6.5.2"
alias(libs.plugins.jetbrains.dokka)
}
apply plugin: 'com.dropbox.affectedmoduledetector'
apply plugin: 'com.diffplug.spotless'
tasks.withType(org.jetbrains.dokka.gradle.DokkaMultiModuleTask).configureEach {
outputDirectory = rootProject.file('docs/api')
failOnWarning = true
}
affectedModuleDetector {
baseDir = "${project.rootDir}"
pathsAffectingAllModules = [
"gradle/libs.versions.toml",
]
excludedModules = [
"sample"
]
logFilename = "output.log"
logFolder = "${rootProject.buildDir}/affectedModuleDetector"
String baseRef = findProperty("affected_base_ref")
// If we have a base ref to diff against, extract the branch name and use it
if (baseRef != null && !baseRef.isEmpty()) {
// Remove the prefix from the head.
// TODO: need to support other types of git refs
specifiedBranch = baseRef.replace('refs/heads/', '')
compareFrom = "SpecifiedBranchCommit"
} else {
// Otherwise we use the previous commit. This is mostly used for commits to main.
compareFrom = "PreviousCommit"
}
}
allprojects {
repositories {
google()
mavenCentral()
def composeSnapshot = libs.versions.composesnapshot.get()
if (composeSnapshot.length() > 1) {
maven { url "https://androidx.dev/snapshots/builds/$composeSnapshot/artifacts/repository/" }
}
}
}
subprojects {
apply plugin: 'com.diffplug.spotless'
spotless {
kotlin {
target "**/*.kt"
ktlint(libs.versions.ktlint.get())
licenseHeaderFile rootProject.file('spotless/copyright.txt')
}
groovyGradle {
target '**/*.gradle'
greclipse().configFile(rootProject.file('spotless/greclipse.properties'))
licenseHeaderFile rootProject.file('spotless/copyright.txt'),
'(buildscript|apply|import|plugins)'
}
}
// Remove all test apps after running UI tests.
// This is specially important in CI so that test emulators don't run out of space.
tasks.whenTaskAdded { task ->
if (task.name == 'connectedDebugAndroidTest') {
task.finalizedBy 'uninstallDebugAndroidTest'
}
}
configurations.configureEach {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
// Make sure that we're using the Android version of Guava
if (details.requested.group == 'com.google.guava'
&& details.requested.module.name == 'guava'
&& details.requested.version.contains('jre')) {
details.useVersion details.requested.version.replace('jre', 'android')
}
}
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { compile ->
kotlinOptions {
// Treat all Kotlin warnings as errors
allWarningsAsErrors = true
// Set JVM target to 1.8
jvmTarget = "1.8"
// Allow use of @OptIn
freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
// Enable default methods in interfaces
freeCompilerArgs += "-Xjvm-default=all"
}
}
// Read in the signing.properties file if it is exists
def signingPropsFile = rootProject.file('release/signing.properties')
if (signingPropsFile.exists()) {
def localProperties = new Properties()
signingPropsFile.withInputStream { is -> localProperties.load(is) }
localProperties.each { prop ->
if (prop.key == "signing.secretKeyRingFile") {
// If this is the key ring, treat it as a relative path
project.ext.set(prop.key, rootProject.file(prop.value).absolutePath)
} else {
project.ext.set(prop.key, prop.value)
}
}
}
// Must be afterEvaluate or else com.vanniktech.maven.publish will overwrite our
// dokka and version configuration.
afterEvaluate {
if (tasks.findByName('dokkaHtmlPartial') == null) {
// If dokka isn't enabled on this module, skip
return
}
tasks.named('dokkaHtmlPartial') {
dokkaSourceSets.configureEach {
reportUndocumented.set(true)
skipEmptyPackages.set(true)
skipDeprecated.set(true)
jdkVersion.set(8)
// Add Android SDK packages
noAndroidSdkLink.set(false)
// Add samples from :sample module
samples.from(rootProject.file("sample/src/main/java/"))
// AndroidX + Compose docs
externalDocumentationLink {
url.set(new URL("https://developer.android.com/reference/"))
packageListUrl.set(new URL("https://developer.android.com/reference/androidx/package-list"))
}
externalDocumentationLink {
url.set(new URL("https://developer.android.com/reference/kotlin/"))
packageListUrl.set(new URL("https://developer.android.com/reference/kotlin/androidx/package-list"))
}
sourceLink {
localDirectory.set(project.file("src/main/java"))
// URL showing where the source code can be accessed through the web browser
remoteUrl.set(new URL("https://github.com/google/accompanist/blob/main/${project.name}/src/main/java"))
// Suffix which is used to append the line number to the URL. Use #L for GitHub
remoteLineSuffix.set("#L")
}
}
}
}
afterEvaluate {
def composeSnapshot = libs.versions.composesnapshot.get()
if (composeSnapshot.length() > 1) {
// We're depending on a Jetpack Compose snapshot, update the library version name
// to indicate it's from a Compose snapshot
def versionName = project.properties.get('VERSION_NAME')
if (versionName.contains("SNAPSHOT")) {
version = versionName.replace('-SNAPSHOT', ".compose-${composeSnapshot}-SNAPSHOT")
}
}
if (!version.endsWith('SNAPSHOT')) {
// If we're not a SNAPSHOT library version, we fail the build if we're relying on
// any snapshot dependencies
configurations.configureEach { configuration ->
configuration.dependencies.configureEach { dependency ->
if (dependency instanceof ProjectDependency) {
// We don't care about internal project dependencies
return
}
def depVersion = dependency.version
if (depVersion != null && depVersion.endsWith('SNAPSHOT')) {
throw new IllegalArgumentException(
"Using SNAPSHOT dependency with non-SNAPSHOT library version: $dependency"
)
}
}
}
}
}
}