build.gradle.kts (221 lines of code) (raw):
import org.gradle.jvm.tasks.Jar
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import plugins.publishing.*
/*
* Copyright 2000-2021 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
repositories {
mavenCentral()
}
plugins {
kotlin("multiplatform") version "1.9.22"
`maven-publish`
java
}
val projectVersion = project.findProperty("projectVersion") as String
println("##teamcity[setParameter name='java.annotations.version' value='$projectVersion']")
// https://github.com/gradle/gradle/issues/847
group = "org.jetbrains.proto"
version = projectVersion
kotlin {
androidNativeArm32()
androidNativeArm64()
androidNativeX86()
androidNativeX64()
iosArm64()
iosX64()
iosSimulatorArm64()
js(IR) {
browser {}
}
jvmToolchain(8)
jvm {
compilations.all {
kotlinOptions.jvmTarget = "1.8"
}
withJava()
}
linuxArm64()
linuxX64()
macosX64()
macosArm64()
mingwX64()
tvosArm64()
tvosX64()
tvosSimulatorArm64()
@Suppress("OPT_IN_USAGE")
wasmJs {
browser()
}
@Suppress("OPT_IN_USAGE")
wasmWasi {
nodejs()
}
watchosArm32()
watchosArm64()
watchosDeviceArm64()
watchosX64()
watchosSimulatorArm64()
sourceSets {
val commonMain by getting {
dependencies {
compileOnly("org.jetbrains.kotlin:kotlin-stdlib")
}
}
val nonJvmMain by creating {
dependsOn(commonMain)
}
}
targets.onEach {
if (it.platformType != KotlinPlatformType.jvm && it.platformType != KotlinPlatformType.common) {
it.compilations.getByName("main").defaultSourceSet.dependsOn(sourceSets.getByName("nonJvmMain"))
}
}
targets.all {
compilations.all {
compilerOptions.configure {
optIn.add("kotlin.ExperimentalMultiplatform")
freeCompilerArgs.add("-Xexpect-actual-classes")
}
}
}
}
// from https://github.com/Kotlin/kotlinx-datetime/blob/bc8adee2b9e3659e8e1c38fc09f3a4a1bdf85276/core/build.gradle.kts
tasks {
val compileJavaModuleInfo by registering(JavaCompile::class) {
val moduleName = "org.jetbrains.annotations" // this module's name
val compileKotlinJvm by getting(KotlinCompile::class)
val compileJava by getting(JavaCompile::class)
val sourceDir = file("src/jvmMain/moduleInfo/")
val targetDir = compileKotlinJvm.destinationDirectory.map { it.dir("../moduleInfo/") }
// Use a Java 11 compiler for the module info.
javaCompiler.set(project.javaToolchains.compilerFor { languageVersion.set(JavaLanguageVersion.of(11)) })
// Always compile kotlin and java classes before the module descriptor.
dependsOn(compileKotlinJvm)
dependsOn(compileJava)
// Add the module-info source file.
source(sourceDir)
// 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(listOf("--patch-module", "$moduleName=${compileJava.destinationDirectory.get()}"))
// Use the classpath of the compileKotlinJvm task.
// Also ensure that the module path is used instead of classpath.
classpath = compileKotlinJvm.libraries
modularity.inferModulePath.set(true)
}
// Configure the JAR task so that it will include the compiled module-info class file.
val jvmJar by existing(Jar::class) {
manifest {
attributes("Multi-Release" to true)
}
from(compileJavaModuleInfo.map { it.destinationDirectory }) {
into("META-INF/versions/9/")
}
}
val javaOnlySourcesJar by creating(Jar::class) {
from(kotlin.sourceSets["jvmMain"].kotlin) {
into("")
}
archiveClassifier.set("sources")
}
val allMetadataJar by existing(Jar::class) {
archiveClassifier.set("common")
}
val javadocJar by creating(Jar::class) {
from(javadoc)
archiveClassifier.set("javadoc")
}
}
configurations {
create("javaOnlySourcesElements") {
copyAttributes(configurations.findByName("jvmSourcesElements")!!.attributes, attributes)
}
create("javadocElements") {
attributes {
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category::class.java, Category.DOCUMENTATION))
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling::class.java, Bundling.EXTERNAL))
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType::class.java, DocsType.JAVADOC))
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, Usage.JAVA_RUNTIME))
}
}
}
artifacts {
add("javaOnlySourcesElements", tasks.getByName("javaOnlySourcesJar"))
add("javadocElements", tasks.getByName("javadocJar"))
}
publishing {
repositories {
maven {
setUrl(layout.buildDirectory.dir("maven-central-artifacts"))
}
}
val artifactBaseName = base.archivesName.get()
configureMultiModuleMavenPublishing {
val rootModule = module("rootModule") {
mavenPublication {
artifactId = artifactBaseName
groupId = "org.jetbrains"
configureKotlinPomAttributes(packaging = "jar")
}
variant("metadataApiElements") { suppressPomMetadataWarnings() }
variant("metadataSourcesElementsFromJvm") {
name = "metadataSourcesElements"
configuration {
// to avoid clash in Gradle 8+ with metadataSourcesElements configuration with the same attributes
isCanBeConsumed = false
}
attributes {
copyAttributes(from = project.configurations["metadataSourcesElements"].attributes, to = this)
}
artifact(tasks["sourcesJar"]) {
classifier = "sources-common"
}
}
variant("jvmApiElements")
variant("jvmRuntimeElements") {
configureVariantDetails { mapToMavenScope("runtime") }
}
variant("javaOnlySourcesElements")
variant("javadocElements")
}
val targetModules = kotlin.targets.filter { it.targetName != "jvm" && it.targetName != "metadata" }.map { target ->
val targetName = target.targetName
module("${targetName}Module") {
mavenPublication {
artifactId = "$artifactBaseName-$targetName"
groupId = "org.jetbrains"
configureKotlinPomAttributes(packaging = "klib")
}
variant("${targetName}ApiElements")
if (configurations.findByName("${targetName}RuntimeElements") != null) {
variant("${targetName}RuntimeElements")
}
variant("${targetName}SourcesElements")
}
}
// Makes all variants from accompanying artifacts visible through `available-at`
rootModule.include(*targetModules.toTypedArray())
}
}
fun MavenPublication.configureKotlinPomAttributes(
packaging: String,
) {
pom {
this.packaging = packaging
name.set("JetBrains Java Annotations")
description.set("A set of annotations used for code inspection support and code documentation.")
url.set("https://github.com/JetBrains/java-annotations")
scm {
url.set("https://github.com/JetBrains/java-annotations")
connection.set("scm:git:git://github.com/JetBrains/java-annotations.git")
developerConnection.set("scm:git:ssh://github.com:JetBrains/java-annotations.git")
}
licenses {
license {
name.set("The Apache Software License, Version 2.0")
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
distribution.set("repo")
}
}
developers {
developer {
id.set("JetBrains")
name.set("JetBrains Team")
organization.set("JetBrains")
organizationUrl.set("https://www.jetbrains.com")
}
}
}
}