
com.freeletics.gradle.plugin.FreeleticsBasePlugin.kt Maven / Gradle / Ivy
package com.freeletics.gradle.plugin
import com.freeletics.gradle.util.KotlinAndroidProjectExtensionDelegate
import com.freeletics.gradle.util.addMaybe
import com.freeletics.gradle.util.booleanProperty
import com.freeletics.gradle.util.getBundleOrNull
import com.freeletics.gradle.util.getVersionOrNull
import com.freeletics.gradle.util.java
import com.freeletics.gradle.util.javaTarget
import com.freeletics.gradle.util.javaToolchainVersion
import com.freeletics.gradle.util.jvmTarget
import com.freeletics.gradle.util.kotlin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.jvm.tasks.Jar
import org.gradle.jvm.toolchain.JvmVendorSpec
import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
public abstract class FreeleticsBasePlugin : Plugin {
override fun apply(target: Project) {
target.plugins.apply("com.autonomousapps.dependency-analysis")
target.extensions.create("freeletics", FreeleticsBaseExtension::class.java)
target.makeJarsReproducible()
target.addDefaultDependencies()
target.addDefaultTestDependencies()
target.configureJava()
target.configureKotlin()
}
private fun Project.makeJarsReproducible() {
tasks.withType(Jar::class.java).configureEach {
// Jar contents should be ordered consistently
it.isReproducibleFileOrder = true
// Jar contents should not have unique timestamps
it.isPreserveFileTimestamps = false
}
}
private fun Project.addDefaultDependencies() {
dependencies.addMaybe("implementation", getBundleOrNull("default-all"))
dependencies.addMaybe("compileOnly", getBundleOrNull("default-all-compile"))
}
private fun Project.addDefaultTestDependencies() {
dependencies.addMaybe("testImplementation", getBundleOrNull("default-testing"))
dependencies.addMaybe("testCompileOnly", getBundleOrNull("default-testing-compile"))
dependencies.addMaybe("testRuntimeOnly", getBundleOrNull("default-testing-runtime"))
}
private fun Project.configureJava() {
java {
toolchain {
it.languageVersion.set(javaToolchainVersion)
it.vendor.set(JvmVendorSpec.AZUL)
}
}
}
private fun Project.configureKotlin() {
kotlin {
jvmToolchain { toolchain ->
toolchain.languageVersion.set(javaToolchainVersion)
toolchain.vendor.set(JvmVendorSpec.AZUL)
}
val isAndroid = this is KotlinAndroidProjectExtensionDelegate
compilerOptions {
val version = getVersionOrNull("kotlin-language")
?.let(KotlinVersion::fromVersion) ?: KotlinVersion.DEFAULT
languageVersion.set(version)
allWarningsAsErrors.set(!booleanProperty("fgp.kotlin.allowWarnings", false).get())
// In this mode, some deprecations and bug-fixes for unstable code take effect immediately.
progressiveMode.set(version >= KotlinVersion.DEFAULT)
// Support inferring type arguments based on only self upper bounds of the corresponding type parameters
// https://kotlinlang.org/docs/whatsnew1530.html#improvements-to-type-inference-for-recursive-generic-types
freeCompilerArgs.add("-Xself-upper-bound-inference")
if (this is KotlinJvmCompilerOptions) {
jvmTarget.set(project.jvmTarget)
freeCompilerArgs.addAll(
// https://blog.jetbrains.com/kotlin/2020/07/kotlin-1-4-m3-generating-default-methods-in-interfaces/
"-Xjvm-default=all",
// https://youtrack.jetbrains.com/issue/KT-22292
"-Xassertions=jvm",
// Enabling default nullability annotations
"-Xjsr305=strict",
// https://kotlinlang.org/docs/whatsnew1520.html#support-for-jspecify-nullness-annotations
"-Xjspecify-annotations=strict",
// Enhance not null annotated type parameter's types to definitely not null types (@NotNull T => T & Any)
"-Xenhance-type-parameter-types-to-def-not-null",
)
if (!isAndroid) {
freeCompilerArgs.add("-Xjdk-release=${project.javaTarget}")
}
if (project.booleanProperty("fgp.kotlin.fastJarFs", false).get()) {
freeCompilerArgs.add("-Xuse-fast-jar-file-system")
}
// TODO workaround for incremental issue when merging java resources
// https://issuetracker.google.com/issues/284003132
moduleName.set(path.substring(1).replace(":", "_"))
}
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy