Skip to content

Commit 6b1f998

Browse files
dkrasnoffSpace Team
authored and
Space Team
committed
[Gradle] Added error when provided kotlin.native.home is wrong.
^KT-67522 Fixed ^KT-67521 Fixed (cherry picked from commit 2cb70c5)
1 parent a07119b commit 6b1f998

File tree

6 files changed

+117
-2
lines changed

6 files changed

+117
-2
lines changed

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,8 @@ object KotlinToolingDiagnostics {
808808

809809
object ResourceMayNotBeResolvedWithGradleVersion : ToolingDiagnosticFactory(ERROR) {
810810
operator fun invoke(
811-
targetName: String, currentGradleVersion: String, minimumRequiredVersion: String) = build(
811+
targetName: String, currentGradleVersion: String, minimumRequiredVersion: String,
812+
) = build(
812813
"""
813814
Resources for target $targetName may not be resolved. Minimum required Gradle version is ${minimumRequiredVersion} but current is ${currentGradleVersion}.
814815
@@ -895,6 +896,14 @@ object KotlinToolingDiagnostics {
895896
appendLine("They are already added from Kotlin Target Hierarchy template https://kotl.in/hierarchy-template")
896897
}
897898
}
899+
900+
object BrokenKotlinNativeBundleError : ToolingDiagnosticFactory(ERROR) {
901+
operator fun invoke(kotlinNativeHomePropertyValue: String?, kotlinNativeHomeProperty: String): ToolingDiagnostic =
902+
build(
903+
"The Kotlin/Native distribution ($kotlinNativeHomePropertyValue) used in this build does not provide required subdirectories." +
904+
" Make sure that the '$kotlinNativeHomeProperty' property points to a valid Kotlin/Native distribution.",
905+
)
906+
}
898907
}
899908

900909
private fun String.indentLines(nSpaces: Int = 4, skipFirstLine: Boolean = true): String {

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MissingNativeStdlibChecker.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ import org.gradle.api.provider.ValueSourceParameters
1212
import org.jetbrains.kotlin.commonizer.stdlib
1313
import org.jetbrains.kotlin.compilerRunner.kotlinNativeToolchainEnabled
1414
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
15+
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
1516
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker
1617
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext
1718
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
1819
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
1920
import org.jetbrains.kotlin.gradle.plugin.internal.configurationTimePropertiesAccessor
2021
import org.jetbrains.kotlin.gradle.plugin.internal.usedAtConfigurationTime
2122
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
23+
import org.jetbrains.kotlin.gradle.utils.`is`
2224
import org.jetbrains.kotlin.gradle.utils.konanDistribution
2325

2426
/**
@@ -43,6 +45,7 @@ internal object MissingNativeStdlibChecker : KotlinGradleProjectChecker {
4345
it.parameters.noStdlibEnabled.set(project.hasProperty("kotlin.native.nostdlib"))
4446
it.parameters.kotlinNativeToolchainEnabled.set(project.kotlinNativeToolchainEnabled)
4547
it.parameters.stdlib.setFrom(project.konanDistribution.stdlib)
48+
it.parameters.overriddenKotlinNativeHome.set(project.kotlinPropertiesProvider.nativeHome)
4649
}.usedAtConfigurationTime(project.configurationTimePropertiesAccessor)
4750

4851
internal abstract class StdlibExistenceCheckerValueSource :
@@ -52,11 +55,12 @@ internal object MissingNativeStdlibChecker : KotlinGradleProjectChecker {
5255
val noStdlibEnabled: Property<Boolean>
5356
val kotlinNativeToolchainEnabled: Property<Boolean>
5457
val stdlib: ConfigurableFileCollection
58+
val overriddenKotlinNativeHome: Property<String>
5559
}
5660

5761
override fun obtain(): Boolean {
5862
return parameters.noStdlibEnabled.get() || // suppressed
59-
parameters.kotlinNativeToolchainEnabled.get() || // with toolchain, we download konan after configuration phase, thus, we shouldn't check existence here
63+
(parameters.kotlinNativeToolchainEnabled.get() && !parameters.overriddenKotlinNativeHome.isPresent) || // with toolchain, we download konan after configuration phase, thus, we shouldn't check existence here
6064
parameters.stdlib.singleFile.exists()
6165
}
6266
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
package org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers
7+
8+
import org.gradle.api.provider.Property
9+
import org.gradle.api.provider.ValueSource
10+
import org.gradle.api.provider.ValueSourceParameters
11+
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
12+
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker
13+
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext
14+
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
15+
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
16+
import org.jetbrains.kotlin.gradle.plugin.internal.configurationTimePropertiesAccessor
17+
import org.jetbrains.kotlin.gradle.plugin.internal.usedAtConfigurationTime
18+
import java.io.File
19+
20+
21+
/**
22+
* This class is required for checking that provided custom `kotlin.native.home` contains a Kotlin/Native bundle.
23+
* For that, we are checking the existence of some main subdirectories inside the installed Kotlin/Native bundle.
24+
*/
25+
internal object OverriddenKotlinNativeHomeChecker : KotlinGradleProjectChecker {
26+
27+
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
28+
if (allKonanMainSubdirectoriesExist().get()) return
29+
30+
collector.report(
31+
project, KotlinToolingDiagnostics.BrokenKotlinNativeBundleError(
32+
kotlinPropertiesProvider.nativeHome, PropertiesProvider.KOTLIN_NATIVE_HOME
33+
)
34+
)
35+
}
36+
37+
private fun KotlinGradleProjectCheckerContext.allKonanMainSubdirectoriesExist() =
38+
// we need to wrap this check in ValueSource to prevent Gradle from monitoring the stdlib folder as a build configuration input
39+
project.providers.of(StdlibExistenceCheckerValueSource::class.java) {
40+
it.parameters.overriddenKotlinNativeHome.set(kotlinPropertiesProvider.nativeHome)
41+
}.usedAtConfigurationTime(project.configurationTimePropertiesAccessor)
42+
43+
internal abstract class StdlibExistenceCheckerValueSource :
44+
ValueSource<Boolean, StdlibExistenceCheckerValueSource.Params> {
45+
46+
interface Params : ValueSourceParameters {
47+
val overriddenKotlinNativeHome: Property<String>
48+
}
49+
50+
override fun obtain(): Boolean {
51+
return !parameters.overriddenKotlinNativeHome.isPresent || // when `kotlin.native.home` was not provided, we don't need to make this diagnostic
52+
REQUIRED_SUBDIRECTORIES.all { subdir ->
53+
File(parameters.overriddenKotlinNativeHome.get()).resolve(subdir).exists()
54+
}
55+
56+
}
57+
58+
companion object {
59+
private val REQUIRED_SUBDIRECTORIES = listOf("konan", "bin")
60+
}
61+
}
62+
}

libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ internal fun Project.registerKotlinPluginExtensions() {
147147
register(project, CInteropInputChecker)
148148
register(project, IncorrectNativeDependenciesChecker)
149149
register(project, GradleDeprecatedPropertyChecker)
150+
register(project, OverriddenKotlinNativeHomeChecker)
150151

151152
if (isMultiplatform) {
152153
register(project, KotlinMultiplatformAndroidGradlePluginCompatibilityChecker)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
3+
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
4+
*/
5+
6+
package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests
7+
8+
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
9+
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
10+
import org.jetbrains.kotlin.gradle.plugin.extraProperties
11+
import org.jetbrains.kotlin.gradle.util.assertNoDiagnostics
12+
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
13+
import org.jetbrains.kotlin.gradle.util.checkDiagnostics
14+
import kotlin.test.Test
15+
16+
class OverriddenKotlinHomeCheckerTest {
17+
18+
@Test
19+
fun `overridden kotlin home with wrong path failes build`() {
20+
val project = buildProjectWithMPP(
21+
preApplyCode = {
22+
project.extraProperties.set(PropertiesProvider.KOTLIN_NATIVE_HOME, "non_existed_path")
23+
}) {
24+
project.multiplatformExtension.applyDefaultHierarchyTemplate()
25+
project.multiplatformExtension.linuxX64()
26+
}
27+
project.checkDiagnostics("BrokenKotlinNativeBundleError")
28+
}
29+
30+
@Test
31+
fun `without overridden kotlin home build is successfull`() {
32+
val project = buildProjectWithMPP {
33+
project.multiplatformExtension.applyDefaultHierarchyTemplate()
34+
project.multiplatformExtension.linuxX64()
35+
}
36+
project.assertNoDiagnostics()
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[BrokenKotlinNativeBundleError | ERROR] The Kotlin/Native distribution (non_existed_path) used in this build does not provide required subdirectories. Make sure that the 'kotlin.native.home' property points to a valid Kotlin/Native distribution.

0 commit comments

Comments
 (0)