From ea458e68480169aa63cce4fb0bb63f554d07ef2a Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Fri, 19 Mar 2021 18:20:44 +0300 Subject: [PATCH] Add some API interfaces for Gradle PM20 entities in the API module --- .../kotlin-gradle-plugin-api/build.gradle.kts | 1 + .../plugin/mpp/pm20/KotlinCompilationData.kt | 71 +++++++ .../plugin/mpp/pm20/KotlinGradleFragment.kt | 54 ++++++ .../plugin/mpp/pm20/KotlinGradleModule.kt | 67 +++++++ .../plugin/mpp/pm20/KotlinGradleVariant.kt | 67 +++++++ .../plugin/mpp/GradleProjectModuleBuilder.kt | 74 ++++---- .../kotlin/gradle/plugin/mpp/ModuleIds.kt | 7 - .../plugin/mpp/pm20/KotlinCompilationData.kt | 48 ++--- .../plugin/mpp/pm20/KotlinGradleFragment.kt | 34 +--- .../plugin/mpp/pm20/KotlinGradleModule.kt | 61 ++---- .../mpp/pm20/KotlinGradleModuleFactory.kt | 2 +- .../plugin/mpp/pm20/KotlinJvmVariant.kt | 4 +- .../mpp/pm20/KotlinNativeVariantFactory.kt | 173 ++++++++++++++++++ .../plugin/mpp/pm20/abstractVariants.kt | 51 +++--- .../plugin/mpp/pm20/fragmentFactories.kt | 6 +- .../mpp/pm20/fragmentsMetadataCompilation.kt | 16 +- 16 files changed, 555 insertions(+), 181 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt diff --git a/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts index 45108aae871..9a7f80f87cb 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-api/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { compileOnly(gradleApi()) compileOnly("com.android.tools.build:gradle:3.4.0") + compileOnly(project(":kotlin-project-model")) } pill { diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt new file mode 100644 index 00000000000..4877c2be7c0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt @@ -0,0 +1,71 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.Project +import org.gradle.api.file.FileCollection +import org.gradle.api.file.SourceDirectorySet +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder + +interface KotlinCompilationData { + val project: Project + val owner: Any? + + val compilationPurpose: String + val compilationClassifier: String? + + val kotlinSourceDirectoriesByFragmentName: Map + val compileKotlinTaskName: String + val compileAllTaskName: String + + val compileDependencyFiles: FileCollection + val output: KotlinCompilationOutput + + val languageSettings: LanguageSettingsBuilder + val platformType: KotlinPlatformType + + val moduleName: String + val ownModuleName: String + + val kotlinOptions: T + + val friendPaths: Iterable +} + +interface KotlinVariantCompilationData : KotlinCompilationData { + override val owner: KotlinGradleVariant + + override val project: Project get() = owner.containingModule.project + + override val compilationPurpose: String + get() = owner.containingModule.name + + override val compilationClassifier: String + get() = owner.name + + override val output: KotlinCompilationOutput + get() = owner.compilationOutputs + + override val compileKotlinTaskName: String + + override val compileAllTaskName: String + + override val kotlinSourceDirectoriesByFragmentName: Map + + override val compileDependencyFiles: FileCollection + get() = owner.compileDependencyFiles + + override val languageSettings: LanguageSettingsBuilder + get() = owner.languageSettings + + override val platformType: KotlinPlatformType + get() = owner.platformType + + override val ownModuleName: String +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt new file mode 100644 index 00000000000..6c0b8e71e70 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -0,0 +1,54 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import groovy.lang.Closure +import org.gradle.api.Named +import org.gradle.api.NamedDomainObjectProvider +import org.gradle.api.Project +import org.gradle.api.file.SourceDirectorySet +import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies +import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder +import org.jetbrains.kotlin.project.model.KotlinModuleFragment + +interface KotlinGradleFragment : KotlinModuleFragment, HasKotlinDependencies, Named { + override val kotlinSourceRoots: SourceDirectorySet + + override val containingModule: KotlinGradleModule + + override fun getName(): String = fragmentName + + // TODO pull up to KotlinModuleFragment + // FIXME apply to compilation + // FIXME check for consistency + val languageSettings: LanguageSettingsBuilder + + val project: Project + get() = containingModule.project + + fun refines(other: KotlinGradleFragment) + + fun refines(other: NamedDomainObjectProvider) + + override fun dependencies(configureClosure: Closure) = + dependencies f@{ ConfigureUtil.configure(configureClosure, this@f) } + + companion object { + const val COMMON_FRAGMENT_NAME = "common" + } + + /** This configuration includes the dependencies from the refines-parents */ + val transitiveApiConfigurationName: String + + /** This configuration includes the dependencies from the refines-parents */ + val transitiveImplementationConfigurationName: String + + override val relatedConfigurationNames: List + get() = super.relatedConfigurationNames + + // TODO: resolvable metadata configurations? + listOf(transitiveApiConfigurationName, transitiveImplementationConfigurationName) +} diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt new file mode 100644 index 00000000000..8fd3ea85285 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt @@ -0,0 +1,67 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import groovy.lang.Closure +import org.gradle.api.ExtensiblePolymorphicDomainObjectContainer +import org.gradle.api.Named +import org.gradle.api.NamedDomainObjectSet +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies +import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler +import org.jetbrains.kotlin.project.model.KotlinModule + +interface KotlinGradleModule : KotlinModule, Named, HasKotlinDependencies { + val project: Project + val moduleClassifier: String? + + override val fragments: ExtensiblePolymorphicDomainObjectContainer + + // TODO DSL & build script model: find a way to create a flexible typed view on fragments? + override val variants: NamedDomainObjectSet + + val isPublic: Boolean + + fun ifMadePublic(action: () -> Unit) + + fun makePublic() + + companion object { + const val MAIN_MODULE_NAME = "main" + const val TEST_MODULE_NAME = "test" + } + + override fun getName(): String = when (val classifier = moduleClassifier) { + null -> MAIN_MODULE_NAME + else -> classifier + } + + // DSL + + val common: KotlinGradleFragment + get() = fragments.getByName(KotlinGradleFragment.COMMON_FRAGMENT_NAME) + + fun common(configure: KotlinGradleFragment.() -> Unit) = + common.configure() + + override fun dependencies(configure: KotlinDependencyHandler.() -> Unit) = + common.dependencies(configure) + + override fun dependencies(configureClosure: Closure) = + common.dependencies(configureClosure) + + override val apiConfigurationName: String + get() = common.apiConfigurationName + + override val implementationConfigurationName: String + get() = common.implementationConfigurationName + + override val compileOnlyConfigurationName: String + get() = common.compileOnlyConfigurationName + + override val runtimeOnlyConfigurationName: String + get() = common.runtimeOnlyConfigurationName +} diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt new file mode 100644 index 00000000000..c43d668d9fc --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleVariant.kt @@ -0,0 +1,67 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.FileCollection +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.TaskProvider +import org.gradle.api.tasks.bundling.AbstractArchiveTask +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.project.model.KotlinModuleVariant + +interface KotlinGradleVariant : KotlinGradleFragment, KotlinModuleVariant { + val platformType: KotlinPlatformType + + // TODO generalize with KotlinCompilation? + val compileDependencyConfigurationName: String + + var compileDependencyFiles: FileCollection + + // TODO rewrite using our own artifacts API? + val compilationOutputs: KotlinCompilationOutput + + // TODO rewrite using our own artifacts API + val sourceArchiveTask: TaskProvider + + // TODO generalize exposing outputs: what if a variant has more than one such configurations or none? + val apiElementsConfigurationName: String + + val gradleVariantNames: Set +} + +interface KotlinGradleVariantWithRuntime : KotlinGradleVariant { + // TODO deduplicate with KotlinCompilation? + val runtimeDependencyConfigurationName: String + + var runtimeDependencyFiles: FileCollection + + val runtimeFiles: ConfigurableFileCollection + + // TODO generalize exposing outputs: what if a variant has more than one such configurations or none? + val runtimeElementsConfigurationName: String +} + +interface KotlinNativeVariant : KotlinGradleVariant { + override val platformType: KotlinPlatformType + get() = KotlinPlatformType.native + + var enableEndorsedLibraries: Boolean +} + +interface SingleMavenPublicationHolder { + fun assignMavenPublication(publication: MavenPublication) + val defaultPublishedModuleSuffix: String? + val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider +} + +interface PublishedModuleCoordinatesProvider { + val group: String + val name: String + val version: String + val capabilities: Iterable +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt index 6d6735e9f29..852a1da7784 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt @@ -17,9 +17,7 @@ import org.gradle.api.attributes.AttributeContainer import org.jetbrains.kotlin.gradle.dsl.* import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations @@ -32,50 +30,52 @@ class ProjectStructureMetadataModuleBuilder { component: ResolvedComponentResult, metadata: KotlinProjectStructureMetadata ): KotlinModule { - return ExternalImportedKotlinModule( - BasicKotlinModule(component.toModuleIdentifier()).apply { - metadata.sourceSetNamesByVariantName.keys.forEach { variantName -> - fragments.add(BasicKotlinModuleVariant(this@apply, variantName)) + val moduleData = BasicKotlinModule(component.toSingleModuleIdentifier()).apply { + metadata.sourceSetNamesByVariantName.keys.forEach { variantName -> + fragments.add(BasicKotlinModuleVariant(this@apply, variantName)) + } + fun fragment(sourceSetName: String): BasicKotlinModuleFragment { + if (fragments.none { it.fragmentName == sourceSetName }) + fragments.add(BasicKotlinModuleFragment(this@apply, sourceSetName)) + return fragmentByName(sourceSetName) + } + metadata.sourceSetNamesByVariantName.forEach { (variantName, sourceSets) -> + val variant = fragmentByName(variantName) + sourceSets.forEach { sourceSetName -> + variant.directRefinesDependencies.add(fragment(sourceSetName)) } - fun fragment(sourceSetName: String): BasicKotlinModuleFragment { - if (fragments.none { it.fragmentName == sourceSetName }) - fragments.add(BasicKotlinModuleFragment(this@apply, sourceSetName)) - return fragmentByName(sourceSetName) - } - metadata.sourceSetNamesByVariantName.forEach { (variantName, sourceSets) -> - val variant = fragmentByName(variantName) - sourceSets.forEach { sourceSetName -> - variant.directRefinesDependencies.add(fragment(sourceSetName)) - } - } - metadata.sourceSetModuleDependencies.forEach { (sourceSetName, dependencies) -> - val fragment = fragment(sourceSetName) - dependencies.forEach { dependency -> - fragment.declaredModuleDependencies.add( - KotlinModuleDependency( - MavenModuleIdentifier( - dependency.groupId.orEmpty(), - dependency.moduleId, - null /* TODO */ - ) + } + metadata.sourceSetModuleDependencies.forEach { (sourceSetName, dependencies) -> + val fragment = fragment(sourceSetName) + dependencies.forEach { dependency -> + fragment.declaredModuleDependencies.add( + KotlinModuleDependency( + MavenModuleIdentifier( + dependency.groupId.orEmpty(), + dependency.moduleId, + null /* TODO */ ) ) - } + ) } + } - metadata.sourceSetsDependsOnRelation.forEach { (depending, dependencies) -> - val dependingFragment = fragment(depending) - dependencies.forEach { dependency -> - dependingFragment.directRefinesDependencies.add(fragment(dependency)) - } + metadata.sourceSetsDependsOnRelation.forEach { (depending, dependencies) -> + val dependingFragment = fragment(depending) + dependencies.forEach { dependency -> + dependingFragment.directRefinesDependencies.add(fragment(dependency)) } - }, - metadata + } + } + return ExternalImportedKotlinModule( + moduleData, + metadata, + moduleData.fragments.filterTo(mutableSetOf()) { it.fragmentName in metadata.hostSpecificSourceSets } ) } fun getModule(component: ResolvedComponentResult, projectStructureMetadata: KotlinProjectStructureMetadata): KotlinModule { - val moduleId = component.toModuleIdentifier() + val moduleId = component.toSingleModuleIdentifier() return modulesCache.getOrPut(moduleId) { buildModuleFromProjectStructureMetadata( component, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt index 6e7ac210e9d..57dd0b194c7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/ModuleIds.kt @@ -109,13 +109,6 @@ internal object ModuleIds { } } -interface PublishedModuleCoordinatesProvider { - val group: String - val name: String - val version: String - val capabilities: Iterable -} - open class MavenPublicationCoordinatesProvider( project: Project, val getPublication: () -> MavenPublication?, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt index ada9cef3c06..9af21f02813 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt @@ -9,38 +9,40 @@ import org.gradle.api.Project import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder +import org.jetbrains.kotlin.gradle.dsl.pm20Extension +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.isMain +import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName +import org.jetbrains.kotlin.project.model.refinesClosure -interface KotlinCompilationData { - val project: Project - val owner: Any? +interface KotlinVariantCompilationDataInternal : KotlinVariantCompilationData { + override val compileKotlinTaskName: String + get() = lowerCamelCaseName("compile", compilationPurpose.takeIf { it != "main" }, "Kotlin", compilationClassifier) - val compilationPurpose: String - val compilationClassifier: String? + override val compileAllTaskName: String + get() = owner.disambiguateName("classes") - val kotlinSourceDirectoriesByFragmentName: Map - val compileKotlinTaskName: String - val compileAllTaskName: String + override val kotlinSourceDirectoriesByFragmentName: Map + get() = owner.refinesClosure.filterIsInstance().associate { it.disambiguateName("") to it.kotlinSourceRoots } - val compileDependencyFiles: FileCollection - val output: KotlinCompilationOutput + override val friendPaths: Iterable + // TODO for now, all output classes of the module are considered friends, even those not on the classpath + get() { + // FIXME support compiling against the artifact task outputs + // TODO note for Android: see the friend artifacts code in KotlinAndroidCompilation + return owner.containingModule.project.pm20Extension.modules.flatMap { it.variants.map { it.compilationOutputs.classesDirs } } + } - val languageSettings: LanguageSettingsBuilder - val platformType: KotlinPlatformType + override val moduleName: String + get() = // TODO accurate module names that don't rely on all variants having a main counterpart + owner.containingModule.project.pm20Extension.modules + .getByName(KotlinGradleModule.MAIN_MODULE_NAME).variants.findByName(owner.name)?.ownModuleName() ?: ownModuleName - val moduleName: String - val ownModuleName: String - - val kotlinOptions: T - - val friendPaths: Iterable + override val ownModuleName: String + get() = owner.ownModuleName() } -fun KotlinCompilationData<*>.isMain(): Boolean = when (this) { +fun KotlinCompilationData<*>.isMainCompilationData(): Boolean = when (this) { is KotlinCompilation<*> -> isMain() else -> compilationPurpose == KotlinGradleModule.MAIN_MODULE_NAME } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt index 21c15ca4709..d56596b8c31 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -6,15 +6,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 import groovy.lang.Closure -import org.gradle.api.Named import org.gradle.api.NamedDomainObjectProvider -import org.gradle.api.Project import org.gradle.api.file.SourceDirectorySet import org.gradle.api.provider.Provider import org.gradle.util.ConfigureUtil -import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies -import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler -import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.mpp.toModuleDependency import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder @@ -25,27 +21,24 @@ import org.jetbrains.kotlin.project.model.KotlinModuleFragment import org.jetbrains.kotlin.project.model.refinesClosure import javax.inject.Inject -open class KotlinGradleFragment @Inject constructor( +open class KotlinGradleFragmentInternal @Inject constructor( override val containingModule: KotlinGradleModule, override val fragmentName: String -) : KotlinModuleFragment, HasKotlinDependencies, Named { +) : KotlinGradleFragment { override fun getName(): String = fragmentName // TODO pull up to KotlinModuleFragment // FIXME apply to compilation // FIXME check for consistency - val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder() + override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder() - protected val project: Project - get() = containingModule.project - - open fun refines(other: KotlinGradleFragment) { + override fun refines(other: KotlinGradleFragment) { checkCanRefine(other) refines(containingModule.fragments.named(other.name)) } - open fun refines(other: NamedDomainObjectProvider) { + override fun refines(other: NamedDomainObjectProvider) { _directRefinesDependencies.add(other) other.configure { checkCanRefine(it) } listOf( @@ -92,23 +85,12 @@ open class KotlinGradleFragment @Inject constructor( ) } - /** This configuration includes the dependencies from the refines-parents */ - internal val transitiveApiConfigurationName: String + override val transitiveApiConfigurationName: String get() = disambiguateName("transitiveApi") - /** This configuration includes the dependencies from the refines-parents */ - internal val transitiveImplementationConfigurationName: String + override val transitiveImplementationConfigurationName: String get() = disambiguateName("transitiveImplementation") - override val relatedConfigurationNames: List - get() = super.relatedConfigurationNames + - // TODO: resolvable metadata configurations? - listOf(transitiveApiConfigurationName, transitiveImplementationConfigurationName) - - companion object { - const val COMMON_FRAGMENT_NAME = "common" - } - override fun toString(): String = "fragment $fragmentName in $containingModule" } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt index e65266e1064..90020f10267 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModule.kt @@ -5,25 +5,25 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 -import groovy.lang.Closure import org.gradle.api.ExtensiblePolymorphicDomainObjectContainer -import org.gradle.api.Named import org.gradle.api.NamedDomainObjectSet import org.gradle.api.Project -import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies -import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.project.model.* +import org.jetbrains.kotlin.project.model.KotlinModuleFragment +import org.jetbrains.kotlin.project.model.KotlinModuleIdentifier +import org.jetbrains.kotlin.project.model.LocalModuleIdentifier import javax.inject.Inject -open class KotlinGradleModule( - internal val project: Project, - val moduleClassifier: String? -) : KotlinModule, Named, HasKotlinDependencies { +open class KotlinGradleModuleInternal( + final override val project: Project, + final override val moduleClassifier: String? +) : KotlinGradleModule { @Inject - constructor(project: Project, moduleClassifier: CharSequence) - : this(project, moduleClassifier.toString().takeIf { it != MAIN_MODULE_NAME }) + constructor(project: Project, moduleName: CharSequence) : this( + project, + moduleName.takeIf { it != KotlinGradleModule.MAIN_MODULE_NAME }?.toString() + ) override val moduleIdentifier: KotlinModuleIdentifier = LocalModuleIdentifier(project.currentBuildId().name, project.path, moduleClassifier) @@ -36,17 +36,17 @@ open class KotlinGradleModule( fragments.withType(KotlinGradleVariant::class.java) } - var isPublic: Boolean = false - private set + override var isPublic: Boolean = false + protected set private var setPublicHandlers: MutableList<() -> Unit> = mutableListOf() - fun ifMadePublic(action: () -> Unit) { + override fun ifMadePublic(action: () -> Unit) { // FIXME reentrancy? if (isPublic) action() else setPublicHandlers.add(action) } - fun makePublic() { + override fun makePublic() { if (isPublic) return setPublicHandlers.forEach { it() } isPublic = true @@ -57,37 +57,6 @@ open class KotlinGradleModule( const val TEST_MODULE_NAME = "test" } - override fun getName(): String = when (moduleClassifier) { - null -> MAIN_MODULE_NAME - else -> moduleClassifier - } - - // DSL - - val common: KotlinGradleFragment - get() = fragments.getByName(KotlinGradleFragment.COMMON_FRAGMENT_NAME) - - fun common(configure: KotlinGradleFragment.() -> Unit) = - common.configure() - - override fun dependencies(configure: KotlinDependencyHandler.() -> Unit) = - common.dependencies(configure) - - override fun dependencies(configureClosure: Closure) = - common.dependencies(configureClosure) - - override val apiConfigurationName: String - get() = common.apiConfigurationName - - override val implementationConfigurationName: String - get() = common.implementationConfigurationName - - override val compileOnlyConfigurationName: String - get() = common.compileOnlyConfigurationName - - override val runtimeOnlyConfigurationName: String - get() = common.runtimeOnlyConfigurationName - override fun toString(): String = "$moduleIdentifier (Gradle)" } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModuleFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModuleFactory.kt index 44ea820ae6f..21e377bb08f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModuleFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleModuleFactory.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.dsl.pm20Extension open class KotlinGradleModuleFactory(private val project: Project) : NamedDomainObjectFactory { override fun create(name: String): KotlinGradleModule { - val result = project.objects.newInstance(KotlinGradleModule::class.java, project, name) + val result = project.objects.newInstance(KotlinGradleModuleInternal::class.java, project, name) registerFragmentFactory(result) registerDefaultCommonFragment(result) addDefaultDependencyOnMainModule(result) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt index 1428546c286..c87b3989d7e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinJvmVariant.kt @@ -26,9 +26,7 @@ open class KotlinJvmVariant(containingModule: KotlinGradleModule, fragmentName: get() = KotlinPlatformType.jvm } -class KotlinJvmVariantCompilationData(val variant: KotlinJvmVariant) : KotlinCompilationData { - override val project: Project get() = variant.containingModule.project - +class KotlinJvmVariantCompilationData(val variant: KotlinJvmVariant) : KotlinVariantCompilationDataInternal { override val owner: KotlinJvmVariant get() = variant override val compilationPurpose: String diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt new file mode 100644 index 00000000000..89d50417a26 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinNativeVariantFactory.kt @@ -0,0 +1,173 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 + +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.Dependency +import org.gradle.api.artifacts.ModuleDependency +import org.gradle.api.attributes.Usage +import org.gradle.api.component.AdhocComponentWithVariants +import org.gradle.api.component.SoftwareComponentFactory +import org.gradle.api.internal.project.ProjectInternal +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.publish.maven.internal.publication.DefaultMavenPublication +import org.gradle.jvm.tasks.Jar +import org.jetbrains.kotlin.gradle.dsl.pm20Extension +import org.jetbrains.kotlin.gradle.plugin.KotlinNativeTargetConfigurator +import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages +import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.CalculatedCapability +import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName +import org.jetbrains.kotlin.gradle.plugin.usageByName +import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives +import org.jetbrains.kotlin.gradle.tasks.registerTask +import org.jetbrains.kotlin.gradle.utils.dashSeparatedName +import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION +import org.jetbrains.kotlin.project.model.refinesClosure +import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment +import kotlin.reflect.KClass + +open class KotlinNativeVariantFactory( + module: KotlinGradleModule, + val variantClass: KClass +) : + AbstractKotlinGradleVariantFactory(module) { + + override fun instantiateFragment(name: String): T = + module.project.objects.newInstance(variantClass.java, module, name) + + override fun setPlatformAttributesInConfiguration(fragment: T, configuration: Configuration) { + super.setPlatformAttributesInConfiguration(fragment, configuration) + configuration.attributes.attribute(KotlinNativeTarget.konanTargetAttribute, fragment.konanTarget.name) + } + + override fun create(name: String): T = + super.create(name).also { result -> + configureVariantPublishing(result) + } + + override fun configureKotlinCompilation(fragment: T) { + val compilationData = fragment.compilationData + + //FIXME: deduplicate with KotlinJvmVariantFactory + val classesTaskName = compilationData.compileAllTaskName + project.tasks.register(classesTaskName) { classesTask -> + classesTask.dependsOn(fragment.compilationOutputs.allOutputs) + } + + //FIXME: needs refactoring so as not to create the configurator + val compileTask = with(KotlinNativeTargetConfigurator(project.getKotlinPluginVersion()!!)) { + project.createKlibCompilationTask(compilationData) + } + + // FIXME: duplication with KotlinJvmVariantFactory + val allSources = { project.files(Callable { fragment.refinesClosure.map { it.kotlinSourceRoots } }) } + val commonSources = { + project.files(Callable { + fragment.refinesClosure.filter { module.variantsContainingFragment(it).count() > 1 }.map { it.kotlinSourceRoots } + }) + } + + compileTask.configure { + it.source(allSources) + it.commonSources.from(commonSources) + } + } + + open fun configureVariantPublishing(variant: T) { + val rootSoftwareComponent = + project.components + .withType(AdhocComponentWithVariants::class.java) + .getByName(rootPublicationComponentName(module)) + + val platformModuleDependencyProvider = project.provider { + val coordinates = variant.publishedMavenModuleCoordinates + (project.dependencies.create("${coordinates.group}:${coordinates.name}:${coordinates.version}") as ModuleDependency).apply { + if (module.moduleClassifier != null) { + capabilities { it.requireCapability(CalculatedCapability.fromModule(module)) } + } + } + } + + val apiElements = project.configurations.getByName(variant.apiElementsConfigurationName) + val hostSpecificMetadataJar = project.registerTask(variant.disambiguateName("hostSpecificMetadataJar")) { jar -> + jar.archiveClassifier.set("metadata") + jar.archiveAppendix.set(variant.disambiguateName("")) + project.pm20Extension.metadataCompilationRegistryByModuleId.getValue(variant.containingModule.moduleIdentifier) + .withAll { metadataCompilation -> + val fragment = metadataCompilation.fragment + if (metadataCompilation is KotlinNativeFragmentMetadataCompilationData) { + jar.from(project.files(Callable { + if (fragment in variant.refinesClosure && fragment.isNativeHostSpecific()) + project.filesWithUnpackedArchives(metadataCompilation.output.allOutputs, setOf(KLIB_FILE_EXTENSION)) + else emptyList() + })) { spec -> spec.into(fragment.name) } + } + } + } + val hostSpecificMetadataElements = project.configurations.create(variant.hostSpecificMetadataConfigurationName).apply { + isCanBeResolved = false + isCanBeConsumed = false + setPlatformAttributesAndMetadataUsage(variant) + project.artifacts.add(name, hostSpecificMetadataJar) + dependencies.addAllLater(project.objects.listProperty(Dependency::class.java).apply { + set(project.provider { apiElements.allDependencies }) + }) + } + + // FIXME inject vs internal API + val platformComponentName = platformComponentName(variant) + val platformComponent = (project as ProjectInternal).services + .get(SoftwareComponentFactory::class.java) + .adhoc(platformComponentName) + project.components.add(platformComponent) + platformComponent.addVariantsFromConfiguration(apiElements) { + it.mapToMavenScope("compile") + } + platformComponent.addVariantsFromConfiguration(hostSpecificMetadataElements) { } + + module.ifMadePublic { + project.pluginManager.withPlugin("maven-publish") { + project.extensions.getByType(PublishingExtension::class.java).apply { + publications.create(platformComponentName, MavenPublication::class.java).apply { + (this as DefaultMavenPublication).isAlias = true + from(platformComponent) + variant.assignMavenPublication(this) + artifactId = dashSeparatedName(project.name, variant.defaultPublishedModuleSuffix) + } + } + } + } + + val publishedApiConfiguration = + project.configurations.create(publishedConfigurationName(variant.apiElementsConfigurationName)).apply { + isCanBeConsumed = false + isCanBeResolved = false + configureApiElementsConfiguration(variant, this) + setModuleCapability(this, module) + dependencies.addLater(platformModuleDependencyProvider) + } + val publishedMetadataConfiguration = + project.configurations.create(publishedConfigurationName(variant.hostSpecificMetadataConfigurationName)).apply { + isCanBeConsumed = false + isCanBeResolved = false + setPlatformAttributesAndMetadataUsage(variant) + setModuleCapability(this, module) + dependencies.addLater(platformModuleDependencyProvider) + } + rootSoftwareComponent.addVariantsFromConfiguration(publishedApiConfiguration) { } + rootSoftwareComponent.addVariantsFromConfiguration(publishedMetadataConfiguration) { } + } + + private fun Configuration.setPlatformAttributesAndMetadataUsage(variant: T) { + configureApiElementsConfiguration(variant, this) // then override the Usage attribute + attributes.attribute(Usage.USAGE_ATTRIBUTE, project.usageByName(KotlinUsages.KOTLIN_METADATA)) + } + + open fun platformComponentName(variant: T) = variant.disambiguateName("") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt index 9139725a09f..ee480149b83 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/abstractVariants.kt @@ -5,66 +5,58 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 +import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.FileCollection import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.bundling.AbstractArchiveTask -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinCompilationOutput import org.jetbrains.kotlin.gradle.plugin.mpp.MavenPublicationCoordinatesProvider -import org.jetbrains.kotlin.gradle.plugin.mpp.PublishedModuleCoordinatesProvider import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.CalculatedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.gradle.tasks.withType import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.project.model.KotlinAttributeKey -import org.jetbrains.kotlin.project.model.KotlinModuleVariant import org.jetbrains.kotlin.project.model.KotlinPlatformTypeAttribute -abstract class KotlinGradleVariant( +abstract class KotlinGradleVariantInternal( containingModule: KotlinGradleModule, override val fragmentName: String -) : KotlinGradleFragment(containingModule, fragmentName), KotlinModuleVariant { +) : KotlinGradleFragmentInternal(containingModule, fragmentName), KotlinGradleVariant { - abstract val platformType: KotlinPlatformType + final override val project: Project // overriding with final to avoid warnings + get() = super.project override val variantAttributes: Map get() = mapOf(KotlinPlatformTypeAttribute to kotlinPlatformTypeAttributeFromPlatform(platformType)) // TODO user attributes // TODO generalize with KotlinCompilation? - val compileDependencyConfigurationName: String + override val compileDependencyConfigurationName: String get() = disambiguateName("CompileDependencies") - open lateinit var compileDependencyFiles: FileCollection + override lateinit var compileDependencyFiles: FileCollection // TODO rewrite using our own artifacts API? - val compilationOutputs: KotlinCompilationOutput = + override val compilationOutputs: KotlinCompilationOutput = DefaultKotlinCompilationOutput( project, project.provider { project.buildDir.resolve("processedResources/${containingModule.name}/${fragmentName}") } ) // TODO rewrite using our own artifacts API - open val sourceArchiveTask: TaskProvider + override val sourceArchiveTask: TaskProvider get() = project.tasks.withType().named(defaultSourceArtifactTaskName) // TODO generalize exposing outputs: what if a variant has more than one such configurations or none? - val apiElementsConfigurationName: String + override val apiElementsConfigurationName: String get() = disambiguateName("apiElements") - abstract val gradleVariantNames: Set - override fun toString(): String = "variant $fragmentName in $containingModule" } -interface SingleMavenPublicationHolder { - fun assignMavenPublication(publication: MavenPublication) - val defaultPublishedModuleSuffix: String? - val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider -} - class DefaultSingleMavenPublicationHolder( private var module: KotlinGradleModule, override val defaultPublishedModuleSuffix: String? @@ -94,22 +86,23 @@ private fun kotlinPlatformTypeAttributeFromPlatform(platformType: KotlinPlatform internal val KotlinGradleVariant.defaultSourceArtifactTaskName: String get() = disambiguateName("sourcesJar") -abstract class KotlinGradleVariantWithRuntime( +abstract class KotlinGradleVariantWithRuntimeInternal( containingModule: KotlinGradleModule, fragmentName: String -) : KotlinGradleVariant(containingModule, fragmentName) { +) : KotlinGradleVariantInternal(containingModule, fragmentName), KotlinGradleVariantWithRuntime { // TODO deduplicate with KotlinCompilation? - val runtimeDependencyConfigurationName: String + override val runtimeDependencyConfigurationName: String get() = disambiguateName("RuntimeDependencies") - open lateinit var runtimeDependencyFiles: FileCollection + override lateinit var runtimeDependencyFiles: FileCollection - open val runtimeFiles: ConfigurableFileCollection by lazy { - project.files(compilationOutputs.allOutputs, runtimeDependencyFiles) - } + override val runtimeFiles: ConfigurableFileCollection = project.files( + { compilationOutputs.allOutputs }, + { runtimeDependencyFiles } + ) // TODO generalize exposing outputs: what if a variant has more than one such configurations or none? - val runtimeElementsConfigurationName: String + override val runtimeElementsConfigurationName: String get() = disambiguateName("runtimeElements") } @@ -117,7 +110,7 @@ private fun defaultModuleSuffix(module: KotlinGradleModule, variantName: String) dashSeparatedName(variantName, module.moduleClassifier) abstract class KotlinGradlePublishedVariantWithRuntime(containingModule: KotlinGradleModule, fragmentName: String) : - KotlinGradleVariantWithRuntime(containingModule, fragmentName), + KotlinGradleVariantWithRuntimeInternal(containingModule, fragmentName), SingleMavenPublicationHolder by DefaultSingleMavenPublicationHolder( containingModule, defaultModuleSuffix(containingModule, fragmentName) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentFactories.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentFactories.kt index dca3958639a..886a47f29da 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentFactories.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentFactories.kt @@ -60,7 +60,7 @@ abstract class AbstractKotlinGradleFragmentFactory( } } -class CommonGradleFragmentFactory(module: KotlinGradleModule) : AbstractKotlinGradleFragmentFactory(module) { - override fun instantiateFragment(name: String): KotlinGradleFragment = - project.objects.newInstance(KotlinGradleFragment::class.java, module, name) +class CommonGradleFragmentFactory(module: KotlinGradleModule) : AbstractKotlinGradleFragmentFactory(module) { + override fun instantiateFragment(name: String): KotlinGradleFragmentInternal = + project.objects.newInstance(KotlinGradleFragmentInternal::class.java, module, name) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt index b9db8bc69ac..a90d6d3f7fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/fragmentsMetadataCompilation.kt @@ -12,12 +12,12 @@ import org.gradle.api.tasks.TaskProvider import org.gradle.jvm.tasks.Jar import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptions import org.jetbrains.kotlin.gradle.dsl.pm20Extension +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinCommonSourceSetProcessor -import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.mpp.* -import org.jetbrains.kotlin.gradle.plugin.usageByName +import org.jetbrains.kotlin.gradle.targets.metadata.NativeSharedCompilationProcessor import org.jetbrains.kotlin.gradle.targets.metadata.createGenerateProjectStructureMetadataTask +import org.jetbrains.kotlin.gradle.targets.metadata.filesWithUnpackedArchives import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.withType @@ -124,10 +124,14 @@ private fun configureMetadataJarTask( task.archiveAppendix.set("metadata") task.from() } - registry.withAll { compilationData -> + module.fragments.all { fragment -> allMetadataJar.configure { jar -> - jar.from(compilationData.output.allOutputs) { spec -> - spec.into(compilationData.fragment.fragmentName) + val metadataOutput = project.files(Callable { + val compilationData = registry.byFragment(fragment) + project.filesWithUnpackedArchives(compilationData.output.allOutputs, setOf(KLIB_FILE_EXTENSION)) + }) + jar.from(metadataOutput) { spec -> + spec.into(fragment.fragmentName) } } }