[Gradle][Native] Setup refinesPaths as expectedBy module dependencies
Previously, dependsOn dependencies were just passed as friend modules to shared native compilations. ^KT-55071 Verification Pending
This commit is contained in:
committed by
Space Team
parent
0be789e9e3
commit
752ff04245
+23
-1
@@ -11,10 +11,13 @@ import org.gradle.api.Project
|
||||
import org.gradle.api.file.ConfigurableFileCollection
|
||||
import org.gradle.api.file.FileCollection
|
||||
import org.gradle.api.file.SourceDirectorySet
|
||||
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmAbstractFragmentMetadataCompilationData
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmCompilationData
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.dependsOnClosure
|
||||
import org.jetbrains.kotlin.gradle.utils.filesProvider
|
||||
import org.jetbrains.kotlin.project.model.LanguageSettings
|
||||
|
||||
@@ -30,6 +33,7 @@ internal sealed class KotlinCompilationInfo {
|
||||
abstract val compileAllTaskName: String
|
||||
abstract val languageSettings: LanguageSettings
|
||||
abstract val friendPaths: FileCollection
|
||||
abstract val refinesPaths: FileCollection
|
||||
abstract val isMain: Boolean
|
||||
abstract val classesDirs: ConfigurableFileCollection
|
||||
abstract val compileDependencyFiles: FileCollection
|
||||
@@ -70,6 +74,13 @@ internal sealed class KotlinCompilationInfo {
|
||||
override val friendPaths: FileCollection
|
||||
get() = project.filesProvider { origin.internal.friendPaths }
|
||||
|
||||
override val refinesPaths: FileCollection
|
||||
get() = project.filesProvider files@{
|
||||
val metadataTarget = project.multiplatformExtensionOrNull?.metadata() ?: return@files emptyList<Any>()
|
||||
origin.kotlinSourceSets.dependsOnClosure
|
||||
.mapNotNull { sourceSet -> metadataTarget.compilations.findByName(sourceSet.name)?.output?.classesDirs }
|
||||
}
|
||||
|
||||
override val isMain: Boolean
|
||||
get() = origin.isMain()
|
||||
|
||||
@@ -117,6 +128,17 @@ internal sealed class KotlinCompilationInfo {
|
||||
override val friendPaths: FileCollection
|
||||
get() = project.filesProvider { origin.friendPaths }
|
||||
|
||||
override val refinesPaths: FileCollection
|
||||
get() = project.filesProvider files@{
|
||||
val compilationData = origin as? GradleKpmAbstractFragmentMetadataCompilationData<*> ?: return@files emptyList<Any>()
|
||||
val fragment = compilationData.fragment
|
||||
|
||||
fragment.refinesClosure.minus(fragment).map {
|
||||
val compilation = compilationData.metadataCompilationRegistry.getForFragmentOrNull(it) ?: return@map project.files()
|
||||
compilation.output.classesDirs
|
||||
}
|
||||
}
|
||||
|
||||
override val isMain: Boolean
|
||||
get() = origin.compilationPurpose == GradleKpmModule.MAIN_MODULE_NAME
|
||||
|
||||
@@ -146,4 +168,4 @@ internal val KotlinCompilationInfo.kpmOrNull: KotlinCompilationInfo.KPM?
|
||||
get() = when (this) {
|
||||
is KotlinCompilationInfo.KPM -> this
|
||||
is KotlinCompilationInfo.TCS -> null
|
||||
}
|
||||
}
|
||||
|
||||
-15
@@ -10,8 +10,6 @@ import org.gradle.api.tasks.TaskProvider
|
||||
import org.gradle.api.tasks.bundling.AbstractArchiveTask
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.*
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
||||
import org.jetbrains.kotlin.gradle.targets.metadata.getMetadataCompilationForSourceSet
|
||||
import org.jetbrains.kotlin.gradle.utils.filesProvider
|
||||
|
||||
internal interface KotlinCompilationFriendPathsResolver {
|
||||
@@ -75,19 +73,6 @@ internal class DefaultKotlinCompilationFriendPathsResolver(
|
||||
}
|
||||
}
|
||||
|
||||
object AdditionalSharedNativeMetadataFriendArtifactResolver : FriendArtifactResolver {
|
||||
override fun resolveFriendArtifacts(compilation: InternalKotlinCompilation<*>): FileCollection {
|
||||
// TODO: implement proper dependsOn/refines compiler args for Kotlin/Native and pass the dependsOn klibs separately;
|
||||
// But for now, those dependencies don't have any special semantics, so passing all them as friends works, too
|
||||
val friendSourceSets = getVisibleSourceSetsFromAssociateCompilations(compilation.defaultSourceSet) +
|
||||
compilation.defaultSourceSet.internal.dependsOnClosure
|
||||
|
||||
return compilation.project.files(
|
||||
friendSourceSets.mapNotNull { compilation.project.getMetadataCompilationForSourceSet(it)?.output?.classesDirs }
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
object AdditionalAndroidFriendArtifactResolver : FriendArtifactResolver {
|
||||
override fun resolveFriendArtifacts(compilation: InternalKotlinCompilation<*>): FileCollection {
|
||||
return compilation.project.files((compilation.decoratedInstance as KotlinJvmAndroidCompilation).testedVariantArtifacts)
|
||||
|
||||
-2
@@ -213,8 +213,6 @@ val KotlinSourceSet.dependsOnClosure: Set<KotlinSourceSet> get() = this.internal
|
||||
@Deprecated("Use InternalKotlinSourceSet.withDependsOnClosure instead. Will be removed in Kotlin 1.9")
|
||||
val KotlinSourceSet.withDependsOnClosure: Set<KotlinSourceSet> get() = this.internal.withDependsOnClosure
|
||||
|
||||
@Suppress("Unused") // Still part of public API
|
||||
@Deprecated("Use InternalKotlinSourceSet.withDependsOnClosure instead. Will be removed in Kotlin 1.9")
|
||||
val Iterable<KotlinSourceSet>.dependsOnClosure: Set<KotlinSourceSet>
|
||||
get() = flatMap { it.internal.dependsOnClosure }.toSet() - this.toSet()
|
||||
|
||||
|
||||
+1
-1
@@ -43,7 +43,7 @@ open class KotlinSharedNativeCompilationFactory internal constructor(
|
||||
compilationFriendPathsResolver = DefaultKotlinCompilationFriendPathsResolver(
|
||||
friendArtifactResolver = DefaultKotlinCompilationFriendPathsResolver.FriendArtifactResolver.composite(
|
||||
DefaultKotlinCompilationFriendPathsResolver.DefaultFriendArtifactResolver,
|
||||
DefaultKotlinCompilationFriendPathsResolver.AdditionalSharedNativeMetadataFriendArtifactResolver
|
||||
DefaultKotlinCompilationFriendPathsResolver.AdditionalMetadataFriendArtifactResolver
|
||||
)
|
||||
),
|
||||
|
||||
|
||||
+10
-2
@@ -23,7 +23,8 @@ internal class CompilerPluginData(
|
||||
|
||||
internal class SharedCompilationData(
|
||||
val manifestFile: File,
|
||||
val isAllowCommonizer: Boolean
|
||||
val isAllowCommonizer: Boolean,
|
||||
val refinesPaths: FileCollection
|
||||
)
|
||||
|
||||
internal fun buildKotlinNativeKlibCompilerArgs(
|
||||
@@ -63,6 +64,13 @@ internal fun buildKotlinNativeKlibCompilerArgs(
|
||||
addArg("-friend-modules", friends.joinToString(File.pathSeparator) { it.absolutePath })
|
||||
}
|
||||
|
||||
if (sharedCompilationData != null) {
|
||||
val refinesPaths = sharedCompilationData.refinesPaths.files
|
||||
if (refinesPaths.isNotEmpty()) {
|
||||
addArg("-Xrefines-paths", refinesPaths.joinToString(File.pathSeparator) { it.absolutePath })
|
||||
}
|
||||
}
|
||||
|
||||
addAll(buildKotlinNativeCompileCommonArgs(enableEndorsedLibs, languageSettings, compilerOptions, compilerPlugins))
|
||||
|
||||
addAll(source.map { it.absolutePath })
|
||||
@@ -205,4 +213,4 @@ private fun MutableList<String>.addKey(key: String, enabled: Boolean) {
|
||||
if (enabled) {
|
||||
add(key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -181,6 +181,9 @@ abstract class AbstractKotlinNativeCompile<
|
||||
@get:Classpath
|
||||
protected val friendModule: FileCollection = project.files({ compilation.friendPaths })
|
||||
|
||||
@get:Classpath
|
||||
protected val refinesModule: FileCollection = project.files({ compilation.refinesPaths })
|
||||
|
||||
@get:Input
|
||||
val target: String by project.provider { konanTarget.name }
|
||||
|
||||
@@ -468,7 +471,7 @@ internal constructor(
|
||||
properties[KLIB_PROPERTY_NATIVE_TARGETS] = konanTargetsForManifest
|
||||
properties.saveToFile(org.jetbrains.kotlin.konan.file.File(manifestFile.toPath()))
|
||||
|
||||
return SharedCompilationData(manifestFile, isAllowCommonizer)
|
||||
return SharedCompilationData(manifestFile, isAllowCommonizer, refinesModule)
|
||||
}
|
||||
|
||||
@TaskAction
|
||||
|
||||
+1
-33
@@ -5,16 +5,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.gradle.tasks.configuration
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationInfo
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCommonCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmAbstractFragmentMetadataCompilationData
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmMetadataCompilationData
|
||||
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
|
||||
import java.io.File
|
||||
|
||||
internal class KotlinCompileCommonConfig(
|
||||
private val compilationInfo: KotlinCompilationInfo,
|
||||
@@ -27,33 +21,7 @@ internal class KotlinCompileCommonConfig(
|
||||
compilationInfo.origin is GradleKpmMetadataCompilationData<*>
|
||||
}
|
||||
).disallowChanges()
|
||||
task.refinesMetadataPaths.from(getRefinesMetadataPaths(project)).disallowChanges()
|
||||
}
|
||||
}
|
||||
|
||||
private fun getRefinesMetadataPaths(project: Project): Provider<Iterable<File>> {
|
||||
return project.provider {
|
||||
when (compilationInfo) {
|
||||
is KotlinCompilationInfo.TCS -> {
|
||||
val defaultKotlinSourceSet: KotlinSourceSet = compilationInfo.compilation.defaultSourceSet
|
||||
val metadataTarget = compilationInfo.compilation.target
|
||||
defaultKotlinSourceSet.internal.dependsOnClosure
|
||||
.mapNotNull { sourceSet -> metadataTarget.compilations.findByName(sourceSet.name)?.output?.classesDirs }
|
||||
.flatten()
|
||||
}
|
||||
|
||||
is KotlinCompilationInfo.KPM -> {
|
||||
val compilationData = compilationInfo.compilationData as GradleKpmAbstractFragmentMetadataCompilationData<*>
|
||||
val fragment = compilationData.fragment
|
||||
project.files(
|
||||
fragment.refinesClosure.minus(fragment).map {
|
||||
val compilation = compilationData.metadataCompilationRegistry.getForFragmentOrNull(it)
|
||||
?: return@map project.files()
|
||||
compilation.output.classesDirs
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
task.refinesMetadataPaths.from(compilationInfo.refinesPaths).disallowChanges()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user