You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
13 KiB
326 lines
13 KiB
/*
|
|
* Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
|
|
*/
|
|
import org.jetbrains.kotlin.konan.target.HostManager
|
|
import org.gradle.util.VersionNumber
|
|
|
|
apply plugin: 'jdk-convention'
|
|
apply from: rootProject.file("gradle/experimental.gradle")
|
|
|
|
def rootModule = "kotlinx.coroutines"
|
|
def coreModule = "kotlinx-coroutines-core"
|
|
// Not applicable for Kotlin plugin
|
|
def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing']
|
|
def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing']
|
|
// Not published
|
|
def unpublished = internal + ['example-frontend-js', 'android-unit-tests']
|
|
|
|
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")
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|
|
}
|
|
|
|
if (using_snapshot_version) {
|
|
repositories {
|
|
mavenLocal()
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
jcenter()
|
|
maven {
|
|
url "https://kotlin.bintray.com/kotlinx"
|
|
credentials {
|
|
username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
|
|
password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
|
|
}
|
|
}
|
|
// Future replacement for kotlin-dev, with cache redirector
|
|
maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
|
|
maven {
|
|
url "https://kotlin.bintray.com/kotlin-dev"
|
|
credentials {
|
|
username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
|
|
password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
|
|
}
|
|
}
|
|
maven { url "https://kotlin.bintray.com/kotlin-eap" }
|
|
maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" }
|
|
maven { url "https://plugins.gradle.org/m2/" }
|
|
}
|
|
|
|
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.moowork.gradle:gradle-node-plugin:$gradle_node_version"
|
|
classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version"
|
|
|
|
// JMH plugins
|
|
classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0"
|
|
}
|
|
|
|
CacheRedirector.configureBuildScript(buildscript, rootProject)
|
|
}
|
|
|
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
|
|
|
// 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']
|
|
}
|
|
|
|
if (using_snapshot_version) {
|
|
repositories {
|
|
mavenLocal()
|
|
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
|
|
}
|
|
}
|
|
|
|
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"
|
|
apiValidation {
|
|
ignoredProjects += unpublished + ["kotlinx-coroutines-bom"]
|
|
if (build_snapshot_train) {
|
|
ignoredProjects.remove("site")
|
|
ignoredProjects.remove("example-frontend-js")
|
|
ignoredProjects.add("kotlinx-coroutines-core")
|
|
}
|
|
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()
|
|
jcenter()
|
|
// Future replacement for kotlin-dev, with cache redirector
|
|
maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
|
|
maven {
|
|
url "https://kotlin.bintray.com/kotlin-dev"
|
|
credentials {
|
|
username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
|
|
password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
|
|
}
|
|
}
|
|
maven { url "https://kotlin.bintray.com/kotlin-eap" }
|
|
maven {
|
|
url "https://kotlin.bintray.com/kotlinx"
|
|
credentials {
|
|
username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
|
|
password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
|
|
}
|
|
}
|
|
mavenLocal()
|
|
}
|
|
}
|
|
|
|
// 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")
|
|
def platform = PlatformKt.platformOf(it)
|
|
apply from: rootProject.file("gradle/compile-${platform}.gradle")
|
|
dependencies {
|
|
// See comment below for rationale, it will be replaced with "project" dependency
|
|
compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
|
|
// the only way IDEA can resolve test classes
|
|
testCompile project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
|
|
}
|
|
}
|
|
|
|
// 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(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all {
|
|
kotlinOptions.freeCompilerArgs += experimentalAnnotations.collect { "-Xuse-experimental=" + it }
|
|
kotlinOptions.freeCompilerArgs += "-progressive"
|
|
kotlinOptions.freeCompilerArgs += "-XXLanguage:+InlineClasses"
|
|
// 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 == "kotlinx-coroutines-core" }) {
|
|
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Hack to trick nmpp plugin: we are renaming artifacts in order to provide backward compatibility for dependencies,
|
|
* but publishing plugin does not re-read artifact names for kotlin-jvm projects, so renaming is not applied in pom files
|
|
* for JVM-only projects.
|
|
*
|
|
* We artificially replace "project" dependency with "module" one to have proper names in pom files, but then substitute it
|
|
* to have out "project" dependency back.
|
|
*/
|
|
configure(subprojects.findAll { it.name != coreModule && it.name != rootModule }) {
|
|
configurations.all {
|
|
resolutionStrategy.dependencySubstitution {
|
|
substitute module("org.jetbrains.kotlinx:kotlinx-coroutines-core:$version") with project(':kotlinx-coroutines-core')
|
|
}
|
|
}
|
|
}
|
|
|
|
// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
|
|
configure(subprojects.findAll {
|
|
!sourceless.contains(it.name) &&
|
|
it.name != "benchmarks" &&
|
|
it.name != coreModule &&
|
|
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://kotlin.github.io/kotlinx.coroutines/$coreModule/"
|
|
def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list"
|
|
|
|
configure(subprojects.findAll { !unpublished.contains(it.name) }) {
|
|
if (it.name != 'kotlinx-coroutines-bom') {
|
|
apply from: rootProject.file('gradle/dokka.gradle')
|
|
}
|
|
apply from: rootProject.file('gradle/publish-bintray.gradle')
|
|
}
|
|
|
|
configure(subprojects.findAll { !unpublished.contains(it.name) }) {
|
|
if (it.name != "kotlinx-coroutines-bom") {
|
|
if (it.name != coreModule) {
|
|
dokka.dependsOn project(":$coreModule").dokka
|
|
tasks.withType(dokka.getClass()) {
|
|
externalDocumentationLink {
|
|
url = new URL(core_docs_url)
|
|
packageListUrl = new File(core_docs_file).toURI().toURL()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Report Kotlin compiler version when building project
|
|
println("Using Kotlin compiler version: $org.jetbrains.kotlin.config.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)
|
|
|
|
apply plugin: 'base'
|
|
|
|
clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }
|
|
|
|
// --------------- Knit configuration ---------------
|
|
|
|
apply plugin: 'kotlinx-knit'
|
|
|
|
knit {
|
|
siteRoot = "https://kotlin.github.io/kotlinx.coroutines"
|
|
moduleRoots = [".", "integration", "reactive", "ui"]
|
|
}
|
|
|
|
knitPrepare.dependsOn getTasksByName("dokka", true)
|