blob: d20bb341217356ab1205aa2a222ab60e9343bd96 [file] [log] [blame]
/*
* Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
apply plugin: 'kotlin-multiplatform'
apply from: rootProject.file("gradle/targets.gradle")
ext {
nativeMainSets = []
nativeTestSets = []
nativeCompilations = []
addNative = { preset ->
nativeMainSets.add(preset.compilations['main'].kotlinSourceSets.first())
nativeTestSets.add(preset.compilations['test'].kotlinSourceSets.first())
nativeCompilations.add(preset.compilations['main'])
}
}
kotlin {
targets {
delegate.metaClass.addTarget = { preset ->
addNative(delegate.fromPreset(preset, preset.name))
}
}
// JS -- always
js(IR) {
moduleName = "kotlinx-atomicfu"
// TODO: commented out because browser tests do not work on TeamCity
// browser()
nodejs()
}
// JVM -- always
jvm()
// Wasm -- always
wasmJs {
nodejs()
}
wasmWasi {
nodejs()
}
sourceSets {
commonMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
}
}
commonTest {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-test-common'
implementation 'org.jetbrains.kotlin:kotlin-test-annotations-common'
}
}
jsAndWasmSharedMain {
dependsOn(sourceSets.commonMain)
}
jsMain {
dependsOn(sourceSets.jsAndWasmSharedMain)
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-js'
}
}
jsTest {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-test-js'
}
}
wasmJsMain {
dependsOn(sourceSets.jsAndWasmSharedMain)
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-wasm-js'
}
}
wasmJsTest {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-test-wasm-js'
}
}
wasmWasiMain {
dependsOn(sourceSets.jsAndWasmSharedMain)
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib-wasm-wasi'
}
}
wasmWasiTest {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-test-wasm-wasi'
}
}
jvmMain {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
}
jvmTest {
dependencies {
implementation 'org.jetbrains.kotlin:kotlin-reflect'
implementation 'org.jetbrains.kotlin:kotlin-test'
implementation 'org.jetbrains.kotlin:kotlin-test-junit'
implementation "junit:junit:$junit_version"
}
}
}
}
// configure native targets only if they're not disabled
if (rootProject.ext.native_targets_enabled) {
kotlin {
targets {
if (project.ext.ideaActive) {
addNative(fromPreset(project.ext.ideaPreset, 'native'))
} else {
// Support of all non-deprecated targets from official tier list: https://kotlinlang.org/docs/native-target-support.html
// Tier #1
addTarget(presets.linuxX64)
addTarget(presets.macosX64)
addTarget(presets.macosArm64)
addTarget(presets.iosSimulatorArm64)
addTarget(presets.iosX64)
// Tier #2
addTarget(presets.linuxArm64)
addTarget(presets.watchosSimulatorArm64)
addTarget(presets.watchosX64)
addTarget(presets.watchosArm32)
addTarget(presets.watchosArm64)
addTarget(presets.tvosSimulatorArm64)
addTarget(presets.tvosX64)
addTarget(presets.tvosArm64)
addTarget(presets.iosArm64)
// Tier #3
addTarget(presets.androidNativeArm32)
addTarget(presets.androidNativeArm64)
addTarget(presets.androidNativeX86)
addTarget(presets.androidNativeX64)
addTarget(presets.mingwX64)
addTarget(presets.watchosDeviceArm64)
}
}
sourceSets {
nativeMain { dependsOn commonMain }
nativeTest {}
if (!project.ext.ideaActive) {
configure(nativeMainSets) {
dependsOn nativeMain
}
configure(nativeTestSets) {
dependsOn nativeTest
}
}
}
configure(nativeCompilations) {
cinterops {
interop {
defFile 'src/nativeInterop/cinterop/interop.def'
}
}
}
}
}
configurations {
transformer
}
apply from: rootProject.file('gradle/compile-options.gradle')
ext.configureKotlin()
dependencies {
transformer project(":atomicfu-transformer")
}
// ==== CONFIGURE JVM =====
def classesPreAtomicFuDir = file("$buildDir/classes/kotlin/jvm/test")
def classesPostTransformFU = file("$buildDir/classes/kotlin/jvm/postTransformedFU")
def classesPostTransformVH = file("$buildDir/classes/kotlin/jvm/postTransformedVH")
def classesPostTransformBOTH = file("$buildDir/classes/kotlin/jvm/postTransformedBOTH")
tasks.withType(compileTestKotlinJvm.getClass()) {
kotlinOptions {
jvmTarget = "1.8"
}
}
task transformFU(type: JavaExec, dependsOn: compileTestKotlinJvm) {
main = "kotlinx.atomicfu.transformer.AtomicFUTransformerKt"
args = [classesPreAtomicFuDir, classesPostTransformFU, "FU"]
classpath = configurations.transformer
inputs.dir(classesPreAtomicFuDir)
outputs.dir(classesPostTransformFU)
}
task transformBOTH(type: JavaExec, dependsOn: compileTestKotlinJvm) {
main = "kotlinx.atomicfu.transformer.AtomicFUTransformerKt"
args = [classesPreAtomicFuDir, classesPostTransformBOTH, "BOTH"]
classpath = configurations.transformer
inputs.dir(classesPreAtomicFuDir)
outputs.dir(classesPostTransformBOTH)
}
task transformVH(type: JavaExec, dependsOn: compileTestKotlinJvm) {
main = "kotlinx.atomicfu.transformer.AtomicFUTransformerKt"
args = [classesPreAtomicFuDir, classesPostTransformVH, "VH"]
classpath = configurations.transformer
inputs.dir(classesPreAtomicFuDir)
outputs.dir(classesPostTransformVH)
}
task transformedTestFU_current(type: Test, dependsOn: transformFU) {
classpath = files(configurations.jvmTestRuntimeClasspath, classesPostTransformFU)
testClassesDirs = project.files(classesPostTransformFU)
exclude '**/*LFTest.*', '**/TraceToStringTest.*', '**/AtomicfuReferenceJsTest.*'
filter { setFailOnNoMatchingTests(false) }
}
task transformedTestBOTH_current(type: Test, dependsOn: transformBOTH) {
classpath = files(configurations.jvmTestRuntimeClasspath, classesPostTransformBOTH)
testClassesDirs = project.files(classesPostTransformBOTH)
exclude '**/*LFTest.*', '**/TraceToStringTest.*', '**/TopLevelGeneratedDeclarationsReflectionTest.*', '**/SyntheticFUFieldsTest.*', '**/AtomicfuReferenceJsTest.*'
filter { setFailOnNoMatchingTests(false) }
}
task transformedTestVH(type: Test, dependsOn: transformVH) {
classpath = files(configurations.jvmTestRuntimeClasspath, classesPostTransformVH)
testClassesDirs = project.files(classesPostTransformVH)
exclude '**/*LFTest.*', '**/TraceToStringTest.*', '**/TopLevelGeneratedDeclarationsReflectionTest.*', '**/SyntheticFUFieldsTest.*', '**/AtomicfuReferenceJsTest.*'
filter { setFailOnNoMatchingTests(false) }
}
transformedTestVH.onlyIf {
logger.println(JavaVersion.current())
JavaVersion.current().ordinal() >= JavaVersion.VERSION_1_9.ordinal()
}
task jvmTestAll(dependsOn: [
transformedTestFU_current,
transformedTestBOTH_current,
transformedTestVH
])
tasks.withType(Test) {
testLogging {
showStandardStreams = true
events "passed", "failed"
}
}
task compileJavaModuleInfo(type: JavaCompile) {
def moduleName = "kotlinx.atomicfu" // this module's name
def compilation = kotlin.targets["jvm"].compilations["main"]
def compileKotlinTask = compilation.compileTaskProvider.get() as KotlinJvmCompile
def targetDir = compileKotlinTask.destinationDirectory.dir("../java9")
def sourceDir = file("src/jvmMain/java9/")
// Use a Java 11 compiler for the module info.
javaCompiler.set(project.javaToolchains.compilerFor { languageVersion.set(JavaLanguageVersion.of(11)) })
// Always compile kotlin classes before the module descriptor.
dependsOn(compileKotlinTask)
// Add the module-info source file.
source(sourceDir)
// Also add the module-info.java source file to the Kotlin compile task.
// The Kotlin compiler will parse and check module dependencies,
// but it currently won't compile to a module-info.class file.
// Note that module checking only works on JDK 9+,
// because the JDK built-in base modules are not available in earlier versions.
def javaVersion = compileKotlinTask.kotlinJavaToolchain.javaVersion.getOrNull()
if (javaVersion?.isJava9Compatible() == true) {
logger.info("Module-info checking is enabled; $compileKotlinJvm is compiled using Java $javaVersion")
compileKotlinJvm.source(sourceDir)
} else {
logger.info("Module-info checking is disabled")
}
// Set the task outputs and destination dir
outputs.dir(targetDir)
destinationDirectory.set(targetDir)
// Configure JVM compatibility
sourceCompatibility = JavaVersion.VERSION_1_9.toString()
targetCompatibility = JavaVersion.VERSION_1_9.toString()
// Set the Java release version.
options.release.set(9)
// Ignore warnings about using 'requires transitive' on automatic modules.
// not needed when compiling with recent JDKs, e.g. 17
options.compilerArgs.add("-Xlint:-requires-transitive-automatic")
// Patch the compileKotlinJvm output classes into the compilation so exporting packages works correctly.
options.compilerArgs.addAll(["--patch-module", "$moduleName=${compileKotlinTask.destinationDirectory.get().getAsFile()}"])
// Use the classpath of the compileKotlinJvm task.
// Also ensure that the module path is used instead of classpath.
classpath = compileKotlinTask.libraries
modularity.inferModulePath.set(true)
doFirst {
logger.warn("Task destination directory: ${destinationDirectory.get().getAsFile()}")
}
}
// Configure the JAR task so that it will include the compiled module-info class file.
tasks.named("jvmJar") {
manifest {
attributes(["Multi-Release": true])
}
from(compileJavaModuleInfo.destinationDirectory) {
into("META-INF/versions/9/")
}
}
jvmTest {
exclude "**/AtomicfuBytecodeTest*", "**/AtomicfuReferenceJsTest*", '**/TopLevelGeneratedDeclarationsReflectionTest.*', '**/SyntheticFUFieldsTest.*' // run them only for transformed code
}
jvmTest.dependsOn jvmTestAll
afterEvaluate {
publishing.publications {
kotlinMultiplatform {
apply from: "$rootDir/gradle/publish-mpp-root-module-in-platform.gradle"
publishPlatformArtifactsInRootModule(jvm)
}
}
}
tasks.matching { it.name == "generatePomFileForKotlinMultiplatformPublication" }.configureEach {
dependsOn(tasks["generatePomFileForJvmPublication"])
}
// Workaround for https://youtrack.jetbrains.com/issue/KT-58303:
// the `clean` task can't delete the expanded.lock file on Windows as it's still held by Gradle, failing the build
tasks.clean {
setDelete(layout.buildDirectory.asFileTree.matching {
exclude("tmp/.cache/expanded/expanded.lock")
})
}