From fb3c1f1a2f5d479fddffc568c13283127c848dd3 Mon Sep 17 00:00:00 2001 From: Dmitrii Krasnov Date: Thu, 7 Mar 2024 20:04:19 +0100 Subject: [PATCH] [Gradle] Disabled MissingNativeStdlibChecker when k/n toolchain enabled This checker was added to check that k/n home was correctly overridden. With k/n toolchain we always download k/n distribution. That is why when k/n toolchain is enabled we don't need this check. ^KT-65624 Fixed --- .../checkers/MissingNativeStdlibChecker.kt | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MissingNativeStdlibChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MissingNativeStdlibChecker.kt index 48d8d8c5c96..28beba0ece0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MissingNativeStdlibChecker.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MissingNativeStdlibChecker.kt @@ -5,26 +5,59 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.provider.Property +import org.gradle.api.provider.ValueSource +import org.gradle.api.provider.ValueSourceParameters import org.jetbrains.kotlin.commonizer.stdlib +import org.jetbrains.kotlin.compilerRunner.kotlinNativeToolchainEnabled import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider -import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector +import org.jetbrains.kotlin.gradle.plugin.internal.configurationTimePropertiesAccessor +import org.jetbrains.kotlin.gradle.plugin.internal.usedAtConfigurationTime import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.utils.konanDistribution +/** + * This class is made to check that kotlin native was successfully installed before the build + */ internal object MissingNativeStdlibChecker : KotlinGradleProjectChecker { override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) { val targets = multiplatformExtension?.awaitTargets() ?: return if (targets.isEmpty() || // misconfigured project targets.none { it is KotlinNativeTarget } || // no K/N targets - project.hasProperty("kotlin.native.nostdlib") || // suppressed - project.konanDistribution.stdlib.exists() + checkThatStdlibExists().get() ) return collector.report(project, KotlinToolingDiagnostics.NativeStdlibIsMissingDiagnostic( PropertiesProvider.KOTLIN_NATIVE_HOME.takeIf { kotlinPropertiesProvider.nativeHome != null } )) } + + private fun KotlinGradleProjectCheckerContext.checkThatStdlibExists() = + // we need to wrap this check in ValueSource to prevent Gradle from monitoring the stdlib folder as a build configuration input + project.providers.of(StdlibExistenceCheckerValueSource::class.java) { + it.parameters.noStdlibEnabled.set(project.hasProperty("kotlin.native.nostdlib")) + it.parameters.kotlinNativeToolchainEnabled.set(project.kotlinNativeToolchainEnabled) + it.parameters.stdlib.setFrom(project.konanDistribution.stdlib) + }.usedAtConfigurationTime(project.configurationTimePropertiesAccessor) + + internal abstract class StdlibExistenceCheckerValueSource : + ValueSource { + + interface Params : ValueSourceParameters { + val noStdlibEnabled: Property + val kotlinNativeToolchainEnabled: Property + val stdlib: ConfigurableFileCollection + } + + override fun obtain(): Boolean { + return parameters.noStdlibEnabled.get() || // suppressed + parameters.kotlinNativeToolchainEnabled.get() || // with toolchain, we download konan after configuration phase, thus, we shouldn't check existence here + parameters.stdlib.singleFile.exists() + } + } }