blob: 55383484ce13cd173e355b27a8cb47b08309c439 [file] [log] [blame]
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03001/*
Roman Elizarov660c2d72020-02-14 13:18:37 +03002 * Copyright 2016-2020 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
10def rootModule = "kotlinx.coroutines"
11def coreModule = "kotlinx-coroutines-core"
12// Not applicable for Kotlin plugin
dkhalanskyjb02b403d2020-04-06 16:33:22 +030013def sourceless = ['kotlinx.coroutines', 'site', 'kotlinx-coroutines-bom', 'integration-testing']
14def internal = ['kotlinx.coroutines', 'site', 'benchmarks', 'js-stub', 'stdlib-stubs', 'integration-testing']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030015// Not published
Vsevolod Tolstopyatov5378b802019-09-19 17:39:08 +030016def unpublished = internal + ['example-frontend-js', 'android-unit-tests']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030017
Kirill Timofeeva5186962017-10-25 14:25:47 +030018buildscript {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030019 /*
20 * These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
21 * How does it work:
22 * When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version,
23 * atomicfu_version is overwritten by TeamCity environment (AFU is built with snapshot and published to mavenLocal
24 * as previous step or the snapshot build).
25 * Additionally, mavenLocal and Sonatype snapshots are added to repository list and stress tests are disabled.
26 * DO NOT change the name of these properties without adapting kotlinx.train build chain.
27 */
28 def prop = rootProject.properties['build_snapshot_train']
29 ext.build_snapshot_train = prop != null && prop != ""
30 if (build_snapshot_train) {
31 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
32 if (kotlin_version == null) {
33 throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler")
34 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030035 }
36
Roman Elizarov660c2d72020-02-14 13:18:37 +030037 // Determine if any project dependency is using a snapshot version
38 ext.using_snapshot_version = build_snapshot_train
39 rootProject.properties.each { key, value ->
40 if (key.endsWith("_version") && value instanceof String && value.endsWith("-SNAPSHOT")) {
41 println("NOTE: USING SNAPSHOT VERSION: $key=$value")
42 ext.using_snapshot_version=true
43 }
44 }
45
46 if (using_snapshot_version) {
Roman Elizarov1f6b44d2017-10-26 17:51:52 +030047 repositories {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030048 mavenLocal()
Roman Elizarov1f6b44d2017-10-26 17:51:52 +030049 maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
50 }
51 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030052
Kirill Timofeeva5186962017-10-25 14:25:47 +030053 repositories {
54 jcenter()
Vsevolod Tolstopyatov2d0d9aa2020-08-13 15:34:49 +030055 maven {
56 url "https://kotlin.bintray.com/kotlinx"
57 credentials {
58 username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
59 password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
60 }
61 }
Michael Kuzmin476d6de2019-12-16 22:38:59 +030062 maven {
63 url "https://kotlin.bintray.com/kotlin-dev"
64 credentials {
65 username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
66 password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
67 }
68 }
Roman Elizarov0950dfa2018-07-13 10:33:25 +030069 maven { url "https://kotlin.bintray.com/kotlin-eap" }
Roman Elizarov31452902018-04-11 13:58:19 +030070 maven { url "https://jetbrains.bintray.com/kotlin-native-dependencies" }
Roman Elizarov65eff0b2017-12-20 15:51:31 +030071 maven { url "https://plugins.gradle.org/m2/" }
Kirill Timofeeva5186962017-10-25 14:25:47 +030072 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030073
Kirill Timofeeva5186962017-10-25 14:25:47 +030074 dependencies {
75 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
76 classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030077 classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
Roman Elizarov660c2d72020-02-14 13:18:37 +030078 classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
Roman Elizarov65eff0b2017-12-20 15:51:31 +030079 classpath "com.moowork.gradle:gradle-node-plugin:$gradle_node_version"
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +030080 classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version"
Vsevolod Tolstopyatov305c66a2018-08-21 21:01:58 +030081
82 // JMH plugins
Vsevolod Tolstopyatovbda9c792019-09-12 16:50:33 +030083 classpath "com.github.jengelman.gradle.plugins:shadow:5.1.0"
Kirill Timofeeva5186962017-10-25 14:25:47 +030084 }
85}
86
Roman Elizarovd2f4b2b2019-09-02 17:22:39 +030087import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
88
Sergey Igushkin17248c82020-05-22 12:28:25 +030089// Hierarchical project structures are not fully supported in 1.3.7x MPP, enable conditionally for 1.4.x
90if (VersionNumber.parse(kotlin_version) > VersionNumber.parse("1.3.79")) {
91 ext.set("kotlin.mpp.enableGranularSourceSetsMetadata", "true")
92}
93
Roman Elizarovd2f4b2b2019-09-02 17:22:39 +030094// todo:KLUDGE: This is needed to workaround dependency resolution between Java and MPP modules
95def configureKotlinJvmPlatform(configuration) {
96 configuration.attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm)
97}
98
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +030099allprojects {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300100 // the only place where HostManager could be instantiated
101 project.ext.hostManager = new HostManager()
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300102 def deployVersion = properties['DeployVersion']
103 if (deployVersion != null) version = deployVersion
104
105 if (build_snapshot_train) {
106 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
107 println "Using Kotlin $kotlin_version for project $it"
108
Vsevolod Tolstopyatov6ca6ed52019-08-21 17:08:34 +0300109 def skipSnapshotChecks = rootProject.properties['skip_snapshot_checks'] != null
110 if (!skipSnapshotChecks && version != atomicfu_version) {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300111 throw new IllegalStateException("Current deploy version is $version, but atomicfu version is not overridden ($atomicfu_version) for $it")
112 }
113
114 kotlin_version = rootProject.properties['kotlin_snapshot_version']
Roman Elizarove1ac2e52019-04-19 18:51:05 +0300115 }
116
Roman Elizarov660c2d72020-02-14 13:18:37 +0300117 if (using_snapshot_version) {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300118 repositories {
119 mavenLocal()
120 maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
121 }
122 }
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300123
124 ext.unpublished = unpublished
Roman Elizarov0b16abf2019-09-03 11:07:11 +0300125
126 // This project property is set during nightly stress test
127 def stressTest = project.properties['stressTest']
128
129 // Copy it to all test tasks
130 tasks.withType(Test) {
131 systemProperty 'stressTest', stressTest
132 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300133}
134
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300135apply plugin: "binary-compatibility-validator"
136apiValidation {
dkhalanskyjb36512762020-02-21 17:31:05 +0300137 ignoredProjects += unpublished + ["kotlinx-coroutines-bom"]
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300138 if (build_snapshot_train) {
139 ignoredProjects.remove("site")
140 ignoredProjects.remove("example-frontend-js")
Stanislav Erokhin4b16e1b2020-06-09 09:38:51 +0300141 ignoredProjects.add("kotlinx-coroutines-core")
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300142 }
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300143 ignoredPackages += "kotlinx.coroutines.internal"
144}
145
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300146// Configure repositories
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300147allprojects {
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300148 String projectName = it.name
Roman Elizarov18fa1162018-06-27 15:13:01 +0300149 repositories {
Vsevolod Tolstopyatov6f01c932018-10-23 19:40:48 +0300150 /*
151 * google should be first in the repository list because some of the play services
152 * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution
153 */
Roman Elizarov660c2d72020-02-14 13:18:37 +0300154 google()
Roman Elizarov18fa1162018-06-27 15:13:01 +0300155 jcenter()
Michael Kuzmin476d6de2019-12-16 22:38:59 +0300156 maven {
157 url "https://kotlin.bintray.com/kotlin-dev"
158 credentials {
159 username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
160 password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
161 }
162 }
Roman Elizarov0950dfa2018-07-13 10:33:25 +0300163 maven { url "https://kotlin.bintray.com/kotlin-eap" }
Vsevolod Tolstopyatov2d0d9aa2020-08-13 15:34:49 +0300164 maven {
165 url "https://kotlin.bintray.com/kotlinx"
166 credentials {
167 username = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER') ?: ""
168 password = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY') ?: ""
169 }
170 }
171 mavenLocal()
Roman Elizarov18fa1162018-06-27 15:13:01 +0300172 }
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300173}
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +0300174
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300175// Add dependency to core source sets. Core is configured in kx-core/build.gradle
176configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300177 evaluationDependsOn(":$coreModule")
Victor Turanskyde388902020-05-02 14:22:30 +0300178 def platform = PlatformKt.platformOf(it)
Roman Elizarove1a56522018-04-04 10:31:08 +0300179 apply from: rootProject.file("gradle/compile-${platform}.gradle")
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300180 dependencies {
181 // See comment below for rationale, it will be replaced with "project" dependency
182 compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300183 // the only way IDEA can resolve test classes
184 testCompile project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
185 }
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300186}
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300187
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300188// Configure subprojects with Kotlin sources
189configure(subprojects.findAll { !sourceless.contains(it.name) }) {
190 // Use atomicfu plugin, it also adds all the necessary dependencies
191 apply plugin: 'kotlinx-atomicfu'
192
193 // Configure options for all Kotlin compilation tasks
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300194 tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).all {
195 kotlinOptions.freeCompilerArgs += experimentalAnnotations.collect { "-Xuse-experimental=" + it }
196 kotlinOptions.freeCompilerArgs += "-progressive"
Vsevolod Tolstopyatova8904e22019-07-17 17:22:05 -0700197 kotlinOptions.freeCompilerArgs += "-XXLanguage:+InlineClasses"
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300198 // Remove null assertions to get smaller bytecode on Android
199 kotlinOptions.freeCompilerArgs += ["-Xno-param-assertions", "-Xno-receiver-assertions", "-Xno-call-assertions"]
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300200 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300201}
202
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300203if (build_snapshot_train) {
204 println "Hacking test tasks, removing stress and flaky tests"
205 allprojects {
206 tasks.withType(Test).all {
Vsevolod Tolstopyatovdbe3f482019-04-17 17:51:13 +0300207 exclude '**/*LinearizabilityTest*'
208 exclude '**/*LFTest*'
209 exclude '**/*StressTest*'
210 exclude '**/*scheduling*'
211 exclude '**/*Timeout*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300212 exclude '**/*definitely/not/kotlinx*'
Vsevolod Tolstopyatov642989e2020-01-24 20:00:46 +0300213 // Disable because of KT-11567 in 1.4
Vsevolod Tolstopyatovfb990b02020-02-04 17:11:47 +0300214 exclude '**/*CasesPublicAPITest*'
Sergey Igushkin17248c82020-05-22 12:28:25 +0300215 // Kotlin
216 exclude '**/*PrecompiledDebugProbesTest*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300217 }
218 }
219
220 println "Manifest of kotlin-compiler-embeddable.jar for coroutines"
221 configure(subprojects.findAll { it.name == "kotlinx-coroutines-core" }) {
222 configurations.matching { it.name == "kotlinCompilerClasspath" }.all {
223 resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each {
224 def manifest = zipTree(it).matching {
225 include 'META-INF/MANIFEST.MF'
226 }.getFiles().first()
227
228 manifest.readLines().each {
229 println it
230 }
231 }
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300232 }
233 }
234}
235
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300236/*
237 * Hack to trick nmpp plugin: we are renaming artifacts in order to provide backward compatibility for dependencies,
238 * but publishing plugin does not re-read artifact names for kotlin-jvm projects, so renaming is not applied in pom files
239 * for JVM-only projects.
240 *
Victor Turanskya8f4b642020-04-28 14:30:02 +0300241 * We artificially replace "project" dependency with "module" one to have proper names in pom files, but then substitute it
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300242 * to have out "project" dependency back.
243 */
244configure(subprojects.findAll { it.name != coreModule && it.name != rootModule }) {
245 configurations.all {
246 resolutionStrategy.dependencySubstitution {
247 substitute module("org.jetbrains.kotlinx:kotlinx-coroutines-core:$version") with project(':kotlinx-coroutines-core')
248 }
249 }
250}
Kirill Timofeeva5186962017-10-25 14:25:47 +0300251
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300252// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
253configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != "benchmarks" && it.name != coreModule }) {
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300254 sourceSets {
Roman Elizarovf9408f62018-06-29 20:12:52 +0300255 main.kotlin.srcDirs = ['src']
256 test.kotlin.srcDirs = ['test']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300257 main.resources.srcDirs = ['resources']
258 test.resources.srcDirs = ['test-resources']
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300259 }
260}
261
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300262def core_docs_url = "https://kotlin.github.io/kotlinx.coroutines/$coreModule/"
263def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/kotlinx-coroutines-core/package-list"
Kirill Timofeeva5186962017-10-25 14:25:47 +0300264
265configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300266 if (it.name != 'kotlinx-coroutines-bom') {
267 apply from: rootProject.file('gradle/dokka.gradle')
268 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300269 apply from: rootProject.file('gradle/publish-bintray.gradle')
Kirill Timofeeva5186962017-10-25 14:25:47 +0300270}
271
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300272configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300273 if (it.name != "kotlinx-coroutines-bom") {
274 if (it.name != coreModule) {
275 dokka.dependsOn project(":$coreModule").dokka
276 tasks.withType(dokka.getClass()) {
277 externalDocumentationLink {
278 url = new URL(core_docs_url)
Roman Elizarov660c2d72020-02-14 13:18:37 +0300279 packageListUrl = new File(core_docs_file).toURI().toURL()
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300280 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300281 }
282 }
Vsevolod Tolstopyatove6e82392018-10-09 19:06:29 +0300283 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300284}
285
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300286// Report Kotlin compiler version when building project
287println("Using Kotlin compiler version: $org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION")
288
289// --------------- Configure sub-projects that are published ---------------
Roman Elizarov1ac3dc22020-02-14 15:39:09 +0300290def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm", true)
291
Roman Elizarov1ac3dc22020-02-14 15:39:09 +0300292task deploy(dependsOn: publishTasks)
Roman Elizarov94fb2a32018-03-05 17:32:59 +0300293
Kirill Timofeeva5186962017-10-25 14:25:47 +0300294apply plugin: 'base'
295
296clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }
Roman Elizarov660c2d72020-02-14 13:18:37 +0300297
298// --------------- Knit configuration ---------------
299
300apply plugin: 'kotlinx-knit'
301
302knit {
303 siteRoot = "https://kotlin.github.io/kotlinx.coroutines"
304 moduleRoots = [".", "integration", "reactive", "ui"]
305}
306
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300307knitPrepare.dependsOn getTasksByName("dokka", true)