Gradle, native: Support reinstalling K/N compiler

Sometimes a user may need to invalidate all precompiled
caches and regenerate all platform libraries. For example
this may be necessary after updating Xcode since platform
libraries are generated on basis of Xcode frameworks.

This patch provides a simple setting allowing a user
to manually reinstall a K/N compiler.
This commit is contained in:
Ilya Matveev
2020-02-12 17:43:26 +07:00
parent 27f5c577c9
commit a51230d307
3 changed files with 41 additions and 4 deletions
@@ -138,4 +138,22 @@ class NativePlatformLibsIT : BaseGradleIT() {
assertContainsRegex("Run tool: \"generatePlatformLibraries\" with args: .* -mode metadata".toRegex()) assertContainsRegex("Run tool: \"generatePlatformLibraries\" with args: .* -mode metadata".toRegex())
} }
} }
@Test
fun testCompilerReinstallation() = with(platformLibrariesProject("linuxX64")) {
deleteInstalledCompilers()
// Install the compiler at the first time. Don't build to reduce execution time.
build("tasks") {
assertSuccessful()
assertContains("Generate platform libraries for linux_x64")
}
// Reinstall the compiler.
build("tasks", "-Pkotlin.native.reinstall=true") {
assertSuccessful()
assertContains("Unpack Kotlin/Native compiler to ")
assertContains("Generate platform libraries for linux_x64")
}
}
} }
@@ -163,6 +163,18 @@ internal class PropertiesProvider private constructor(private val project: Proje
val nativeVersion: String? val nativeVersion: String?
get() = propertyWithDeprecatedVariant("kotlin.native.version", "org.jetbrains.kotlin.native.version") get() = propertyWithDeprecatedVariant("kotlin.native.version", "org.jetbrains.kotlin.native.version")
/**
* Forces reinstalling a K/N distribution.
*
* The current distribution directory will be removed along with generated platform libraries and precompiled dependencies.
* After that a fresh distribution with the same version will be installed. Platform libraries and precompiled dependencies will
* be built in a regular way.
*
* Ignored if kotlin.native.home is specified.
*/
val nativeReinstall: Boolean
get() = booleanProperty("kotlin.native.reinstall") ?: false
/** /**
* Allows a user to specify additional arguments of a JVM executing a K/N compiler. * Allows a user to specify additional arguments of a JVM executing a K/N compiler.
*/ */
@@ -13,7 +13,6 @@ import org.gradle.api.Project
import org.gradle.api.invocation.Gradle import org.gradle.api.invocation.Gradle
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.dsl.NativeDistributionType
import org.jetbrains.kotlin.gradle.dsl.NativeDistributionType.REGULAR import org.jetbrains.kotlin.gradle.dsl.NativeDistributionType.REGULAR
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
@@ -25,7 +24,6 @@ import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject
import org.jetbrains.kotlin.konan.CompilerVersion import org.jetbrains.kotlin.konan.CompilerVersion
import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File
abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>( abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
private val name: String, private val name: String,
@@ -46,12 +44,21 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
extensions.extraProperties.set(KOTLIN_NATIVE_HOME_PRIVATE_PROPERTY, konanHome) extensions.extraProperties.set(KOTLIN_NATIVE_HOME_PRIVATE_PROPERTY, konanHome)
} }
private val propertiesProvider = PropertiesProvider(project)
private val isKonanHomeOverridden: Boolean private val isKonanHomeOverridden: Boolean
get() = PropertiesProvider(project).nativeHome != null get() = propertiesProvider.nativeHome != null
private fun setupNativeCompiler() = with(project) { private fun setupNativeCompiler() = with(project) {
if (!isKonanHomeOverridden) { if (!isKonanHomeOverridden) {
NativeCompilerDownloader(this).downloadIfNeeded() val downloader = NativeCompilerDownloader(this)
if (propertiesProvider.nativeReinstall) {
logger.info("Reinstall Kotlin/Native distribution")
downloader.compilerDirectory.deleteRecursively()
}
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")