blob: 80124e7ea00db1519e29dcd4692535551dc0723d [file] [log] [blame]
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03001/*
Vsevolod Tolstopyatov0e926e72021-01-18 08:47:09 -08002 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03003 */
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +03004import org.jetbrains.kotlin.konan.target.HostManager
Sergey Igushkin17248c82020-05-22 12:28:25 +03005import org.gradle.util.VersionNumber
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +03006
Victor Turanskye47cb352020-05-12 18:33:04 +03007apply plugin: 'jdk-convention'
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +03008apply from: rootProject.file("gradle/experimental.gradle")
9
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030010def coreModule = "kotlinx-coroutines-core"
11// Not applicable for Kotlin plugin
dkhalanskyjb02b403d2020-04-06 16:33:22 +030012def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing']
13def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030014// Not published
Vsevolod Tolstopyatov5378b802019-09-19 17:39:08 +030015def unpublished = internal + ['example-frontend-js', 'android-unit-tests']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030016
Kirill Timofeeva5186962017-10-25 14:25:47 +030017buildscript {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030018 /*
19 * These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
20 * How does it work:
21 * When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version,
22 * atomicfu_version is overwritten by TeamCity environment (AFU is built with snapshot and published to mavenLocal
23 * as previous step or the snapshot build).
24 * Additionally, mavenLocal and Sonatype snapshots are added to repository list and stress tests are disabled.
25 * DO NOT change the name of these properties without adapting kotlinx.train build chain.
26 */
27 def prop = rootProject.properties['build_snapshot_train']
28 ext.build_snapshot_train = prop != null && prop != ""
29 if (build_snapshot_train) {
30 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
31 if (kotlin_version == null) {
32 throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler")
33 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030034 }
Alexander Likhachev179f1422020-11-18 17:54:33 +030035 // These three flags are enabled in train builds for JVM IR compiler testing
36 ext.jvm_ir_enabled = rootProject.properties['enable_jvm_ir'] != null
37 ext.jvm_ir_api_check_enabled = rootProject.properties['enable_jvm_ir_api_check'] != null
38 ext.native_targets_enabled = rootProject.properties['disable_native_targets'] == null
Roman Elizarove1ac2e52019-04-19 18:51:05 +030039
Roman Elizarov660c2d72020-02-14 13:18:37 +030040 // Determine if any project dependency is using a snapshot version
41 ext.using_snapshot_version = build_snapshot_train
42 rootProject.properties.each { key, value ->
43 if (key.endsWith("_version") && value instanceof String && value.endsWith("-SNAPSHOT")) {
44 println("NOTE: USING SNAPSHOT VERSION: $key=$value")
45 ext.using_snapshot_version=true
46 }
47 }
48
49 if (using_snapshot_version) {
Roman Elizarov1f6b44d2017-10-26 17:51:52 +030050 repositories {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030051 mavenLocal()
Roman Elizarov1f6b44d2017-10-26 17:51:52 +030052 }
53 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030054
Kirill Timofeeva5186962017-10-25 14:25:47 +030055 repositories {
Vsevolod Tolstopyatovad6211c2021-02-10 00:21:58 -080056 maven {url "https://kotlin.bintray.com/kotlinx"}
Vsevolod Tolstopyatov63156a82020-08-24 16:15:52 +030057 // Future replacement for kotlin-dev, with cache redirector
58 maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
Michael Kuzmin476d6de2019-12-16 22:38:59 +030059 maven {
60 url "https://kotlin.bintray.com/kotlin-dev"
61 credentials {
62 username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
63 password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
64 }
65 }
Roman Elizarov31452902018-04-11 13:58:19 +030066 maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" }
Roman Elizarov65eff0b2017-12-20 15:51:31 +030067 maven { url "https://plugins.gradle.org/m2/" }
Kirill Timofeeva5186962017-10-25 14:25:47 +030068 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030069
Kirill Timofeeva5186962017-10-25 14:25:47 +030070 dependencies {
71 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
72 classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030073 classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
Roman Elizarov660c2d72020-02-14 13:18:37 +030074 classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
Roman Elizarov65eff0b2017-12-20 15:51:31 +030075 classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version"
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +030076 classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version"
Vsevolod Tolstopyatov305c66a2018-08-21 21:01:58 +030077
78 // JMH plugins
Vsevolod Tolstopyatovbda9c792019-09-12 16:50:33 +030079 classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0"
Kirill Timofeeva5186962017-10-25 14:25:47 +030080 }
Roman Elizarov85b1a2b2020-09-14 17:48:17 +030081
82 CacheRedirector.configureBuildScript(buildscript, rootProject)
Kirill Timofeeva5186962017-10-25 14:25:47 +030083}
84
Roman Elizarovd2f4b2b2019-09-02 17:22:39 +030085import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
86
Roman Elizarov738f5a22020-10-12 19:03:46 +030087// todo:KLUDGE: Hierarchical project structures are not fully supported in IDEA, enable only for a regular built
88if (!Idea.active) {
Sergey Igushkin17248c82020-05-22 12:28:25 +030089 ext.set("kotlin.mpp.enableGranularSourceSetsMetadata", "true")
90}
91
Roman Elizarovd2f4b2b2019-09-02 17:22:39 +030092// todo:KLUDGE: This is needed to workaround dependency resolution between Java and MPP modules
93def configureKotlinJvmPlatform(configuration) {
94 configuration.attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm)
95}
96
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +030097allprojects {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030098 // the only place where HostManager could be instantiated
99 project.ext.hostManager = new HostManager()
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300100 def deployVersion = properties['DeployVersion']
101 if (deployVersion != null) version = deployVersion
102
103 if (build_snapshot_train) {
104 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
105 println "Using Kotlin $kotlin_version for project $it"
106
Vsevolod Tolstopyatov6ca6ed52019-08-21 17:08:34 +0300107 def skipSnapshotChecks = rootProject.properties['skip_snapshot_checks'] != null
108 if (!skipSnapshotChecks && version != atomicfu_version) {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300109 throw new IllegalStateException("Current deploy version is $version, but atomicfu version is not overridden ($atomicfu_version) for $it")
110 }
111
112 kotlin_version = rootProject.properties['kotlin_snapshot_version']
Roman Elizarove1ac2e52019-04-19 18:51:05 +0300113 }
114
Roman Elizarov660c2d72020-02-14 13:18:37 +0300115 if (using_snapshot_version) {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300116 repositories {
117 mavenLocal()
118 maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
119 }
120 }
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300121
122 ext.unpublished = unpublished
Roman Elizarov0b16abf2019-09-03 11:07:11 +0300123
124 // This project property is set during nightly stress test
125 def stressTest = project.properties['stressTest']
126
127 // Copy it to all test tasks
128 tasks.withType(Test) {
129 systemProperty 'stressTest', stressTest
130 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300131}
132
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300133apply plugin: "binary-compatibility-validator"
134apiValidation {
dkhalanskyjb36512762020-02-21 17:31:05 +0300135 ignoredProjects += unpublished + ["kotlinx-coroutines-bom"]
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300136 if (build_snapshot_train) {
137 ignoredProjects.remove("site")
138 ignoredProjects.remove("example-frontend-js")
Stanislav Erokhin4b16e1b2020-06-09 09:38:51 +0300139 ignoredProjects.add("kotlinx-coroutines-core")
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300140 }
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300141 ignoredPackages += "kotlinx.coroutines.internal"
142}
143
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300144// Configure repositories
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300145allprojects {
Roman Elizarov18fa1162018-06-27 15:13:01 +0300146 repositories {
Vsevolod Tolstopyatov6f01c932018-10-23 19:40:48 +0300147 /*
148 * google should be first in the repository list because some of the play services
149 * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution
150 */
Roman Elizarov660c2d72020-02-14 13:18:37 +0300151 google()
Vsevolod Tolstopyatovad6211c2021-02-10 00:21:58 -0800152 mavenCentral()
Vsevolod Tolstopyatov63156a82020-08-24 16:15:52 +0300153 // Future replacement for kotlin-dev, with cache redirector
154 maven { url "https://cache-redirector.jetbrains.com/maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
Vsevolod Tolstopyatovad6211c2021-02-10 00:21:58 -0800155 maven { url "https://kotlin.bintray.com/kotlinx" }
Roman Elizarov18fa1162018-06-27 15:13:01 +0300156 }
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300157}
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +0300158
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300159// Add dependency to core source sets. Core is configured in kx-core/build.gradle
160configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300161 evaluationDependsOn(":$coreModule")
Victor Turanskyde388902020-05-02 14:22:30 +0300162 def platform = PlatformKt.platformOf(it)
Vsevolod Tolstopyatov0e926e72021-01-18 08:47:09 -0800163 apply plugin: "kotlin-${platform}-conventions"
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300164 dependencies {
165 // See comment below for rationale, it will be replaced with "project" dependency
Vsevolod Tolstopyatov520afcb2020-12-18 05:56:22 -0800166 compile project(":$coreModule")
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300167 // the only way IDEA can resolve test classes
168 testCompile project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
169 }
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300170}
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300171
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300172// Configure subprojects with Kotlin sources
173configure(subprojects.findAll { !sourceless.contains(it.name) }) {
174 // Use atomicfu plugin, it also adds all the necessary dependencies
175 apply plugin: 'kotlinx-atomicfu'
176
177 // Configure options for all Kotlin compilation tasks
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300178 tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all {
179 kotlinOptions.freeCompilerArgs += experimentalAnnotations.collect { "-Xuse-experimental=" + it }
180 kotlinOptions.freeCompilerArgs += "-progressive"
Vsevolod Tolstopyatova8904e22019-07-17 17:22:05 -0700181 kotlinOptions.freeCompilerArgs += "-XXLanguage:+InlineClasses"
Vsevolod Tolstopyatov556f07a2020-12-02 06:52:35 -0800182 // Disable KT-36770 for RxJava2 integration
183 kotlinOptions.freeCompilerArgs += "-XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated"
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300184 // Remove null assertions to get smaller bytecode on Android
185 kotlinOptions.freeCompilerArgs += ["-Xno-param-assertions", "-Xno-receiver-assertions", "-Xno-call-assertions"]
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300186 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300187}
188
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300189if (build_snapshot_train) {
190 println "Hacking test tasks, removing stress and flaky tests"
191 allprojects {
192 tasks.withType(Test).all {
Vsevolod Tolstopyatovdbe3f482019-04-17 17:51:13 +0300193 exclude '**/*LinearizabilityTest*'
194 exclude '**/*LFTest*'
195 exclude '**/*StressTest*'
196 exclude '**/*scheduling*'
197 exclude '**/*Timeout*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300198 exclude '**/*definitely/not/kotlinx*'
Vsevolod Tolstopyatov642989e2020-01-24 20:00:46 +0300199 // Disable because of KT-11567 in 1.4
Vsevolod Tolstopyatovfb990b02020-02-04 17:11:47 +0300200 exclude '**/*CasesPublicAPITest*'
Sergey Igushkin17248c82020-05-22 12:28:25 +0300201 // Kotlin
202 exclude '**/*PrecompiledDebugProbesTest*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300203 }
204 }
205
206 println "Manifest of kotlin-compiler-embeddable.jar for coroutines"
207 configure(subprojects.findAll { it.name == "kotlinx-coroutines-core" }) {
208 configurations.matching { it.name == "kotlinCompilerClasspath" }.all {
209 resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each {
210 def manifest = zipTree(it).matching {
211 include 'META-INF/MANIFEST.MF'
212 }.getFiles().first()
213
214 manifest.readLines().each {
215 println it
216 }
217 }
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300218 }
219 }
220}
221
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300222// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
Vsevolod Tolstopyatovfcaa6df2020-08-24 18:57:22 +0300223configure(subprojects.findAll {
224 !sourceless.contains(it.name) &&
225 it.name != "benchmarks" &&
226 it.name != coreModule &&
227 it.name != "example-frontend-js"
228}) {
229 // Pure JS and pure MPP doesn't have this notion and are configured separately
230 // TODO detect it via platformOf and migrate benchmarks to the same scheme
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300231 sourceSets {
Roman Elizarovf9408f62018-06-29 20:12:52 +0300232 main.kotlin.srcDirs = ['src']
233 test.kotlin.srcDirs = ['test']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300234 main.resources.srcDirs = ['resources']
235 test.resources.srcDirs = ['test-resources']
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300236 }
237}
238
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300239def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/"
240def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list"
Kirill Timofeeva5186962017-10-25 14:25:47 +0300241
242configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300243 if (it.name != 'kotlinx-coroutines-bom') {
244 apply from: rootProject.file('gradle/dokka.gradle')
245 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300246 apply from: rootProject.file('gradle/publish-bintray.gradle')
Kirill Timofeeva5186962017-10-25 14:25:47 +0300247}
248
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300249configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300250 if (it.name != "kotlinx-coroutines-bom") {
251 if (it.name != coreModule) {
252 dokka.dependsOn project(":$coreModule").dokka
253 tasks.withType(dokka.getClass()) {
254 externalDocumentationLink {
255 url = new URL(core_docs_url)
Roman Elizarov660c2d72020-02-14 13:18:37 +0300256 packageListUrl = new File(core_docs_file).toURI().toURL()
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300257 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300258 }
259 }
Vsevolod Tolstopyatove6e82392018-10-09 19:06:29 +0300260 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300261}
262
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300263// Report Kotlin compiler version when building project
264println("Using Kotlin compiler version: $org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION")
265
Roman Elizarov85b1a2b2020-09-14 17:48:17 +0300266// --------------- Cache redirector ---------------
267
268allprojects {
269 CacheRedirector.configure(project)
270}
271
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300272// --------------- Configure sub-projects that are published ---------------
Roman Elizarov85b1a2b2020-09-14 17:48:17 +0300273
Roman Elizarov1ac3dc22020-02-14 15:39:09 +0300274def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm", true)
275
Roman Elizarov1ac3dc22020-02-14 15:39:09 +0300276task deploy(dependsOn: publishTasks)
Roman Elizarov94fb2a32018-03-05 17:32:59 +0300277
Kirill Timofeeva5186962017-10-25 14:25:47 +0300278apply plugin: 'base'
279
280clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }
Roman Elizarov660c2d72020-02-14 13:18:37 +0300281
282// --------------- Knit configuration ---------------
283
284apply plugin: 'kotlinx-knit'
285
286knit {
287 siteRoot = "https://kotlin.github.io/kotlinx.coroutines"
288 moduleRoots = [".", "integration", "reactive", "ui"]
289}
290
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300291knitPrepare.dependsOn getTasksByName("dokka", true)
Alexander Likhachev179f1422020-11-18 17:54:33 +0300292
293// Disable binary compatibility check for JVM IR compiler output by default
294if (jvm_ir_enabled) {
295 subprojects { project ->
296 configure(tasks.matching { it.name == "apiCheck" }) {
297 enabled = enabled && jvm_ir_api_check_enabled
298 }
299 }
Vsevolod Tolstopyatov556f07a2020-12-02 06:52:35 -0800300}