From 2d2042ad12e8174226b527136aa710711d58d866 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Thu, 5 Nov 2020 15:06:07 +0300 Subject: [PATCH] [Gradle, K/N] Configuration cache support for compile & link with warns #KT-43151 Fixed --- .../targets/native/KotlinNativeCompilation.kt | 7 +- .../gradle/targets/native/NativeBinaries.kt | 1 + .../targets/native/tasks/KotlinNativeTasks.kt | 64 ++++++++++++------- .../kotlin/konan/target/KonanTarget.kt | 3 +- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt index f5da104ff82..e2ec2f2d765 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeCompilation.kt @@ -29,11 +29,10 @@ abstract class AbstractKotlinNativeCompilation( compilationName: String ) : AbstractKotlinCompilation(target, compilationName) { - override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions() + override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { defaultSourceSet.languageSettings } - private inner class NativeCompileOptions : KotlinCommonOptions { - private val languageSettings: LanguageSettingsBuilder - get() = defaultSourceSet.languageSettings + private class NativeCompileOptions(languageSettingsProvider: () -> LanguageSettingsBuilder) : KotlinCommonOptions { + private val languageSettings: LanguageSettingsBuilder by lazy(languageSettingsProvider) override var apiVersion: String? get() = languageSettings.apiVersion diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt index e3cd7074268..82f92a66344 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/NativeBinaries.kt @@ -31,6 +31,7 @@ sealed class NativeBinary( private val name: String, baseNameProvided: String, val buildType: NativeBuildType, + @Transient var compilation: KotlinNativeCompilation ) : Named { open var baseName: String diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt index a8b1fc51747..a3b8ee549ab 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/KotlinNativeTasks.kt @@ -116,6 +116,11 @@ abstract class AbstractKotlinNativeCompile + @get:Internal + internal val compilationIsShared by lazy { + compilation.get() is KotlinSharedNativeCompilation + } + // region inputs/outputs @get:Input abstract val outputKind: CompilerOutputKind @@ -129,6 +134,14 @@ abstract class AbstractKotlinNativeCompile = project.provider { - val konanTarget = compilation.get().konanTarget - val prefix = outputKind.prefix(konanTarget) val suffix = outputKind.suffix(konanTarget) val filename = "$prefix${baseName}$suffix".let { @@ -221,6 +232,11 @@ abstract class AbstractKotlinNativeCompile get() = buildCommonArgs(true) + @get:Internal + internal val languageSettingsBuilder by lazy { + compilation.get().defaultSourceSet.languageSettings + } + // Args used by both the compiler and IDEA. protected open fun buildCommonArgs(defaultsOnly: Boolean = false): List = mutableListOf().apply { add("-Xmulti-platform") @@ -250,7 +266,7 @@ abstract class AbstractKotlinNativeCompile> = project.provider { @@ -468,7 +485,6 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile = mutableListOf().apply { addAll(super.buildCompilerArgs()) - addAll(CacheBuilder(project, binary).buildCompilerArgs()) + addAll(CacheBuilder(project, binary, konanTarget).buildCompilerArgs()) addKey("-tr", processTests) addArgIfNotNull("-entry", entryPoint) @@ -643,7 +661,7 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile { @@ -830,7 +848,7 @@ internal class CacheBuilder(val project: Project, val binary: NativeBinary) { private fun ensureCompilerProvidedLibsPrecached() { val distribution = Distribution(project.konanHome) - val platformLibs = (listOf(File(distribution.stdlib)) + File(distribution.platformLibs(compilation.konanTarget)) + val platformLibs = (listOf(File(distribution.stdlib)) + File(distribution.platformLibs(konanTarget)) .listFiles()).associateBy { it.name } val visitedLibs = mutableSetOf() for (platformLibName in platformLibs.keys) @@ -839,7 +857,7 @@ internal class CacheBuilder(val project: Project, val binary: NativeBinary) { fun buildCompilerArgs(): List = mutableListOf().apply { - if (konanCacheKind != NativeCacheKind.NONE && !optimized && cacheWorksFor(compilation.konanTarget)) { + if (konanCacheKind != NativeCacheKind.NONE && !optimized && cacheWorksFor(konanTarget)) { rootCacheDirectory.mkdirs() ensureCompilerProvidedLibsPrecached() add("-Xcache-directory=${rootCacheDirectory.absolutePath}") diff --git a/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt b/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt index 5b06f22c44f..e0f7658d425 100644 --- a/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt +++ b/native/utils/src/org/jetbrains/kotlin/konan/target/KonanTarget.kt @@ -6,8 +6,9 @@ package org.jetbrains.kotlin.konan.target import org.jetbrains.kotlin.konan.util.Named +import java.io.Serializable -sealed class KonanTarget(override val name: String, val family: Family, val architecture: Architecture) : Named { +sealed class KonanTarget(override val name: String, val family: Family, val architecture: Architecture) : Named, Serializable { object ANDROID_X64 : KonanTarget("android_x64", Family.ANDROID, Architecture.X64) object ANDROID_X86 : KonanTarget("android_x86", Family.ANDROID, Architecture.X86) object ANDROID_ARM32 : KonanTarget("android_arm32", Family.ANDROID, Architecture.ARM32)