blob: 0c8e5034759a9214d1e46d4bd0d83b0d681fa9e7 [file] [log] [blame] [edit]
import org.gradle.api.publish.internal.PublicationInternal
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute
import org.jetbrains.kotlin.konan.target.HostManager
import plugins.KotlinBuildPublishingPlugin.Companion.ADHOC_COMPONENT_NAME
import plugins.configureKotlinPomAttributes
description = "Kotlin Serialization Compiler Plugin"
plugins {
kotlin("jvm")
id("jps-compatible")
id("d8-configuration")
id("java-test-fixtures")
id("project-tests-convention")
}
val jsonJsIrRuntimeForTests: Configuration by configurations.creating {
attributes {
attribute(KotlinPlatformType.attribute, KotlinPlatformType.js)
attribute(KotlinJsCompilerAttribute.jsCompilerAttribute, KotlinJsCompilerAttribute.ir)
}
}
val coreJsIrRuntimeForTests: Configuration by configurations.creating {
attributes {
attribute(KotlinPlatformType.attribute, KotlinPlatformType.js)
attribute(KotlinJsCompilerAttribute.jsCompilerAttribute, KotlinJsCompilerAttribute.ir)
}
}
// WARNING: Native target is host-dependent. Re-running the same build on another host OS may give a different result.
val nativeTargetName = HostManager.host.name
val coreNativeRuntimeForTests by configurations.creating {
attributes {
attribute(KotlinPlatformType.attribute, KotlinPlatformType.native)
// WARNING: Native target is host-dependent. Re-running the same build on another host OS may give a different result.
attribute(KotlinNativeTarget.konanTargetAttribute, nativeTargetName)
attribute(Usage.USAGE_ATTRIBUTE, objects.named(KotlinUsages.KOTLIN_API))
attribute(KotlinPlatformType.attribute, KotlinPlatformType.native)
}
}
val jsonNativeRuntimeForTests by configurations.creating {
attributes {
attribute(KotlinPlatformType.attribute, KotlinPlatformType.native)
// WARNING: Native target is host-dependent. Re-running the same build on another host OS may give a different result.
attribute(KotlinNativeTarget.konanTargetAttribute, nativeTargetName)
attribute(Usage.USAGE_ATTRIBUTE, objects.named(KotlinUsages.KOTLIN_API))
attribute(KotlinPlatformType.attribute, KotlinPlatformType.native)
}
}
val serializationPluginForTests by configurations.creating
fun DependencyHandlerScope.implicitKotlinApiDependency(notation: Any) {
implicitDependencies(notation) {
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(KotlinUsages.KOTLIN_API))
}
}
}
dependencies {
embedded(project(":kotlinx-serialization-compiler-plugin.common")) { isTransitive = false }
embedded(project(":kotlinx-serialization-compiler-plugin.k1")) { isTransitive = false }
embedded(project(":kotlinx-serialization-compiler-plugin.k2")) { isTransitive = false }
embedded(project(":kotlinx-serialization-compiler-plugin.backend")) { isTransitive = false }
embedded(project(":kotlinx-serialization-compiler-plugin.cli")) { isTransitive = false }
testFixturesApi(project(":compiler:backend"))
testFixturesApi(project(":compiler:cli"))
testFixturesApi(project(":kotlinx-serialization-compiler-plugin.cli"))
testFixturesApi(testFixtures(project(":compiler:test-infrastructure")))
testFixturesApi(testFixtures(project(":compiler:test-infrastructure-utils")))
testFixturesApi(testFixtures(project(":compiler:tests-compiler-utils")))
testFixturesApi(testFixtures(project(":compiler:tests-common-new")))
testFixturesApi(project(":compiler:fir:plugin-utils"))
testFixturesImplementation(testFixtures(project(":generators:test-generator")))
testFixturesApi(testFixtures(project(":js:js.tests")))
testFixturesApi(testFixtures(project(":analysis:analysis-api-fir")))
testFixturesApi(testFixtures(project(":analysis:analysis-api-impl-base")))
testFixturesApi(testFixtures(project(":analysis:low-level-api-fir")))
testFixturesApi(platform(libs.junit.bom))
testFixturesApi(libs.junit.jupiter.api)
testRuntimeOnly(libs.junit.jupiter.engine)
testFixturesApi(project(":kotlinx-serialization-compiler-plugin.common"))
testFixturesApi(project(":kotlinx-serialization-compiler-plugin.k1"))
testFixturesApi(project(":kotlinx-serialization-compiler-plugin.k2"))
testFixturesApi(project(":kotlinx-serialization-compiler-plugin.backend"))
testFixturesApi(project(":kotlinx-serialization-compiler-plugin.cli"))
testFixturesApi("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.0")
testFixturesApi("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0")
coreJsIrRuntimeForTests("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.0") { isTransitive = false }
jsonJsIrRuntimeForTests("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0") { isTransitive = false }
coreNativeRuntimeForTests("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.0") { isTransitive = false }
jsonNativeRuntimeForTests("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.0") { isTransitive = false }
serializationPluginForTests(project(":kotlinx-serialization-compiler-plugin"))
testRuntimeOnly(intellijCore())
testRuntimeOnly(commonDependency("org.jetbrains.kotlin:kotlin-reflect")) { isTransitive = false }
testRuntimeOnly(project(":core:descriptors.runtime"))
testRuntimeOnly(project(":compiler:fir:fir-serialization"))
// Dependencies for Kotlin/Native test infra:
testFixturesApi(testFixtures(project(":native:native.tests")))
testFixturesApi(testFixtures(project(":native:native.tests:klib-ir-inliner")))
// Implicit dependencies on CORE and JSON native artifacts to run native tests on CI
listOf(
"linuxx64",
"macosarm64",
"macosx64",
"iossimulatorarm64",
"mingwx64"
).forEach {
implicitKotlinApiDependency("org.jetbrains.kotlinx:kotlinx-serialization-core-$it:1.7.0")
implicitKotlinApiDependency("org.jetbrains.kotlinx:kotlinx-serialization-json-$it:1.7.0")
}
}
optInToExperimentalCompilerApi()
sourceSets {
"main" { none() }
"test" {
projectDefault()
generatedTestDir()
}
"testFixtures" {
projectDefault()
}
}
optInToExperimentalCompilerApi()
publish {
artifactId = artifactId.replace("kotlinx-", "kotlin-")
}
val archiveName = "kotlin-serialization-compiler-plugin"
val archiveCompatName = "kotlinx-serialization-compiler-plugin"
val runtimeJar = runtimeJar {
archiveBaseName.set(archiveName)
}
sourcesJar()
javadocJar()
testsJar()
val distCompat by configurations.creating {
isCanBeResolved = false
isCanBeConsumed = true
}
val compatJar = tasks.register<Copy>("compatJar") {
from(runtimeJar)
into(layout.buildDirectory.dir("libsCompat"))
rename {
it.replace("kotlin-", "kotlinx-")
}
}
artifacts {
add(distCompat.name, layout.buildDirectory.dir("libsCompat").map { it.file("$archiveCompatName-$version.jar") }) {
builtBy(runtimeJar, compatJar)
}
}
projectTests {
testTask(jUnitMode = JUnitMode.JUnit5, defineJDKEnvVariables = listOf(JdkMajorVersion.JDK_11_0)) {
useJUnitPlatform {
// Exclude all tests with the "serialization-native" tag. They should be launched by another test task.
excludeTags("serialization-native")
}
dependsOn(":dist")
workingDir = rootDir
setUpJsIrBoxTests()
}
nativeTestTask(
taskName = "nativeTest",
tag = "serialization-native", // Include all tests with the "serialization-native" tag
requirePlatformLibs = false,
customTestDependencies = listOf(coreNativeRuntimeForTests, jsonNativeRuntimeForTests),
compilerPluginDependencies = listOf(serializationPluginForTests)
)
testGenerator("org.jetbrains.kotlinx.serialization.GenerateSerializationTestsKt")
withJvmStdlibAndReflect()
}
fun Test.setUpJsIrBoxTests() {
useJsIrBoxTests(version = version, buildDir = layout.buildDirectory)
val localJsCoreRuntimeForTests: FileCollection = coreJsIrRuntimeForTests
val localJsJsonRuntimeForTests: FileCollection = jsonJsIrRuntimeForTests
doFirst {
systemProperty("serialization.core.path", localJsCoreRuntimeForTests.asPath)
systemProperty("serialization.json.path", localJsJsonRuntimeForTests.asPath)
}
}
//region Workaround for KT-76495 and KTIJ-33877
val publications: PublicationContainer = extensions.getByType<PublishingExtension>().publications
val jpsCompatArtifactId = "kotlin-maven-serialization-for-jps-avoid-using-this"
val jpsCompatPublication = publications.register<MavenPublication>("jpsCompat") {
artifactId = jpsCompatArtifactId
from(components[ADHOC_COMPONENT_NAME])
// Workaround for https://github.com/gradle/gradle/issues/12324
(this as PublicationInternal<*>).isAlias = true
configureKotlinPomAttributes(
project,
explicitDescription = "A workaround for KT-76495 and KTIJ-33877. Avoid depending on this artifact as it can be removed without prior notice."
)
}
configureSbom(
target = "${jpsCompatPublication.name.capitalize()}Publication",
documentName = jpsCompatArtifactId,
publication = jpsCompatPublication
)
//endregion