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