blob: b9db1eb649be0e3bc683a85bb0b5b4b85634cf02 [file] [log] [blame]
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
import org.gradle.api.Action
import org.gradle.api.GradleException
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ModuleDependency
import org.gradle.api.artifacts.type.ArtifactTypeDefinition
import org.gradle.api.attributes.*
import org.gradle.api.attributes.java.TargetJvmEnvironment
import org.gradle.api.attributes.java.TargetJvmVersion
import org.gradle.api.attributes.plugin.GradlePluginApiVersion
import org.gradle.api.file.FileCollection
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.plugins.JavaLibraryPlugin
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.tasks.Copy
import org.gradle.api.tasks.SourceSet
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.jvm.tasks.Jar
import org.gradle.kotlin.dsl.*
import org.gradle.plugin.devel.plugins.JavaGradlePluginPlugin
import org.jetbrains.dokka.DokkaVersion
import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.dokka.gradle.GradleExternalDocumentationLinkBuilder
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import plugins.configureDefaultPublishing
import plugins.configureKotlinPomAttributes
import java.net.URL
import java.util.*
/**
* Gradle plugins common variants.
*
* [minimalSupportedGradleVersion] - minimal Gradle version that is supported in this variant
* [gradleApiVersion] - Gradle API dependency version. Usually should be the same as [minimalSupportedGradleVersion].
*/
enum class GradlePluginVariant(
val sourceSetName: String,
val minimalSupportedGradleVersion: String,
val gradleApiVersion: String,
val gradleApiJavadocUrl: String
) {
GRADLE_MIN("main", "6.8.3", "6.9", "https://docs.gradle.org/6.9.3/javadoc/"),
GRADLE_70("gradle70", "7.0", "7.0", "https://docs.gradle.org/7.0.2/javadoc/"),
GRADLE_71("gradle71", "7.1", "7.1", "https://docs.gradle.org/7.1.1/javadoc/"),
GRADLE_74("gradle74", "7.4", "7.4", "https://docs.gradle.org/7.4.2/javadoc/"),
GRADLE_75("gradle75", "7.5", "7.5", "https://docs.gradle.org/7.5.1/javadoc/"),
GRADLE_76("gradle76", "7.6", "7.6", "https://docs.gradle.org/7.6/javadoc/"),
}
val commonSourceSetName = "common"
/**
* Configures common pom configuration parameters
*/
fun Project.configureCommonPublicationSettingsForGradle(
signingRequired: Boolean
) {
plugins.withId("maven-publish") {
configureDefaultPublishing(signingRequired)
extensions.configure<PublishingExtension> {
publications
.withType<MavenPublication>()
.configureEach {
configureKotlinPomAttributes(project)
}
}
}
}
/**
* These dependencies will be provided by Gradle, and we should prevent version conflict
*/
fun Configuration.excludeGradleCommonDependencies() {
dependencies
.withType<ModuleDependency>()
.configureEach {
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk7")
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-jdk8")
exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib-common")
exclude(group = "org.jetbrains.kotlin", module = "kotlin-reflect")
exclude(group = "org.jetbrains.kotlin", module = "kotlin-script-runtime")
}
}
/**
* Exclude Gradle runtime from given SourceSet configurations.
*/
fun Project.excludeGradleCommonDependencies(sourceSet: SourceSet) {
configurations[sourceSet.implementationConfigurationName].excludeGradleCommonDependencies()
configurations[sourceSet.apiConfigurationName].excludeGradleCommonDependencies()
configurations[sourceSet.runtimeOnlyConfigurationName].excludeGradleCommonDependencies()
}
/**
* Common sources for all variants.
* Should contain classes that are independent of Gradle API version or using minimal supported Gradle api.
*/
fun Project.createGradleCommonSourceSet(): SourceSet {
val commonSourceSet = sourceSets.create(commonSourceSetName) {
excludeGradleCommonDependencies(this)
// Adding Gradle API to separate configuration, so version will not leak into variants
val commonGradleApiConfiguration = configurations.create("commonGradleApiCompileOnly") {
isVisible = false
isCanBeConsumed = false
isCanBeResolved = true
}
configurations[compileClasspathConfigurationName].extendsFrom(commonGradleApiConfiguration)
dependencies {
compileOnlyConfigurationName(kotlinStdlib())
"commonGradleApiCompileOnly"("dev.gradleplugins:gradle-api:7.6")
if (this@createGradleCommonSourceSet.name != "kotlin-gradle-plugin-api" &&
this@createGradleCommonSourceSet.name != "android-test-fixes" &&
this@createGradleCommonSourceSet.name != "gradle-warnings-detector"
) {
compileOnlyConfigurationName(project(":kotlin-gradle-plugin-api")) {
capabilities {
requireCapability("org.jetbrains.kotlin:kotlin-gradle-plugin-api-common")
}
}
}
}
}
plugins.withType<JavaLibraryPlugin>().configureEach {
this@createGradleCommonSourceSet.extensions.configure<JavaPluginExtension> {
registerFeature(commonSourceSet.name) {
usingSourceSet(commonSourceSet)
disablePublication()
}
}
}
// Common outputs will also produce '${project.name}.kotlin_module' file, so we need to avoid
// files clash
tasks.named<KotlinCompile>("compile${commonSourceSet.name.replaceFirstChar { it.uppercase() }}Kotlin") {
@Suppress("DEPRECATION")
kotlinOptions {
moduleName = "${this@createGradleCommonSourceSet.name}_${commonSourceSet.name}"
}
}
return commonSourceSet
}
/**
* Fixes wired SourceSet does not expose compiled common classes and common resources as secondary variant
* which is used in the Kotlin Project compilation.
*/
private fun Project.fixWiredSourceSetSecondaryVariants(
wireSourceSet: SourceSet,
commonSourceSet: SourceSet
) {
configurations
.matching {
it.name == wireSourceSet.apiElementsConfigurationName ||
it.name == wireSourceSet.runtimeElementsConfigurationName
}
.configureEach {
outgoing {
variants.maybeCreate("classes").apply {
attributes {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.CLASSES))
}
(commonSourceSet.output.classesDirs.files + wireSourceSet.output.classesDirs.files)
.toSet()
.forEach {
if (!artifacts.files.contains(it)) {
artifact(it) {
type = ArtifactTypeDefinition.JVM_CLASS_DIRECTORY
}
}
}
}
}
}
configurations
.matching { it.name == wireSourceSet.runtimeElementsConfigurationName }
.configureEach {
outgoing {
val resourcesDirectories = listOfNotNull(
commonSourceSet.output.resourcesDir,
wireSourceSet.output.resourcesDir
)
if (resourcesDirectories.isNotEmpty()) {
variants.maybeCreate("resources").apply {
attributes {
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.RESOURCES))
}
resourcesDirectories.forEach {
if (!artifacts.files.contains(it)) {
artifact(it) {
type = ArtifactTypeDefinition.JVM_RESOURCES_DIRECTORY
}
}
}
}
}
}
}
}
/**
* Make [wireSourceSet] to extend [commonSourceSet].
*/
fun Project.wireGradleVariantToCommonGradleVariant(
wireSourceSet: SourceSet,
commonSourceSet: SourceSet
) {
wireSourceSet.compileClasspath += commonSourceSet.output
wireSourceSet.runtimeClasspath += commonSourceSet.output
// Allowing to use 'internal' classes/methods from common source code
(extensions.getByName("kotlin") as KotlinSingleJavaTargetExtension).target.compilations.run {
getByName(wireSourceSet.name).associateWith(getByName(commonSourceSet.name))
}
configurations[wireSourceSet.apiConfigurationName].extendsFrom(
configurations[commonSourceSet.apiConfigurationName]
)
configurations[wireSourceSet.implementationConfigurationName].extendsFrom(
configurations[commonSourceSet.implementationConfigurationName]
)
configurations[wireSourceSet.runtimeOnlyConfigurationName].extendsFrom(
configurations[commonSourceSet.runtimeOnlyConfigurationName]
)
configurations[wireSourceSet.compileOnlyConfigurationName].extendsFrom(
configurations[commonSourceSet.compileOnlyConfigurationName]
)
fixWiredSourceSetSecondaryVariants(wireSourceSet, commonSourceSet)
tasks.withType<Jar>().configureEach {
if (name == wireSourceSet.jarTaskName) {
from(wireSourceSet.output, commonSourceSet.output)
setupPublicJar(archiveBaseName.get())
addEmbeddedRuntime()
} else if (name == wireSourceSet.sourcesJarTaskName) {
from(wireSourceSet.allSource, commonSourceSet.allSource)
}
}
}
private const val FIXED_CONFIGURATION_SUFFIX = "WithFixedAttribute"
/**
* 'main' sources are used for minimal supported Gradle versions (6.7) up to Gradle 7.0.
*/
fun Project.reconfigureMainSourcesSetForGradlePlugin(
commonSourceSet: SourceSet
) {
sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME) {
plugins.withType<JavaGradlePluginPlugin>().configureEach {
// Removing Gradle api default dependency added by 'java-gradle-plugin'
configurations[apiConfigurationName].dependencies.remove(dependencies.gradleApi())
}
dependencies {
"compileOnly"(kotlinStdlib())
// Decoupling gradle-api artifact from current project Gradle version. Later would be useful for
// gradle plugin variants
"compileOnly"("dev.gradleplugins:gradle-api:${GradlePluginVariant.GRADLE_MIN.gradleApiVersion}")
if (this@reconfigureMainSourcesSetForGradlePlugin.name != "kotlin-gradle-plugin-api" &&
this@reconfigureMainSourcesSetForGradlePlugin.name != "android-test-fixes" &&
this@reconfigureMainSourcesSetForGradlePlugin.name != "gradle-warnings-detector"
) {
"api"(project(":kotlin-gradle-plugin-api"))
}
}
excludeGradleCommonDependencies(this)
wireGradleVariantToCommonGradleVariant(this, commonSourceSet)
// https://youtrack.jetbrains.com/issue/KT-51913
// Remove workaround after bootstrap update
if (configurations["default"].attributes.contains(TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE)) {
configurations["default"].attributes.attribute(
TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
objects.named(TargetJvmEnvironment::class, "no-op")
)
}
plugins.withType<JavaLibraryPlugin>().configureEach {
this@reconfigureMainSourcesSetForGradlePlugin
.extensions
.configure<JavaPluginExtension> {
withSourcesJar()
if (kotlinBuildProperties.publishGradlePluginsJavadoc) {
withJavadocJar()
}
}
}
// Workaround for https://youtrack.jetbrains.com/issue/KT-52987
val javaComponent = project.components["java"] as AdhocComponentWithVariants
listOf(
runtimeElementsConfigurationName,
apiElementsConfigurationName
)
.map { configurations[it] }
.forEach { originalConfiguration ->
configurations.create("${originalConfiguration.name}$FIXED_CONFIGURATION_SUFFIX") {
isCanBeResolved = originalConfiguration.isCanBeResolved
isCanBeConsumed = originalConfiguration.isCanBeConsumed
isVisible = originalConfiguration.isVisible
setExtendsFrom(originalConfiguration.extendsFrom)
artifacts {
originalConfiguration.artifacts.forEach {
add(name, it)
}
}
// Removing 'org.jetbrains.kotlin.platform.type' attribute
// as it brings issues with Gradle variant resolve on Gradle 7.6+ versions
attributes {
originalConfiguration.attributes.keySet()
.filter { it.name != KotlinPlatformType.attribute.name }
.forEach { originalAttribute ->
@Suppress("UNCHECKED_CAST")
attribute(
originalAttribute as Attribute<Any>,
originalConfiguration.attributes.getAttribute(originalAttribute)!!
)
}
plugins.withType<JavaPlugin> {
tasks.named<JavaCompile>(compileJavaTaskName).get().apply {
attribute(
TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE,
targetCompatibility.toInt()
)
}
}
}
val expectedAttributes = setOf(
Category.CATEGORY_ATTRIBUTE,
Bundling.BUNDLING_ATTRIBUTE,
Usage.USAGE_ATTRIBUTE,
LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE,
TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE
)
if (attributes.keySet() != expectedAttributes) {
error("Wrong set of attributes:\n" +
" Expected: ${expectedAttributes.joinToString(", ")}\n" +
" Actual: ${attributes.keySet().joinToString(", ") { "${it.name}=${attributes.getAttribute(it)}" }}")
}
javaComponent.addVariantsFromConfiguration(this) {
mapToMavenScope(
when (originalConfiguration.name) {
runtimeElementsConfigurationName -> "runtime"
apiElementsConfigurationName -> "compile"
else -> error("Unsupported configuration name")
}
)
}
// Make original configuration unpublishable and not visible
originalConfiguration.isCanBeConsumed = false
originalConfiguration.isVisible = false
javaComponent.withVariantsFromConfiguration(originalConfiguration) {
skip()
}
}
}
}
// Fix common sources visibility for tests
sourceSets.named(SourceSet.TEST_SOURCE_SET_NAME) {
compileClasspath += commonSourceSet.output
runtimeClasspath += commonSourceSet.output
}
// Allowing to use 'internal' classes/methods from common source code
(extensions.getByName("kotlin") as KotlinSingleJavaTargetExtension).target.compilations.run {
getByName(SourceSet.TEST_SOURCE_SET_NAME).associateWith(getByName(commonSourceSet.name))
}
}
/**
* Adding plugin variants: https://docs.gradle.org/current/userguide/implementing_gradle_plugins.html#plugin-with-variants
*/
fun Project.createGradlePluginVariant(
variant: GradlePluginVariant,
commonSourceSet: SourceSet,
isGradlePlugin: Boolean = true
): SourceSet {
val variantSourceSet = sourceSets.create(variant.sourceSetName) {
excludeGradleCommonDependencies(this)
wireGradleVariantToCommonGradleVariant(this, commonSourceSet)
}
plugins.withType<JavaLibraryPlugin>().configureEach {
extensions.configure<JavaPluginExtension> {
registerFeature(variantSourceSet.name) {
usingSourceSet(variantSourceSet)
if (isGradlePlugin) {
capability(project.group.toString(), project.name, project.version.toString())
}
if (kotlinBuildProperties.publishGradlePluginsJavadoc) {
withJavadocJar()
}
withSourcesJar()
}
configurations.named(variantSourceSet.apiElementsConfigurationName, commonVariantAttributes())
configurations.named(variantSourceSet.runtimeElementsConfigurationName, commonVariantAttributes())
}
tasks.named<Jar>(variantSourceSet.sourcesJarTaskName) {
addEmbeddedSources()
}
}
plugins.withId("java-gradle-plugin") {
tasks.named<Copy>(variantSourceSet.processResourcesTaskName) {
val copyPluginDescriptors = rootSpec.addChild()
copyPluginDescriptors.into("META-INF/gradle-plugins")
copyPluginDescriptors.from(tasks.named("pluginDescriptors"))
}
}
configurations.configureEach {
if (isCanBeConsumed && this@configureEach.name.startsWith(variantSourceSet.name)) {
attributes {
attribute(
GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE,
objects.named(variant.minimalSupportedGradleVersion)
)
}
}
}
// KT-52138: Make module name the same for all variants, so KSP could access internal methods/properties
tasks.named<KotlinCompile>("compile${variantSourceSet.name.replaceFirstChar { it.uppercase() }}Kotlin") {
@Suppress("DEPRECATION")
kotlinOptions {
moduleName = this@createGradlePluginVariant.name
}
}
dependencies {
variantSourceSet.compileOnlyConfigurationName(kotlinStdlib())
variantSourceSet.compileOnlyConfigurationName("dev.gradleplugins:gradle-api:${variant.gradleApiVersion}")
if (this@createGradlePluginVariant.name != "kotlin-gradle-plugin-api" &&
this@createGradlePluginVariant.name != "android-test-fixes" &&
this@createGradlePluginVariant.name != "gradle-warnings-detector"
) {
variantSourceSet.apiConfigurationName(project(":kotlin-gradle-plugin-api")) {
capabilities {
requireCapability("org.jetbrains.kotlin:kotlin-gradle-plugin-api-${variant.sourceSetName}")
}
}
}
}
return variantSourceSet
}
/**
* All additional configuration attributes in plugin variant should be the same as in the 'main' variant.
* Otherwise, Gradle <7.0 will fail to select plugin variant.
*/
private fun Project.commonVariantAttributes(): Action<Configuration> = Action<Configuration> {
attributes {
attribute(
TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE,
objects.named(TargetJvmEnvironment.STANDARD_JVM)
)
}
}
fun Project.configureKotlinCompileTasksGradleCompatibility() {
@Suppress("DEPRECATION")
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions.languageVersion = "1.4"
kotlinOptions.apiVersion = "1.4"
kotlinOptions.freeCompilerArgs += listOf(
"-Xskip-prerelease-check",
"-Xsuppress-version-warnings",
"-Xuse-ir" // Needed as long as languageVersion is less than 1.5.
)
}
}
// Will allow combining outputs of multiple SourceSets
fun Project.publishShadowedJar(
sourceSet: SourceSet,
commonSourceSet: SourceSet
) {
val jarTask = tasks.named<Jar>(sourceSet.jarTaskName)
val shadowJarTask = embeddableCompilerDummyForDependenciesRewriting(
taskName = "$EMBEDDABLE_COMPILER_TASK_NAME${sourceSet.jarTaskName.replaceFirstChar { it.uppercase() }}"
) {
setupPublicJar(
jarTask.flatMap { it.archiveBaseName },
jarTask.flatMap { it.archiveClassifier }
)
addEmbeddedRuntime()
from(sourceSet.output)
from(commonSourceSet.output)
// When Gradle traverses the inputs, reject the shaded compiler JAR,
// which leads to the content of that JAR being excluded as well:
val compilerDummyJarConfiguration: FileCollection = project.configurations.getByName("compilerDummyJar")
exclude { it.file == compilerDummyJarConfiguration.singleFile }
}
// Removing artifact produced by Jar task
if (sourceSet.name == SourceSet.MAIN_SOURCE_SET_NAME) {
configurations["${sourceSet.runtimeElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX"]
.artifacts.removeAll { true }
configurations["${sourceSet.apiElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX"]
.artifacts.removeAll { true }
} else {
configurations[sourceSet.runtimeElementsConfigurationName]
.artifacts.removeAll { true }
configurations[sourceSet.apiElementsConfigurationName]
.artifacts.removeAll { true }
}
// Adding instead artifact from shadow jar task
configurations {
artifacts {
if (sourceSet.name == SourceSet.MAIN_SOURCE_SET_NAME) {
add("${sourceSet.runtimeElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX", shadowJarTask)
add("${sourceSet.apiElementsConfigurationName}$FIXED_CONFIGURATION_SUFFIX", shadowJarTask)
} else {
add(sourceSet.apiElementsConfigurationName, shadowJarTask)
add(sourceSet.runtimeElementsConfigurationName, shadowJarTask)
}
}
}
}
fun Project.addBomCheckTask() {
val checkBomTask = tasks.register("checkGradlePluginsBom") {
group = "Validation"
description = "Check if project is added into Kotlin Gradle Plugins bom"
val bomBuildFile = project(":kotlin-gradle-plugins-bom").projectDir.resolve("build.gradle.kts")
val exceptions = listOf(
project(":gradle:android-test-fixes").path,
project(":gradle:gradle-warnings-detector").path,
project(":kotlin-gradle-build-metrics").path,
project(":kotlin-gradle-statistics").path,
)
val projectPath = this@addBomCheckTask.path
doLast {
if (projectPath in exceptions) return@doLast
val constraintsLines = bomBuildFile.readText()
.substringAfter("constraints {")
.substringBefore("}")
.split("\n")
.map { it.trim() }
val isContainingThisProject = constraintsLines.contains(
"api(project(\"$projectPath\"))"
)
if (!isContainingThisProject) {
throw GradleException(":kotlin-gradle-plugins-bom does not contain $projectPath project constraint!")
}
}
}
tasks.named("check") {
dependsOn(checkBomTask)
}
}
fun Project.configureDokkaPublication(
shouldLinkGradleApi: Boolean = false,
configurePublishingToKotlinlang: Boolean = false,
) {
if (!kotlinBuildProperties.publishGradlePluginsJavadoc) return
plugins.apply("org.jetbrains.dokka")
plugins.withId("org.jetbrains.dokka") {
val commonSourceSet = sourceSets.getByName(commonSourceSetName)
GradlePluginVariant.values().forEach { pluginVariant ->
val variantSourceSet = sourceSets.getByName(pluginVariant.sourceSetName)
val dokkaTaskName = "dokka${variantSourceSet.javadocTaskName.replaceFirstChar { it.uppercase() }}"
val dokkaTask = if (tasks.names.contains(dokkaTaskName)) {
tasks.named<DokkaTask>(dokkaTaskName)
} else {
tasks.register<DokkaTask>(dokkaTaskName)
}
dokkaTask.configure {
description = "Generates documentation in 'javadoc' format for '${variantSourceSet.javadocTaskName}' variant"
plugins.dependencies.add(
project.dependencies.create("org.jetbrains.dokka:javadoc-plugin:${DokkaVersion.version}")
)
dokkaSourceSets {
named(commonSourceSet.name) {
suppress.set(false)
jdkVersion.set(8)
}
named(variantSourceSet.name) {
dependsOn(commonSourceSet)
suppress.set(false)
jdkVersion.set(8)
if (shouldLinkGradleApi) {
externalDocumentationLink {
url.set(URL(pluginVariant.gradleApiJavadocUrl))
addWorkaroundForElementList(pluginVariant)
}
}
}
}
}
tasks.named<Jar>(variantSourceSet.javadocJarTaskName) {
from(dokkaTask.flatMap { it.outputDirectory })
}
}
if (configurePublishingToKotlinlang) {
val latestVariant = GradlePluginVariant.values().last()
val olderVersionsDir = layout.buildDirectory.dir("dokka/kotlinlangDocumentationOld")
project.dependencies {
// Version is required due to https://github.com/Kotlin/dokka/issues/2812
"dokkaPlugin"("org.jetbrains.dokka:versioning-plugin:1.8.0-dev-189")
}
tasks.register<DokkaTask>("dokkaKotlinlangDocumentation") {
description = "Generates documentation reference for Kotlinlang"
dokkaSourceSets {
pluginsMapConfiguration.put(
"org.jetbrains.dokka.base.DokkaBase",
"{ \"templatesDir\": \"${layout.projectDirectory.dir("dokka-template")}\" }"
)
pluginsMapConfiguration.put(
"org.jetbrains.dokka.versioning.VersioningPlugin",
olderVersionsDir.map { olderVersionsDir ->
"{ \"version\":\"$version\", \"olderVersionsDir\":\"${olderVersionsDir.asFile}\" }"
}
)
named(commonSourceSet.name) {
suppress.set(false)
jdkVersion.set(8)
}
named(latestVariant.sourceSetName) {
dependsOn(commonSourceSet)
suppress.set(false)
jdkVersion.set(8)
if (shouldLinkGradleApi) {
externalDocumentationLink {
url.set(URL(latestVariant.gradleApiJavadocUrl))
addWorkaroundForElementList(latestVariant)
}
}
}
}
}
}
}
}
// Workaround for https://github.com/Kotlin/dokka/issues/2097
// Gradle 7.6 javadoc does not have published 'package-list' file
private fun GradleExternalDocumentationLinkBuilder.addWorkaroundForElementList(pluginVariant: GradlePluginVariant) {
if (pluginVariant == GradlePluginVariant.GRADLE_76) {
packageListUrl.set(URL("${pluginVariant.gradleApiJavadocUrl}element-list"))
}
}