blob: 4bccce7a69480e58a707ead45fa63473220039a0 [file] [log] [blame]
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03001/*
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +03002 * Copyright 2016-2019 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
5
6apply from: rootProject.file("gradle/experimental.gradle")
7
8def rootModule = "kotlinx.coroutines"
9def coreModule = "kotlinx-coroutines-core"
10// Not applicable for Kotlin plugin
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +030011def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom']
12def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'knit', 'js-stub', 'stdlib-stubs', 'binary-compatibility-validator']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030013// Not published
14def unpublished = internal + ['kotlinx-coroutines-rx-example', 'example-frontend-js', 'android-unit-tests']
15
16static def platformOf(project) {
17 def name = project.name
18 if (name.endsWith("-js")) return "js"
19 if (name.endsWith("-common") || name.endsWith("-native")) {
20 throw IllegalStateException("$name platform is not supported")
21 }
22 return "jvm"
23}
Roman Elizarov1f74a2d2018-06-29 19:19:45 +030024
Kirill Timofeeva5186962017-10-25 14:25:47 +030025buildscript {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030026 /*
27 * These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
28 * How does it work:
29 * When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version,
30 * atomicfu_version is overwritten by TeamCity environment (AFU is built with snapshot and published to mavenLocal
31 * as previous step or the snapshot build).
32 * Additionally, mavenLocal and Sonatype snapshots are added to repository list and stress tests are disabled.
33 * DO NOT change the name of these properties without adapting kotlinx.train build chain.
34 */
35 def prop = rootProject.properties['build_snapshot_train']
36 ext.build_snapshot_train = prop != null && prop != ""
37 if (build_snapshot_train) {
38 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
39 if (kotlin_version == null) {
40 throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler")
41 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030042 }
43
44 if (build_snapshot_train || atomicfu_version.endsWith("-SNAPSHOT")) {
Roman Elizarov1f6b44d2017-10-26 17:51:52 +030045 repositories {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030046 mavenLocal()
Roman Elizarov1f6b44d2017-10-26 17:51:52 +030047 maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
48 }
49 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030050
Kirill Timofeeva5186962017-10-25 14:25:47 +030051 repositories {
52 jcenter()
Roman Elizarov31452902018-04-11 13:58:19 +030053 maven { url "https://kotlin.bintray.com/kotlinx" }
54 maven { url "https://kotlin.bintray.com/kotlin-dev" }
Roman Elizarov0950dfa2018-07-13 10:33:25 +030055 maven { url "https://kotlin.bintray.com/kotlin-eap" }
Roman Elizarov31452902018-04-11 13:58:19 +030056 maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" }
Roman Elizarov65eff0b2017-12-20 15:51:31 +030057 maven { url "https://plugins.gradle.org/m2/" }
Kirill Timofeeva5186962017-10-25 14:25:47 +030058 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030059
Kirill Timofeeva5186962017-10-25 14:25:47 +030060 dependencies {
61 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
62 classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030063 classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
Roman Elizarov65eff0b2017-12-20 15:51:31 +030064 classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$bintray_version"
65 classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version"
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +030066 classpath "io.spring.gradle:dependency-management-plugin:$spring_dependency_management_version"
Vsevolod Tolstopyatov305c66a2018-08-21 21:01:58 +030067
68 // JMH plugins
Vsevolod Tolstopyatov3781a822018-12-13 11:58:29 +030069 classpath "com.github.jengelman.gradle.plugins:shadow:4.0.2"
Vsevolod Tolstopyatov305c66a2018-08-21 21:01:58 +030070 classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.7"
71 classpath "net.ltgt.gradle:gradle-apt-plugin:0.10"
Kirill Timofeeva5186962017-10-25 14:25:47 +030072 }
73}
74
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +030075allprojects {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030076 // the only place where HostManager could be instantiated
77 project.ext.hostManager = new HostManager()
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030078 def deployVersion = properties['DeployVersion']
79 if (deployVersion != null) version = deployVersion
80
81 if (build_snapshot_train) {
82 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
83 println "Using Kotlin $kotlin_version for project $it"
84
85 if (version != atomicfu_version) {
86 throw new IllegalStateException("Current deploy version is $version, but atomicfu version is not overridden ($atomicfu_version) for $it")
87 }
88
89 kotlin_version = rootProject.properties['kotlin_snapshot_version']
Roman Elizarove1ac2e52019-04-19 18:51:05 +030090 }
91
92 if (build_snapshot_train || atomicfu_version.endsWith("-SNAPSHOT")) {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030093 repositories {
94 mavenLocal()
95 maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
96 }
97 }
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +030098
99 ext.unpublished = unpublished
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300100}
101
102allprojects {
Roman Elizarove1ac2e52019-04-19 18:51:05 +0300103 apply plugin: 'kotlinx-atomicfu' // it also adds all the necessary dependencies
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300104 def projectName = it.name
Roman Elizarov18fa1162018-06-27 15:13:01 +0300105 repositories {
Vsevolod Tolstopyatov6f01c932018-10-23 19:40:48 +0300106 /*
107 * google should be first in the repository list because some of the play services
108 * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution
109 */
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300110 if (projectName == "kotlinx-coroutines-play-services") {
Vsevolod Tolstopyatov6f01c932018-10-23 19:40:48 +0300111 google()
112 }
Roman Elizarov18fa1162018-06-27 15:13:01 +0300113 jcenter()
Vsevolod Tolstopyatov8a45c472018-10-24 11:55:30 +0300114 maven { url "https://kotlin.bintray.com/kotlin-dev" }
Roman Elizarov0950dfa2018-07-13 10:33:25 +0300115 maven { url "https://kotlin.bintray.com/kotlin-eap" }
Roman Elizarov18fa1162018-06-27 15:13:01 +0300116 maven { url "https://kotlin.bintray.com/kotlinx" }
117 }
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +0300118
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300119 if (projectName == rootModule || projectName == coreModule) return
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +0300120
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300121 // Add dependency to core source sets. Core is configured in kx-core/build.gradle
122 evaluationDependsOn(":$coreModule")
123 if (sourceless.contains(projectName)) return
Roman Elizarov38b6fd32018-01-17 10:12:23 +0300124
Roman Elizarove1c0b652017-12-01 14:02:57 +0300125 def platform = platformOf(it)
Roman Elizarove1a56522018-04-04 10:31:08 +0300126 apply from: rootProject.file("gradle/compile-${platform}.gradle")
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300127
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300128 dependencies {
129 // See comment below for rationale, it will be replaced with "project" dependency
130 compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300131
132 // the only way IDEA can resolve test classes
133 testCompile project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
134 }
135
136 tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all {
137 kotlinOptions.freeCompilerArgs += experimentalAnnotations.collect { "-Xuse-experimental=" + it }
138 kotlinOptions.freeCompilerArgs += "-progressive"
Vsevolod Tolstopyatova8904e22019-07-17 17:22:05 -0700139 kotlinOptions.freeCompilerArgs += "-XXLanguage:+InlineClasses"
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300140 // Binary compatibility support
141 kotlinOptions.freeCompilerArgs += ["-Xdump-declarations-to=${buildDir}/visibilities.json"]
142 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300143}
144
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300145if (build_snapshot_train) {
146 println "Hacking test tasks, removing stress and flaky tests"
147 allprojects {
148 tasks.withType(Test).all {
Vsevolod Tolstopyatovdbe3f482019-04-17 17:51:13 +0300149 exclude '**/*LinearizabilityTest*'
Vsevolod Tolstopyatovdaf85022019-06-03 14:39:32 +0300150 exclude '**/*PublicApiTest*' // KT-30956
Vsevolod Tolstopyatovdbe3f482019-04-17 17:51:13 +0300151 exclude '**/*LFTest*'
152 exclude '**/*StressTest*'
153 exclude '**/*scheduling*'
154 exclude '**/*Timeout*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300155 exclude '**/*coroutines/debug*' // Unmute after 1.3.31 where inlining was fixed
156 exclude '**/*definitely/not/kotlinx*'
157 }
158 }
159
160 println "Manifest of kotlin-compiler-embeddable.jar for coroutines"
161 configure(subprojects.findAll { it.name == "kotlinx-coroutines-core" }) {
162 configurations.matching { it.name == "kotlinCompilerClasspath" }.all {
163 resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each {
164 def manifest = zipTree(it).matching {
165 include 'META-INF/MANIFEST.MF'
166 }.getFiles().first()
167
168 manifest.readLines().each {
169 println it
170 }
171 }
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300172 }
173 }
174}
175
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300176/*
177 * Hack to trick nmpp plugin: we are renaming artifacts in order to provide backward compatibility for dependencies,
178 * but publishing plugin does not re-read artifact names for kotlin-jvm projects, so renaming is not applied in pom files
179 * for JVM-only projects.
180 *
181 * We artificially replace "project" dependency with "module" one to have proper names in pom files, but then substitute it
182 * to have out "project" dependency back.
183 */
184configure(subprojects.findAll { it.name != coreModule && it.name != rootModule }) {
185 configurations.all {
186 resolutionStrategy.dependencySubstitution {
187 substitute module("org.jetbrains.kotlinx:kotlinx-coroutines-core:$version") with project(':kotlinx-coroutines-core')
188 }
189 }
190}
Kirill Timofeeva5186962017-10-25 14:25:47 +0300191
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300192// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
193configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != "benchmarks" && it.name != coreModule }) {
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300194 sourceSets {
Roman Elizarovf9408f62018-06-29 20:12:52 +0300195 main.kotlin.srcDirs = ['src']
196 test.kotlin.srcDirs = ['test']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300197 main.resources.srcDirs = ['resources']
198 test.resources.srcDirs = ['test-resources']
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300199 }
200}
201
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300202def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/"
203def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list"
Kirill Timofeeva5186962017-10-25 14:25:47 +0300204
205configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300206 if (it.name != 'kotlinx-coroutines-bom') {
207 apply from: rootProject.file('gradle/dokka.gradle')
208 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300209 apply from: rootProject.file('gradle/publish-bintray.gradle')
Kirill Timofeeva5186962017-10-25 14:25:47 +0300210}
211
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300212configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300213 if (it.name != "kotlinx-coroutines-bom") {
214 if (it.name != coreModule) {
215 dokka.dependsOn project(":$coreModule").dokka
216 tasks.withType(dokka.getClass()) {
217 externalDocumentationLink {
218 url = new URL(core_docs_url)
219 packageListUrl = new URL("file://$core_docs_file")
220 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300221 }
222 }
Vsevolod Tolstopyatove6e82392018-10-09 19:06:29 +0300223
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300224 if (platformOf(it) == "jvm") {
225 dokkaJavadoc.dependsOn project(":$coreModule").dokka
226 }
Vsevolod Tolstopyatove6e82392018-10-09 19:06:29 +0300227 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300228}
229
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300230// Report Kotlin compiler version when building project
231println("Using Kotlin compiler version: $org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION")
232
233// --------------- Configure sub-projects that are published ---------------
Roman Elizarov94fb2a32018-03-05 17:32:59 +0300234task deploy(dependsOn: getTasksByName("bintrayUpload", true) + getTasksByName("publishNpm", true))
235
Kirill Timofeeva5186962017-10-25 14:25:47 +0300236apply plugin: 'base'
237
238clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }