Fixed configuration cache misses for the second build, when K/N compiler has been downloaded with the first build
KT-61154 Fixed
This commit is contained in:
committed by
Space Team
parent
f8b789164c
commit
304cbf1aea
+38
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.gradle.native
|
||||||
|
|
||||||
|
import org.gradle.util.GradleVersion
|
||||||
|
import org.jetbrains.kotlin.gradle.testbase.*
|
||||||
|
import org.junit.jupiter.api.DisplayName
|
||||||
|
|
||||||
|
@DisplayName("Tests for K/N with enabled configuration cache")
|
||||||
|
@NativeGradlePluginTests
|
||||||
|
class NativeWithConfigurationCacheIT : KGPBaseTest() {
|
||||||
|
|
||||||
|
override val defaultBuildOptions: BuildOptions = super.defaultBuildOptions.copy(configurationCache = true)
|
||||||
|
|
||||||
|
@DisplayName(
|
||||||
|
"Configuration phase should be reused from configuration cache for the second build " +
|
||||||
|
"(downloading konan does not affect cache inputs)"
|
||||||
|
)
|
||||||
|
@GradleTestVersions(minVersion = TestVersions.Gradle.G_8_1) // Since 8.1 Gradle on configuration cache it detects when the build logic accesses the "outside world" more strict https://docs.gradle.org/8.1.1/release-notes.html#configuration-inputs-detection-improvements
|
||||||
|
@GradleTest
|
||||||
|
fun testConfigurationCacheReusedSecondTime(gradleVersion: GradleVersion) {
|
||||||
|
nativeProject("native-with-configuration-cache", gradleVersion, enableGradleDebug = true) {
|
||||||
|
// we need to download compiler on the first build, that is why we are setting custom konan home dir without any compiler inside
|
||||||
|
val localKonan = workingDir.resolve(".konan")
|
||||||
|
build("help", "-Pkonan.data.dir=$localKonan") {
|
||||||
|
assertOutputContains("Configure project")
|
||||||
|
assertOutputContains("Unpack Kotlin/Native compiler to")
|
||||||
|
}
|
||||||
|
|
||||||
|
build("help", "-Pkonan.data.dir=$localKonan") {
|
||||||
|
assertOutputContains("Reusing configuration cache.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
kotlin("multiplatform")
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
mavenLocal()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlin {
|
||||||
|
val nativeMain by sourceSets.creating {
|
||||||
|
dependsOn(sourceSets["commonMain"])
|
||||||
|
}
|
||||||
|
|
||||||
|
targets.withType(KotlinNativeTarget::class.java).all {
|
||||||
|
compilations["main"].defaultSourceSet.dependsOn(nativeMain)
|
||||||
|
}
|
||||||
|
|
||||||
|
<SingleNativeTarget>()
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import platform.posix.*
|
||||||
|
|
||||||
|
fun main() {
|
||||||
|
printf("Hello world %d", 42)
|
||||||
|
}
|
||||||
+30
-4
@@ -8,14 +8,19 @@ package org.jetbrains.kotlin.gradle.utils
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.artifacts.repositories.ArtifactRepository
|
import org.gradle.api.artifacts.repositories.ArtifactRepository
|
||||||
|
import org.gradle.api.file.ConfigurableFileCollection
|
||||||
import org.gradle.api.file.FileTree
|
import org.gradle.api.file.FileTree
|
||||||
import org.gradle.api.logging.Logger
|
import org.gradle.api.logging.Logger
|
||||||
|
import org.gradle.api.provider.ValueSource
|
||||||
|
import org.gradle.api.provider.ValueSourceParameters
|
||||||
import org.jetbrains.kotlin.compilerRunner.KotlinNativeToolRunner
|
import org.jetbrains.kotlin.compilerRunner.KotlinNativeToolRunner
|
||||||
import org.jetbrains.kotlin.compilerRunner.konanHome
|
import org.jetbrains.kotlin.compilerRunner.konanHome
|
||||||
import org.jetbrains.kotlin.compilerRunner.konanVersion
|
import org.jetbrains.kotlin.compilerRunner.konanVersion
|
||||||
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.internal.configurationTimePropertiesAccessor
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.internal.usedAtConfigurationTime
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.internal.NativeDistributionType
|
import org.jetbrains.kotlin.gradle.targets.native.internal.NativeDistributionType
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.internal.NativeDistributionTypeProvider
|
import org.jetbrains.kotlin.gradle.targets.native.internal.NativeDistributionTypeProvider
|
||||||
import org.jetbrains.kotlin.gradle.targets.native.internal.PlatformLibrariesGenerator
|
import org.jetbrains.kotlin.gradle.targets.native.internal.PlatformLibrariesGenerator
|
||||||
@@ -27,7 +32,7 @@ import java.nio.file.Files
|
|||||||
|
|
||||||
class NativeCompilerDownloader(
|
class NativeCompilerDownloader(
|
||||||
val project: Project,
|
val project: Project,
|
||||||
private val compilerVersion: String = project.konanVersion
|
private val compilerVersion: String = project.konanVersion,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -35,6 +40,8 @@ class NativeCompilerDownloader(
|
|||||||
loadPropertyFromResources("project.properties", "kotlin.native.version")
|
loadPropertyFromResources("project.properties", "kotlin.native.version")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal var NEED_TO_DOWNLOAD_FLAG: Boolean = true
|
||||||
|
|
||||||
internal const val BASE_DOWNLOAD_URL = "https://download.jetbrains.com/kotlin/native/builds"
|
internal const val BASE_DOWNLOAD_URL = "https://download.jetbrains.com/kotlin/native/builds"
|
||||||
internal const val KOTLIN_GROUP_ID = "org.jetbrains.kotlin"
|
internal const val KOTLIN_GROUP_ID = "org.jetbrains.kotlin"
|
||||||
}
|
}
|
||||||
@@ -185,12 +192,29 @@ class NativeCompilerDownloader(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun downloadIfNeeded() {
|
fun downloadIfNeeded() {
|
||||||
|
checkClassPath() // This is workaround to avoid double execution configuration phase. See KT-61154 for more details
|
||||||
val classpath = KotlinNativeToolRunner.Settings.fromProject(project).classpath
|
if (NEED_TO_DOWNLOAD_FLAG) {
|
||||||
if (classpath.isEmpty() || classpath.any { !it.exists() }) {
|
|
||||||
downloadAndExtract()
|
downloadAndExtract()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun checkClassPath() {
|
||||||
|
project.providers.of(NativeCompilerDownloaderClassPathChecker::class.java) {
|
||||||
|
it.parameters.classPath.setFrom(KotlinNativeToolRunner.Settings.fromProject(project).classpath)
|
||||||
|
}.usedAtConfigurationTime(project.configurationTimePropertiesAccessor).get()
|
||||||
|
}
|
||||||
|
|
||||||
|
internal abstract class NativeCompilerDownloaderClassPathChecker : ValueSource<Boolean, NativeCompilerDownloaderClassPathChecker.Params> {
|
||||||
|
|
||||||
|
interface Params : ValueSourceParameters {
|
||||||
|
val classPath: ConfigurableFileCollection
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun obtain(): Boolean {
|
||||||
|
NEED_TO_DOWNLOAD_FLAG = parameters.classPath.files.none { it.exists() }
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun Project.setupNativeCompiler(konanTarget: KonanTarget) {
|
internal fun Project.setupNativeCompiler(konanTarget: KonanTarget) {
|
||||||
@@ -204,6 +228,7 @@ internal fun Project.setupNativeCompiler(konanTarget: KonanTarget) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
downloader.downloadIfNeeded()
|
downloader.downloadIfNeeded()
|
||||||
|
|
||||||
logger.info("Kotlin/Native distribution: $konanHome")
|
logger.info("Kotlin/Native distribution: $konanHome")
|
||||||
} else {
|
} else {
|
||||||
logger.info("User-provided Kotlin/Native distribution: $konanHome")
|
logger.info("User-provided Kotlin/Native distribution: $konanHome")
|
||||||
@@ -214,3 +239,4 @@ internal fun Project.setupNativeCompiler(konanTarget: KonanTarget) {
|
|||||||
PlatformLibrariesGenerator(project, konanTarget).generatePlatformLibsIfNeeded()
|
PlatformLibrariesGenerator(project, konanTarget).generatePlatformLibsIfNeeded()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user