358 lines
14 KiB
Groovy
358 lines
14 KiB
Groovy
/*
|
|
* Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
|
|
*/
|
|
|
|
|
|
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
|
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
|
|
import org.jetbrains.kotlin.konan.target.HostManager
|
|
import org.jetbrains.dokka.gradle.DokkaTaskPartial
|
|
|
|
import static Projects.*
|
|
|
|
apply plugin: 'jdk-convention'
|
|
|
|
buildscript {
|
|
/*
|
|
* These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
|
|
* How does it work:
|
|
* When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version,
|
|
* atomicfu_version is overwritten by TeamCity environment (AFU is built with snapshot and published to mavenLocal
|
|
* as previous step or the snapshot build).
|
|
* Additionally, mavenLocal and Sonatype snapshots are added to repository list and stress tests are disabled.
|
|
* DO NOT change the name of these properties without adapting kotlinx.train build chain.
|
|
*/
|
|
def prop = rootProject.properties['build_snapshot_train']
|
|
ext.build_snapshot_train = prop != null && prop != ""
|
|
if (build_snapshot_train) {
|
|
ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
|
|
if (kotlin_version == null) {
|
|
throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler")
|
|
}
|
|
}
|
|
ext.native_targets_enabled = rootProject.properties['disable_native_targets'] == null
|
|
|
|
// Determine if any project dependency is using a snapshot version
|
|
ext.using_snapshot_version = build_snapshot_train
|
|
rootProject.properties.each { key, value ->
|
|
if (key.endsWith("_version") && value instanceof String && value.endsWith("-SNAPSHOT")) {
|
|
println("NOTE: USING SNAPSHOT VERSION: $key=$value")
|
|
ext.using_snapshot_version = true
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
maven { url "https://plugins.gradle.org/m2/" }
|
|
maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
|
|
mavenLocal()
|
|
}
|
|
|
|
dependencies {
|
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
|
|
classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
|
|
classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
|
|
classpath "com.github.node-gradle:gradle-node-plugin:$gradle_node_version"
|
|
classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version"
|
|
classpath "ru.vyarus:gradle-animalsniffer-plugin:1.5.4" // Android API check
|
|
classpath "org.jetbrains.kotlinx:kover:$kover_version"
|
|
|
|
// JMH plugins
|
|
classpath "gradle.plugin.com.github.johnrengelman:shadow:7.1.2"
|
|
}
|
|
|
|
CacheRedirector.configureBuildScript(buildscript, rootProject)
|
|
}
|
|
// todo:KLUDGE: Hierarchical project structures are not fully supported in IDEA, enable only for a regular built
|
|
if (!Idea.active) {
|
|
ext.set("kotlin.mpp.enableGranularSourceSetsMetadata", "true")
|
|
}
|
|
|
|
// todo:KLUDGE: This is needed to workaround dependency resolution between Java and MPP modules
|
|
def configureKotlinJvmPlatform(configuration) {
|
|
configuration.attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm)
|
|
}
|
|
|
|
allprojects {
|
|
// the only place where HostManager could be instantiated
|
|
project.ext.hostManager = new HostManager()
|
|
def deployVersion = properties['DeployVersion']
|
|
if (deployVersion != null) version = deployVersion
|
|
|
|
if (build_snapshot_train) {
|
|
ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
|
|
println "Using Kotlin $kotlin_version for project $it"
|
|
|
|
def skipSnapshotChecks = rootProject.properties['skip_snapshot_checks'] != null
|
|
if (!skipSnapshotChecks && version != atomicfu_version) {
|
|
throw new IllegalStateException("Current deploy version is $version, but atomicfu version is not overridden ($atomicfu_version) for $it")
|
|
}
|
|
|
|
kotlin_version = rootProject.properties['kotlin_snapshot_version']
|
|
}
|
|
|
|
ext.unpublished = unpublished
|
|
|
|
// This project property is set during nightly stress test
|
|
def stressTest = project.properties['stressTest']
|
|
|
|
// Copy it to all test tasks
|
|
tasks.withType(Test) {
|
|
systemProperty 'stressTest', stressTest
|
|
}
|
|
}
|
|
|
|
apply plugin: "binary-compatibility-validator"
|
|
apply plugin: "base"
|
|
apply plugin: "kover-conventions"
|
|
|
|
apiValidation {
|
|
ignoredProjects += unpublished + ["kotlinx-coroutines-bom"]
|
|
if (build_snapshot_train) {
|
|
ignoredProjects.remove("example-frontend-js")
|
|
ignoredProjects.add(coreModule)
|
|
}
|
|
ignoredPackages += "kotlinx.coroutines.internal"
|
|
}
|
|
|
|
// Configure repositories
|
|
allprojects {
|
|
repositories {
|
|
/*
|
|
* google should be first in the repository list because some of the play services
|
|
* transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution
|
|
*/
|
|
google()
|
|
mavenCentral()
|
|
maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
|
|
}
|
|
}
|
|
|
|
// needs to be before evaluationDependsOn due to weird Gradle ordering
|
|
apply plugin: "animalsniffer-conventions"
|
|
|
|
// Add dependency to core source sets. Core is configured in kx-core/build.gradle
|
|
configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) {
|
|
evaluationDependsOn(":$coreModule")
|
|
if (isMultiplatform(it)) {
|
|
apply plugin: "kotlin-multiplatform"
|
|
apply from: rootProject.file("gradle/compile-jvm-multiplatform.gradle")
|
|
apply from: rootProject.file("gradle/compile-common.gradle")
|
|
|
|
if (rootProject.ext["native_targets_enabled"] as Boolean) {
|
|
apply from: rootProject.file("gradle/compile-native-multiplatform.gradle")
|
|
}
|
|
|
|
apply from: rootProject.file("gradle/compile-js-multiplatform.gradle")
|
|
apply from: rootProject.file("gradle/publish-npm-js.gradle")
|
|
kotlin.sourceSets.commonMain.dependencies {
|
|
api project(":$coreModule")
|
|
}
|
|
kotlin.sourceSets.jvmTest.dependencies {
|
|
implementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
|
|
}
|
|
} else {
|
|
def platform = PlatformKt.platformOf(it)
|
|
apply plugin: "kotlin-${platform}-conventions"
|
|
dependencies {
|
|
api project(":$coreModule")
|
|
// the only way IDEA can resolve test classes
|
|
testImplementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
|
|
}
|
|
}
|
|
}
|
|
|
|
apply plugin: "bom-conventions"
|
|
|
|
// Configure subprojects with Kotlin sources
|
|
configure(subprojects.findAll { !sourceless.contains(it.name) }) {
|
|
// Use atomicfu plugin, it also adds all the necessary dependencies
|
|
apply plugin: 'kotlinx-atomicfu'
|
|
|
|
// Configure options for all Kotlin compilation tasks
|
|
tasks.withType(AbstractKotlinCompile).all {
|
|
kotlinOptions.freeCompilerArgs += OptInPreset.optInAnnotations.collect { "-Xopt-in=" + it }
|
|
kotlinOptions.freeCompilerArgs += "-progressive"
|
|
// Disable KT-36770 for RxJava2 integration
|
|
kotlinOptions.freeCompilerArgs += "-XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated"
|
|
// Remove null assertions to get smaller bytecode on Android
|
|
kotlinOptions.freeCompilerArgs += ["-Xno-param-assertions", "-Xno-receiver-assertions", "-Xno-call-assertions"]
|
|
}
|
|
}
|
|
|
|
if (build_snapshot_train) {
|
|
println "Hacking test tasks, removing stress and flaky tests"
|
|
allprojects {
|
|
tasks.withType(Test).all {
|
|
exclude '**/*LinearizabilityTest*'
|
|
exclude '**/*LFTest*'
|
|
exclude '**/*StressTest*'
|
|
exclude '**/*scheduling*'
|
|
exclude '**/*Timeout*'
|
|
exclude '**/*definitely/not/kotlinx*'
|
|
// Disable because of KT-11567 in 1.4
|
|
exclude '**/*CasesPublicAPITest*'
|
|
// Kotlin
|
|
exclude '**/*PrecompiledDebugProbesTest*'
|
|
}
|
|
}
|
|
|
|
println "Manifest of kotlin-compiler-embeddable.jar for coroutines"
|
|
configure(subprojects.findAll { it.name == coreModule }) {
|
|
configurations.matching { it.name == "kotlinCompilerClasspath" }.all {
|
|
resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each {
|
|
def manifest = zipTree(it).matching {
|
|
include 'META-INF/MANIFEST.MF'
|
|
}.getFiles().first()
|
|
|
|
manifest.readLines().each {
|
|
println it
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
|
|
configure(subprojects.findAll {
|
|
!sourceless.contains(it.name) && !isMultiplatform(it) &&
|
|
it.name != "benchmarks" &&
|
|
it.name != "example-frontend-js"
|
|
}) {
|
|
// Pure JS and pure MPP doesn't have this notion and are configured separately
|
|
// TODO detect it via platformOf and migrate benchmarks to the same scheme
|
|
sourceSets {
|
|
main.kotlin.srcDirs = ['src']
|
|
test.kotlin.srcDirs = ['test']
|
|
main.resources.srcDirs = ['resources']
|
|
test.resources.srcDirs = ['test-resources']
|
|
}
|
|
}
|
|
|
|
def core_docs_url = "https://kotlinlang.org/api/kotlinx.coroutines/$coreModule/"
|
|
def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/htmlPartial/package-list"
|
|
apply plugin: "org.jetbrains.dokka"
|
|
|
|
configure(subprojects.findAll { !unpublished.contains(it.name) && it.name != coreModule }) {
|
|
if (it.name != 'kotlinx-coroutines-bom') {
|
|
apply from: rootProject.file('gradle/dokka.gradle.kts')
|
|
}
|
|
apply from: rootProject.file('gradle/publish.gradle')
|
|
}
|
|
|
|
configure(subprojects.findAll { !unpublished.contains(it.name) }) {
|
|
if (it.name != "kotlinx-coroutines-bom") {
|
|
if (it.name != coreModule) {
|
|
tasks.withType(DokkaTaskPartial.class) {
|
|
dokkaSourceSets.configureEach {
|
|
externalDocumentationLink {
|
|
url.set(new URL(core_docs_url))
|
|
packageListUrl.set(new File(core_docs_file).toURI().toURL())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
def thisProject = it
|
|
if (thisProject.name in sourceless) {
|
|
return
|
|
}
|
|
|
|
def versionFileTask = thisProject.tasks.register("versionFileTask") {
|
|
def name = thisProject.name.replace("-", "_")
|
|
def versionFile = thisProject.layout.buildDirectory.file("${name}.version")
|
|
it.outputs.file(versionFile)
|
|
|
|
it.doLast {
|
|
versionFile.get().asFile.text = version.toString()
|
|
}
|
|
}
|
|
|
|
List<String> jarTasks
|
|
if (isMultiplatform(it)) {
|
|
jarTasks = ["jvmJar", "metadataJar"]
|
|
} else if (it.name == "kotlinx-coroutines-debug") {
|
|
// We shadow debug module instead of just packaging it
|
|
jarTasks = ["shadowJar"]
|
|
} else {
|
|
jarTasks = ["jar"]
|
|
}
|
|
|
|
for (name in jarTasks) {
|
|
thisProject.tasks.named(name, Jar) {
|
|
it.dependsOn versionFileTask
|
|
it.from(versionFileTask) {
|
|
into("META-INF")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Report Kotlin compiler version when building project
|
|
println("Using Kotlin compiler version: $KotlinCompilerVersion.VERSION")
|
|
|
|
// --------------- Cache redirector ---------------
|
|
|
|
allprojects {
|
|
CacheRedirector.configure(project)
|
|
}
|
|
|
|
// --------------- Configure sub-projects that are published ---------------
|
|
|
|
def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm", true)
|
|
|
|
task deploy(dependsOn: publishTasks)
|
|
|
|
clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }
|
|
|
|
// --------------- Knit configuration ---------------
|
|
|
|
apply plugin: 'kotlinx-knit'
|
|
|
|
knit {
|
|
siteRoot = "https://kotlinlang.org/api/kotlinx.coroutines"
|
|
moduleRoots = [".", "integration", "reactive", "ui"]
|
|
moduleDocs = "build/dokka/htmlPartial"
|
|
dokkaMultiModuleRoot = "build/dokka/htmlMultiModule/"
|
|
}
|
|
|
|
knitPrepare.dependsOn getTasksByName("dokkaHtmlMultiModule", true)
|
|
|
|
dependencies {
|
|
dokkaHtmlMultiModulePlugin("org.jetbrains.kotlinx:dokka-pathsaver-plugin:$knit_version")
|
|
}
|
|
|
|
// Opt-in for build scan in order to troubleshoot Gradle on TC
|
|
if (hasProperty('buildScan')) {
|
|
buildScan {
|
|
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
|
|
termsOfServiceAgree = 'yes'
|
|
}
|
|
}
|
|
|
|
/*
|
|
* kotlinx-coroutines-core dependency leaks into test runtime classpath via kotlin-compiler-embeddable
|
|
* and conflicts with our own test/runtime incompatibilities (e.g. when class is moved from a main to test),
|
|
* so we do substitution here
|
|
*/
|
|
allprojects { subProject ->
|
|
subProject
|
|
.configurations
|
|
.matching {
|
|
// Excluding substituted project itself because of circular dependencies, but still do it
|
|
// for "*Test*" configurations
|
|
subProject.name != coreModule || it.name.contains("Test")
|
|
}
|
|
.configureEach { conf ->
|
|
conf.resolutionStrategy.dependencySubstitution {
|
|
substitute(module("org.jetbrains.kotlinx:$coreModule"))
|
|
.using(project(":$coreModule"))
|
|
.because("Because Kotlin compiler embeddable leaks coroutines into the runtime classpath, " +
|
|
"triggering all sort of incompatible class changes errors")
|
|
}
|
|
}
|
|
}
|