[Gradle] ExternalTargetApi: Add sourcesElements-published and add this configuration to the published component

^KT-58109 In Progress
This commit is contained in:
Sebastian Sellmair
2023-06-29 11:45:20 +02:00
committed by Space Team
parent aee9b7aae3
commit 3f1faa26ac
7 changed files with 126 additions and 9 deletions
@@ -720,7 +720,9 @@ public class org/jetbrains/kotlin/gradle/plugin/mpp/external/DecoratedExternalKo
public final fun getRuntimeElementsConfiguration ()Lorg/gradle/api/artifacts/Configuration;
public fun getRuntimeElementsConfigurationName ()Ljava/lang/String;
public final fun getRuntimeElementsPublishedConfiguration ()Lorg/gradle/api/artifacts/Configuration;
public final fun getSourcesElementsConfiguration ()Lorg/gradle/api/artifacts/Configuration;
public fun getSourcesElementsConfigurationName ()Ljava/lang/String;
public final fun getSourcesElementsPublishedConfiguration ()Lorg/gradle/api/artifacts/Configuration;
public fun getTargetName ()Ljava/lang/String;
public fun getUseDisambiguationClassifierAsSourceSetNamePrefix ()Z
public fun isSourcesPublishable ()Z
@@ -799,6 +801,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/mpp/external/
public abstract fun getRuntimeElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
public abstract fun getRuntimeElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
public abstract fun getSourcesElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
public abstract fun getSourcesElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptor;
public abstract fun getTargetFactory ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetDescriptor$TargetFactory;
public abstract fun getTargetName ()Ljava/lang/String;
}
@@ -816,6 +819,7 @@ public final class org/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotli
public final fun getRuntimeElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
public final fun getRuntimeElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
public final fun getSourcesElements ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
public final fun getSourcesElementsPublished ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetConfigurationDescriptorBuilder;
public final fun getTargetFactory ()Lorg/jetbrains/kotlin/gradle/plugin/mpp/external/ExternalKotlinTargetDescriptor$TargetFactory;
public final fun getTargetName ()Ljava/lang/String;
public final fun setPlatformType (Lorg/jetbrains/kotlin/gradle/plugin/KotlinPlatformType;)V
@@ -40,7 +40,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.InternalKotlinTarget
*/
@ExternalKotlinTargetApi
open class DecoratedExternalKotlinTarget internal constructor(
internal val delegate: ExternalKotlinTargetImpl
internal val delegate: ExternalKotlinTargetImpl,
) : InternalKotlinTarget by delegate {
constructor(delegate: Delegate) : this(delegate.impl)
@@ -50,10 +50,20 @@ open class DecoratedExternalKotlinTarget internal constructor(
val runtimeElementsConfiguration: Configuration = delegate.runtimeElementsConfiguration
/**
* @since 1.9.20
*/
val sourcesElementsConfiguration: Configuration = delegate.sourcesElementsConfiguration
val apiElementsPublishedConfiguration: Configuration = delegate.apiElementsPublishedConfiguration
val runtimeElementsPublishedConfiguration: Configuration = delegate.runtimeElementsPublishedConfiguration
/**
* @since 1.9.20
*/
val sourcesElementsPublishedConfiguration: Configuration = delegate.sourcesElementsPublishedConfiguration
internal val logger: Logger = delegate.logger
}
@@ -37,6 +37,11 @@ interface ExternalKotlinTargetDescriptor<T : DecoratedExternalKotlinTarget> {
val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
/**
* @since 1.9.20
*/
val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>
val configure: ((T) -> Unit)?
val configureIdeImport: (IdeMultiplatformImport.() -> Unit)?
}
@@ -91,6 +96,12 @@ class ExternalKotlinTargetDescriptorBuilder<T : DecoratedExternalKotlinTarget> i
val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
/**
* @since 1.9.20
*/
val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptorBuilder<T> =
ExternalKotlinTargetConfigurationDescriptorBuilder()
private var configure: ((T) -> Unit)? = null
/**
@@ -128,6 +139,7 @@ class ExternalKotlinTargetDescriptorBuilder<T : DecoratedExternalKotlinTarget> i
sourcesElements = sourcesElements.build(),
apiElementsPublished = apiElementsPublished.build(),
runtimeElementsPublished = runtimeElementsPublished.build(),
sourcesElementsPublished = sourcesElementsPublished.build(),
configure = configure,
configureIdeImport = configureIdeImport
)
@@ -142,6 +154,7 @@ private data class ExternalKotlinTargetDescriptorImpl<T : DecoratedExternalKotli
override val sourcesElements: ExternalKotlinTargetConfigurationDescriptor<T>,
override val apiElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
override val runtimeElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
override val sourcesElementsPublished: ExternalKotlinTargetConfigurationDescriptor<T>,
override val configure: ((T) -> Unit)?,
override val configureIdeImport: (IdeMultiplatformImport.() -> Unit)?,
) : ExternalKotlinTargetDescriptor<T>
@@ -32,6 +32,7 @@ internal class ExternalKotlinTargetImpl internal constructor(
val sourcesElementsConfiguration: Configuration,
val apiElementsPublishedConfiguration: Configuration,
val runtimeElementsPublishedConfiguration: Configuration,
val sourcesElementsPublishedConfiguration: Configuration,
val kotlinTargetComponent: ExternalKotlinTargetComponent,
private val artifactsTaskLocator: ArtifactsTaskLocator,
) : InternalKotlinTarget {
@@ -78,7 +79,7 @@ internal class ExternalKotlinTargetImpl internal constructor(
@InternalKotlinGradlePluginApi
override val kotlinComponents: Set<KotlinTargetComponent> = setOf(kotlinTargetComponent)
override val components: Set<SoftwareComponent> by lazy {
override val components: Set<ExternalKotlinTargetSoftwareComponent> by lazy {
logger.debug("Creating SoftwareComponent")
setOf(ExternalKotlinTargetSoftwareComponent(this))
}
@@ -31,6 +31,10 @@ internal fun ExternalKotlinTargetSoftwareComponent(
details.mapToMavenScope("runtime")
}
if (target.isSourcesPublishable) {
adhocSoftwareComponent.addVariantsFromConfiguration(target.sourcesElementsPublishedConfiguration) { _ -> }
}
@OptIn(UnsafeApi::class)
return ExternalKotlinTargetSoftwareComponent(
target.project.multiplatformExtension,
@@ -42,7 +46,7 @@ internal fun ExternalKotlinTargetSoftwareComponent(
internal class ExternalKotlinTargetSoftwareComponent @UnsafeApi constructor(
private val multiplatformExtension: KotlinMultiplatformExtension,
private val adhocSoftwareComponent: SoftwareComponentInternal,
private val kotlinTargetComponent: ExternalKotlinTargetComponent
private val kotlinTargetComponent: ExternalKotlinTargetComponent,
) : ComponentWithCoordinates, ComponentWithVariants, SoftwareComponentInternal {
override fun getName(): String = adhocSoftwareComponent.name
override fun getUsages(): Set<UsageContext> = adhocSoftwareComponent.usages
@@ -32,7 +32,7 @@ import org.jetbrains.kotlin.gradle.utils.named
*/
@ExternalKotlinTargetApi
fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExternalKotlinTarget(
descriptor: ExternalKotlinTargetDescriptor<T>
descriptor: ExternalKotlinTargetDescriptor<T>,
): T {
val apiElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "apiElements"))
val runtimeElementsConfiguration = project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements"))
@@ -44,6 +44,9 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
val runtimeElementsPublishedConfiguration =
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "runtimeElements-published"))
val sourcesElementsPublishedConfiguration =
project.configurations.maybeCreate(lowerCamelCaseName(descriptor.targetName, "sourcesElements-published"))
val kotlinTargetComponent = ExternalKotlinTargetComponent(
ExternalKotlinTargetComponent.TargetProvider.byTargetName(this, descriptor.targetName)
)
@@ -62,6 +65,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
sourcesElementsConfiguration = sourcesElementsConfiguration,
apiElementsPublishedConfiguration = apiElementsPublishedConfiguration,
runtimeElementsPublishedConfiguration = runtimeElementsPublishedConfiguration,
sourcesElementsPublishedConfiguration = sourcesElementsPublishedConfiguration,
kotlinTargetComponent = kotlinTargetComponent,
artifactsTaskLocator = artifactsTaskLocator
)
@@ -71,6 +75,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
target.setupRuntimeElements(runtimeElementsConfiguration)
target.setupRuntimeElements(runtimeElementsPublishedConfiguration)
target.setupSourcesElements(sourcesElementsConfiguration)
target.setupSourcesElements(sourcesElementsPublishedConfiguration)
apiElementsConfiguration.markConsumable()
runtimeElementsConfiguration.markConsumable()
sourcesElementsConfiguration.markConsumable()
@@ -80,6 +85,8 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
apiElementsPublishedConfiguration.isCanBeResolved = false
runtimeElementsPublishedConfiguration.isCanBeResolved = false
runtimeElementsPublishedConfiguration.isCanBeConsumed = false
sourcesElementsPublishedConfiguration.isCanBeConsumed = false
sourcesElementsPublishedConfiguration.isCanBeResolved = false
val decorated = descriptor.targetFactory.create(DecoratedExternalKotlinTarget.Delegate(target))
target.onCreated()
@@ -90,6 +97,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
descriptor.sourcesElements.configure?.invoke(decorated, sourcesElementsConfiguration)
descriptor.apiElementsPublished.configure?.invoke(decorated, apiElementsPublishedConfiguration)
descriptor.runtimeElementsPublished.configure?.invoke(decorated, runtimeElementsPublishedConfiguration)
descriptor.sourcesElementsPublished.configure?.invoke(decorated, sourcesElementsPublishedConfiguration)
descriptor.configureIdeImport?.invoke(project.kotlinIdeMultiplatformImport)
targets.add(decorated)
@@ -102,7 +110,7 @@ fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExter
*/
@ExternalKotlinTargetApi
fun <T : DecoratedExternalKotlinTarget> KotlinMultiplatformExtension.createExternalKotlinTarget(
descriptor: ExternalKotlinTargetDescriptorBuilder<T>.() -> Unit
descriptor: ExternalKotlinTargetDescriptorBuilder<T>.() -> Unit,
): T {
return createExternalKotlinTarget(ExternalKotlinTargetDescriptor(descriptor))
}
@@ -121,4 +129,4 @@ private fun ExternalKotlinTargetImpl.setupRuntimeElements(configuration: Configu
private fun ExternalKotlinTargetImpl.setupSourcesElements(configuration: Configuration) {
configuration.configureSourcesPublicationAttributes(this)
}
}
@@ -7,6 +7,9 @@
package org.jetbrains.kotlin.gradle.unitTests
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.DocsType
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
@@ -20,9 +23,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.external.ExternalKotlinTargetDescr
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
import org.jetbrains.kotlin.gradle.utils.property
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
import org.jetbrains.kotlin.gradle.utils.toMap
import kotlin.test.*
class ExternalKotlinTargetApiTests {
@@ -89,4 +91,79 @@ class ExternalKotlinTargetApiTests {
assertEquals(KotlinSourceSetTree.main, KotlinSourceSetTree.orNull(mainCompilation))
assertNull(KotlinSourceSetTree.orNull(auxCompilation))
}
@Test
fun `test - sourcesElements - default configuration`() = buildProjectWithMPP().runLifecycleAwareTest {
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
assertNotEquals(target.sourcesElementsConfiguration, target.sourcesElementsPublishedConfiguration)
assertEquals(
target.sourcesElementsConfigurationName,
target.sourcesElementsConfiguration.name
)
assertEquals(
target.sourcesElementsConfiguration.attributes.toMap(),
target.sourcesElementsPublishedConfiguration.attributes.toMap(),
"Expected sourcesElements and sourcesElementsPublished to contain the same attributes"
)
assertEquals(
KotlinPlatformType.jvm, target.sourcesElementsPublishedConfiguration.attributes.getAttribute(KotlinPlatformType.attribute),
"Expected KotlinPlatformType attribute to be present"
)
assertEquals(
Category.DOCUMENTATION, target.sourcesElementsPublishedConfiguration.attributes.getAttribute(Category.CATEGORY_ATTRIBUTE)?.name,
"Expected 'Category.DOCUMENTATION' as category attribute"
)
assertEquals(
DocsType.SOURCES, target.sourcesElementsPublishedConfiguration.attributes.getAttribute(DocsType.DOCS_TYPE_ATTRIBUTE)?.name,
"Expected 'DocsType.SOURCES' attribute"
)
}
@Test
fun `test - sourcesElements - configure`() = buildProjectWithMPP().runLifecycleAwareTest {
val testAttribute = Attribute.of("for.test", String::class.java)
val target = kotlin.createExternalKotlinTarget<FakeTarget> {
defaults()
sourcesElements.configure { target, configuration ->
assertEquals(target.sourcesElementsConfiguration, configuration)
configuration.attributes.attribute(testAttribute, "sourcesElements")
}
sourcesElementsPublished.configure { target, configuration ->
assertEquals(target.sourcesElementsPublishedConfiguration, configuration)
configuration.attributes.attribute(testAttribute, "sourcesElements-published")
}
}
/* Check traces left before */
assertEquals("sourcesElements", target.sourcesElementsConfiguration.attributes.getAttribute(testAttribute))
assertEquals("sourcesElements-published", target.sourcesElementsPublishedConfiguration.attributes.getAttribute(testAttribute))
}
@Test
fun `test - sourcesElements - publication`() = buildProjectWithMPP().runLifecycleAwareTest {
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
val component = target.delegate.components.singleOrNull() ?: fail("Expected single 'component' for external target")
component.usages.find { it.name == target.sourcesElementsPublishedConfiguration.name }
?: fail("Missing sourcesElements usage")
}
@Test
fun `test - sourcesElements - publication - withSourcesJar set to false`() = buildProjectWithMPP().runLifecycleAwareTest {
val target = kotlin.createExternalKotlinTarget<FakeTarget> { defaults() }
target.withSourcesJar(false)
val component = target.delegate.components.singleOrNull() ?: fail("Expected single 'component' for external target")
val sourcesUsage = component.usages.find { it.name.contains("sources", true) }
if (sourcesUsage != null) {
fail("Unexpected usage '${sourcesUsage.name} in target publication")
}
}
}