diff --git a/.idea/dictionaries/4u7.xml b/.idea/dictionaries/4u7.xml index 6b2f1c7ec64..efc103abf3b 100644 --- a/.idea/dictionaries/4u7.xml +++ b/.idea/dictionaries/4u7.xml @@ -11,6 +11,7 @@ protobuf redirector remapper + sonatype unpresent diff --git a/buildSrc/src/main/kotlin/artifacts.kt b/buildSrc/src/main/kotlin/artifacts.kt index 7b825726b01..51ef5bdd83e 100644 --- a/buildSrc/src/main/kotlin/artifacts.kt +++ b/buildSrc/src/main/kotlin/artifacts.kt @@ -8,15 +8,27 @@ import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.ConfigurationContainer import org.gradle.api.artifacts.PublishArtifact import org.gradle.api.artifacts.component.ProjectComponentIdentifier +import org.gradle.api.attributes.Bundling +import org.gradle.api.attributes.Category +import org.gradle.api.attributes.Usage +import org.gradle.api.component.AdhocComponentWithVariants import org.gradle.api.file.DuplicatesStrategy import org.gradle.api.plugins.BasePluginConvention import org.gradle.api.plugins.JavaPlugin +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.publish.maven.plugins.MavenPublishPlugin +import org.gradle.api.publish.maven.tasks.PublishToMavenRepository +import org.gradle.api.publish.tasks.GenerateModuleMetadata import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.Upload import org.gradle.api.tasks.javadoc.Javadoc import org.gradle.jvm.tasks.Jar import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.kotlin.dsl.* +import org.gradle.plugins.signing.SigningExtension +import org.gradle.plugins.signing.SigningPlugin private const val MAGIC_DO_NOT_CHANGE_TEST_JAR_TASK_NAME = "testJar" @@ -29,7 +41,7 @@ fun Project.testsJar(body: Jar.() -> Unit = {}): Jar { pluginManager.withPlugin("java") { from(testSourceSet.output) } - classifier = "tests" + archiveClassifier.set("tests") body() project.addArtifact(testsJarCfg, this, this) } @@ -71,12 +83,14 @@ fun Project.runtimeJarArtifactBy( } } -fun Project.runtimeJar(body: Jar.() -> Unit = {}): TaskProvider = runtimeJar(getOrCreateTask("jar", body), { }) +fun Project.runtimeJar(body: Jar.() -> Unit = {}): TaskProvider = runtimeJar(getOrCreateTask("jar", body)) { } fun Project.runtimeJar(task: TaskProvider, body: T.() -> Unit = {}): TaskProvider { + tasks.named("jar").configure { removeArtifacts(configurations.getOrCreate("archives"), this) } + task.configure { configurations.findByName("embedded")?.let { embedded -> dependsOn(embedded) @@ -85,15 +99,35 @@ fun Project.runtimeJar(task: TaskProvider, body: T.() -> Unit = {}) } } setupPublicJar(project.the().archivesBaseName) - setDuplicatesStrategy(DuplicatesStrategy.EXCLUDE) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE body() } + project.runtimeJarArtifactBy(task, task) + + val runtimeJar = configurations.maybeCreate("runtimeJar").apply { + isCanBeConsumed = true + isCanBeResolved = false + attributes { + attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL)) + } + } + + val javaComponent = components.findByName("java") as AdhocComponentWithVariants + javaComponent.withVariantsFromConfiguration(configurations["runtimeElements"]) { skip() } + javaComponent.addVariantsFromConfiguration(runtimeJar) { } + return task } fun Project.sourcesJar(body: Jar.() -> Unit = {}): TaskProvider { - val task = tasks.register("sourcesJar") { + configure { + withSourcesJar() + } + + val sourcesJar = getOrCreateTask("sourcesJar") { duplicatesStrategy = DuplicatesStrategy.EXCLUDE archiveClassifier.set("sources") @@ -117,13 +151,17 @@ fun Project.sourcesJar(body: Jar.() -> Unit = {}): TaskProvider { body() } - addArtifact("archives", task) - addArtifact("sources", task) + addArtifact("archives", sourcesJar) + addArtifact("sources", sourcesJar) - return task + return sourcesJar } fun Project.javadocJar(body: Jar.() -> Unit = {}): TaskProvider { + configure { + withJavadocJar() + } + val javadocTask = getOrCreateTask("javadocJar") { duplicatesStrategy = DuplicatesStrategy.EXCLUDE archiveClassifier.set("javadoc") @@ -145,7 +183,119 @@ fun Project.standardPublicJars() { javadocJar() } -fun Project.publish(body: Upload.() -> Unit = {}): Upload { +fun Project.publish(moduleMetadata: Boolean = false) { + apply() + apply() + + if (!moduleMetadata) { + tasks.withType { + enabled = false + } + } + + val javaComponent = components.findByName("java") as AdhocComponentWithVariants? + if (javaComponent != null) { + val runtimeElements by configurations + val apiElements by configurations + + val publishedRuntime = configurations.maybeCreate("publishedRuntime").apply { + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + } + extendsFrom(runtimeElements) + } + + val publishedCompile = configurations.maybeCreate("publishedCompile").apply { + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_API)) + } + extendsFrom(apiElements) + } + + javaComponent.withVariantsFromConfiguration(apiElements) { skip() } + + javaComponent.addVariantsFromConfiguration(publishedCompile) { mapToMavenScope("compile") } + javaComponent.addVariantsFromConfiguration(publishedRuntime) { mapToMavenScope("runtime") } + } + + configure { + publications { + create("Main") { + if (javaComponent != null) { + from(javaComponent) + } else { + artifact(tasks["jar"]) + } + + pom { + packaging = "jar" + description.set(project.description) + url.set("https://kotlinlang.org/") + licenses { + license { + name.set("The Apache License, Version 2.0") + url.set("http://www.apache.org/licenses/LICENSE-2.0.txt") + } + } + scm { + url.set("https://github.com/JetBrains/kotlin") + connection.set("scm:git:https://github.com/JetBrains/kotlin.git") + developerConnection.set("scm:git:https://github.com/JetBrains/kotlin.git") + } + developers { + developer { + name.set("Kotlin Team") + organization.set("JetBrains") + organizationUrl.set("https://www.jetbrains.com") + } + } + } + } + } + + repositories { + maven { + name = "Maven" + url = file("${project.rootDir}/build/repo").toURI() + } + } + } + + configure { + setRequired(provider { + project.findProperty("signingRequired")?.toString()?.toBoolean() + ?: project.property("isSonatypeRelease") as Boolean + }) + + sign(extensions.getByType().publications["Main"]) + } + + tasks.register("install") { + dependsOn(tasks.named("publishToMavenLocal")) + } + + tasks.named("publishMainPublicationToMavenRepository") { + dependsOn(project.rootProject.tasks.named("preparePublication")) + doFirst { + val preparePublication = project.rootProject.tasks.named("preparePublication").get() + val username: String? by preparePublication.extra + val password: String? by preparePublication.extra + val repoUrl: String by preparePublication.extra + + repository.apply { + url = uri(repoUrl) + if (url.scheme != "file" && username != null && password != null) { + credentials { + this.username = username + this.password = password + } + } + } + } + } +} + +fun Project.publishWithLegacyMavenPlugin(body: Upload.() -> Unit = {}): Upload { apply() if (artifactsRemovedDiagnosticFlag) { @@ -241,8 +391,8 @@ fun ConfigurationContainer.getOrCreate(name: String): Configuration = findByName fun Jar.setupPublicJar(baseName: String, classifier: String = "") { val buildNumber = project.rootProject.extra["buildNumber"] as String - this.baseName = baseName - this.classifier = classifier + this.archiveBaseName.set(baseName) + this.archiveClassifier.set(classifier) manifest.attributes.apply { put("Implementation-Vendor", "JetBrains") put("Implementation-Title", baseName) @@ -261,9 +411,13 @@ fun Project.addArtifact(configuration: Configuration, task: Task, artifactRef: A fun Project.addArtifact(configurationName: String, task: Task, artifactRef: Any, body: ConfigurablePublishArtifact.() -> Unit = {}) = addArtifact(configurations.getOrCreate(configurationName), task, artifactRef, body) -fun Project.addArtifact(configurationName: String, task: TaskProvider, body: ConfigurablePublishArtifact.() -> Unit = {}) { +fun Project.addArtifact( + configurationName: String, + task: TaskProvider, + body: ConfigurablePublishArtifact.() -> Unit = {} +): PublishArtifact { configurations.maybeCreate(configurationName) - artifacts.add(configurationName, task, body) + return artifacts.add(configurationName, task, body) } fun Project.addArtifact( diff --git a/compiler/daemon/build.gradle.kts b/compiler/daemon/build.gradle.kts index 7ea81df7b37..5260daabb4c 100644 --- a/compiler/daemon/build.gradle.kts +++ b/compiler/daemon/build.gradle.kts @@ -1,5 +1,3 @@ -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar - description = "Kotlin Daemon" plugins { diff --git a/libraries/reflect/build.gradle.kts b/libraries/reflect/build.gradle.kts index 12de5612af6..93a5e223fea 100644 --- a/libraries/reflect/build.gradle.kts +++ b/libraries/reflect/build.gradle.kts @@ -39,6 +39,12 @@ embedded.isTransitive = false configurations.getByName("compileOnly").extendsFrom(embedded) val mainJar by configurations.creating +val modularJar by configurations.creating { + attributes { + attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME)) + } +} + dependencies { compile(kotlinStdlib()) @@ -182,7 +188,11 @@ val relocateCoreSources by task { tasks.getByName("jar").enabled = false -val sourcesJar = tasks.register("sourcesJar") { +java { + withSourcesJar() +} + +val sourcesJar = tasks.named("sourcesJar") { archiveClassifier.set("sources") dependsOn(relocateCoreSources) @@ -210,7 +220,7 @@ val result by task { callGroovy("manifestAttributes", manifest, project, "Main", true) } -val modularJar by task { +val modularJarTask by task { dependsOn(intermediate) archiveClassifier.set("modular") from { @@ -235,7 +245,11 @@ artifacts { } } - add("archives", modularJar) + add("archives", modularJarTask) + add(modularJar.name, modularJarTask) } +val javaComponent = components.findByName("java") as AdhocComponentWithVariants +javaComponent.addVariantsFromConfiguration(modularJar) { } + javadocJar() diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts index fa3307ebb40..678eb90dd76 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts @@ -135,7 +135,7 @@ tasks { failOnWarning = true } - named("install") { + named("install") { dependsOn(named("validateTaskProperties")) } diff --git a/libraries/tools/kotlin-main-kts/build.gradle.kts b/libraries/tools/kotlin-main-kts/build.gradle.kts index 5973b91d3b1..b1cec599a11 100644 --- a/libraries/tools/kotlin-main-kts/build.gradle.kts +++ b/libraries/tools/kotlin-main-kts/build.gradle.kts @@ -108,6 +108,7 @@ val resultJar by task { } addArtifact("runtime", resultJar) +addArtifact("runtimeElements", resultJar) addArtifact("archives", resultJar) sourcesJar()