/* * 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)