KPM/Gradle: disable metadata compilations for JVM & JS shared fragments

This commit is contained in:
Sergey Igushkin
2021-12-20 22:13:44 +04:00
committed by Space
parent dbb34a44f0
commit c3fe4e7fb2
5 changed files with 29 additions and 10 deletions
@@ -35,7 +35,8 @@ private class ProjectMetadataProviderImpl(
val moduleId = moduleIdentifier
val module = dependencyProject.kpmModules.single { it.moduleIdentifier == moduleId }
val metadataCompilationRegistry = dependencyProject.metadataCompilationRegistryByModuleId.getValue(moduleId)
metadataCompilationRegistry.byFragment(module.fragments.getByName(sourceSetName)).output.classesDirs
metadataCompilationRegistry.getForFragmentOrNull(module.fragments.getByName(sourceSetName))?.output?.classesDirs
?: dependencyProject.files()
}
projectExtension is KotlinMultiplatformExtension ->
projectExtension.targets.getByName(KotlinMultiplatformPlugin.METADATA_TARGET_NAME).compilations
@@ -29,6 +29,7 @@ import org.gradle.util.WrapUtil
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetContainerDsl
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatCompilationResolverPlugin
@@ -92,7 +93,9 @@ abstract class AbstractKotlinTarget(
}
override val components: Set<SoftwareComponent> by lazy {
buildAdhocComponentsFromKotlinVariants(kotlinComponents)
if (!project.hasKpmModel) {
buildAdhocComponentsFromKotlinVariants(kotlinComponents)
} else emptySet()
}
private fun buildAdhocComponentsFromKotlinVariants(kotlinVariants: Set<KotlinTargetComponent>): Set<SoftwareComponent> {
@@ -60,7 +60,13 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
createMetadataDependencyTransformationClasspath(
project,
resolvableMetadataConfiguration(fragment.containingModule),
lazy { fragment.refinesClosure.minus(fragment).map { metadataCompilationRegistry.byFragment(it).output.classesDirs } },
lazy {
fragment.refinesClosure.minus(fragment).map {
val compilation = metadataCompilationRegistry.getForFragmentOrNull(it)
?: return@map project.files()
compilation.output.classesDirs
}
},
resolvedMetadataFiles
)
}
@@ -90,7 +96,9 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
get() = metadataCompilationRegistry.run {
fragment.refinesClosure.minus(fragment)
.map {
metadataCompilationRegistry.byFragment(it).output.classesDirs
val compilation = metadataCompilationRegistry.getForFragmentOrNull(it)
?: return@map project.files()
compilation.output.classesDirs
}
}
}
@@ -111,7 +119,11 @@ internal open class KotlinCommonFragmentMetadataCompilationDataImpl(
resolvedMetadataFiles), KotlinCommonFragmentMetadataCompilationData {
override val isActive: Boolean
get() = !fragment.isNativeShared()
get() = !fragment.isNativeShared() &&
fragment.containingModule.variantsContainingFragment(fragment).run {
!all { it.platformType in setOf(KotlinPlatformType.androidJvm, KotlinPlatformType.jvm)} &&
!all { it.platformType == KotlinPlatformType.js }
}
override val kotlinOptions: KotlinMultiplatformCommonOptions = KotlinMultiplatformCommonOptionsImpl()
}
@@ -121,7 +133,9 @@ interface KotlinNativeFragmentMetadataCompilationData :
KotlinNativeCompilationData<KotlinCommonOptions>
internal fun KotlinGradleFragment.isNativeShared(): Boolean =
containingModule.variantsContainingFragment(this).all { it.platformType == KotlinPlatformType.native }
containingModule.variantsContainingFragment(this).run {
any() && all { it.platformType == KotlinPlatformType.native }
}
internal fun KotlinGradleFragment.isNativeHostSpecific(): Boolean =
this in getHostSpecificFragments(containingModule)
@@ -186,8 +200,8 @@ internal class MetadataCompilationRegistry {
withAllNativeCallbacks.forEach { it.invoke(compilationData) }
}
fun byFragment(fragment: KotlinGradleFragment): KotlinMetadataCompilationData<*> =
listOf(commonCompilationDataPerFragment.getValue(fragment), nativeCompilationDataPerFragment.getValue(fragment)).single {
fun getForFragmentOrNull(fragment: KotlinGradleFragment): KotlinMetadataCompilationData<*>? =
listOf(commonCompilationDataPerFragment.getValue(fragment), nativeCompilationDataPerFragment.getValue(fragment)).singleOrNull {
it.isActive
}
@@ -44,7 +44,6 @@ class FragmentMappedKotlinSourceSet(
override val languageSettings: LanguageSettingsBuilder = underlyingFragment.languageSettings
// FIXME: not supported yet
override val resources: SourceDirectorySet = createDefaultSourceDirectorySet(project, "$name resources")
override fun kotlin(configureClosure: Closure<Any?>): SourceDirectorySet =
@@ -73,7 +73,9 @@ abstract class KotlinCompileCommon @Inject constructor(
val fragment = compilation.fragment
project.files(
fragment.refinesClosure.minus(fragment).map {
compilation.metadataCompilationRegistry.byFragment(it).output.classesDirs
val compilation = compilation.metadataCompilationRegistry.getForFragmentOrNull(it)
?: return@map project.files()
compilation.output.classesDirs
}
)
}