[Gradle] NativeDistributionCommonizerTask: Use safe project extension
... to access `KotlinMultiplatformExtension` on subprojects. This will prevent strange ClassCastExceptions and show users a proper error message when the operation fails because of isolated classpaths. This will also be lenient if the isoalted Kotlin plugin is not a multiplatform plugin. ^KT-50592 Verification Pending
This commit is contained in:
committed by
Space
parent
a355fefd05
commit
0b981a54bc
+11
-17
@@ -7,18 +7,15 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
|
|||||||
|
|
||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.tasks.Classpath
|
|
||||||
import org.gradle.api.tasks.Input
|
import org.gradle.api.tasks.Input
|
||||||
import org.gradle.api.tasks.Internal
|
import org.gradle.api.tasks.Internal
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import org.jetbrains.kotlin.commonizer.CommonizerOutputFileLayout.resolveCommonizedDirectory
|
|
||||||
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
||||||
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
|
import org.jetbrains.kotlin.compilerRunner.GradleCliCommonizer
|
||||||
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCommonizerToolRunner
|
import org.jetbrains.kotlin.compilerRunner.KotlinNativeCommonizerToolRunner
|
||||||
import org.jetbrains.kotlin.compilerRunner.konanHome
|
import org.jetbrains.kotlin.compilerRunner.konanHome
|
||||||
import org.jetbrains.kotlin.compilerRunner.registerCommonizerClasspathConfigurationIfNecessary
|
import org.jetbrains.kotlin.compilerRunner.registerCommonizerClasspathConfigurationIfNecessary
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
|
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
|
||||||
import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR
|
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR
|
||||||
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
|
import org.jetbrains.kotlin.konan.library.KONAN_DISTRIBUTION_KLIB_DIR
|
||||||
@@ -31,7 +28,7 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
|
|||||||
|
|
||||||
@get:Input
|
@get:Input
|
||||||
internal val commonizerTargets: Set<SharedCommonizerTarget>
|
internal val commonizerTargets: Set<SharedCommonizerTarget>
|
||||||
get() = project.getAllCommonizerTargets()
|
get() = project.collectAllSharedCommonizerTargetsFromBuild()
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val commonizerRunner = KotlinNativeCommonizerToolRunner(project)
|
internal val commonizerRunner = KotlinNativeCommonizerToolRunner(project)
|
||||||
@@ -56,7 +53,7 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
|
|||||||
NativeDistributionCommonizationCache(project, GradleCliCommonizer(commonizerRunner)).commonizeNativeDistribution(
|
NativeDistributionCommonizationCache(project, GradleCliCommonizer(commonizerRunner)).commonizeNativeDistribution(
|
||||||
konanHome = konanHome,
|
konanHome = konanHome,
|
||||||
outputDirectory = getRootOutputDirectory(),
|
outputDirectory = getRootOutputDirectory(),
|
||||||
outputTargets = project.getAllCommonizerTargets(),
|
outputTargets = project.collectAllSharedCommonizerTargetsFromBuild(),
|
||||||
logLevel = project.commonizerLogLevel
|
logLevel = project.commonizerLogLevel
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -66,18 +63,15 @@ internal open class NativeDistributionCommonizerTask : DefaultTask() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Project.getAllCommonizerTargets(): Set<SharedCommonizerTarget> {
|
private fun Project.collectAllSharedCommonizerTargetsFromBuild(): Set<SharedCommonizerTarget> {
|
||||||
return allprojects.flatMapTo(mutableSetOf<SharedCommonizerTarget>()) { project ->
|
return allprojects.flatMap { project -> project.collectAllSharedCommonizerTargetsFromProject() }.toSet()
|
||||||
val kotlin = project.extensions.findByName("kotlin")
|
|
||||||
?.let { it as KotlinProjectExtension }
|
|
||||||
?.let { it as? KotlinMultiplatformExtension }
|
|
||||||
?: return@flatMapTo emptySet()
|
|
||||||
|
|
||||||
kotlin.sourceSets
|
|
||||||
.mapNotNull { sourceSet -> project.getCommonizerTarget(sourceSet) }
|
|
||||||
.filterIsInstance<SharedCommonizerTarget>()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun Project.collectAllSharedCommonizerTargetsFromProject(): Set<SharedCommonizerTarget> {
|
||||||
|
return (project.multiplatformExtensionOrNull ?: return emptySet()).sourceSets
|
||||||
|
.mapNotNull { sourceSet -> project.getCommonizerTarget(sourceSet) }
|
||||||
|
.filterIsInstance<SharedCommonizerTarget>()
|
||||||
|
.toSet()
|
||||||
|
}
|
||||||
|
|
||||||
private fun urlEncode(value: String): String = URLEncoder.encode(value, Charsets.UTF_8.name())
|
private fun urlEncode(value: String): String = URLEncoder.encode(value, Charsets.UTF_8.name())
|
||||||
|
|||||||
Reference in New Issue
Block a user