From a0f4898009349c5466660a7a49ac0ec41d83d9ea Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Thu, 1 Oct 2020 16:25:29 +0700 Subject: [PATCH] [Gradle, K/N] Make compile and link tasks cacheable Currently build cache isn't supported for frameworks as symlinks in build output is used. Symlinks are transformed into regular files by Gradle build cache and that breaks incremental build. Cinterop process task is not cacheable at the moment as it depends on OS-environment #KT-39564 Fixed --- .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 17 +++ .../jetbrains/kotlin/gradle/KlibBasedMppIT.kt | 3 +- .../gradle/KotlinSpecificDependenciesIT.kt | 6 +- .../kotlin/gradle/native/GeneralNativeIT.kt | 104 +++++++++++++++++- .../build-cache-app/build.gradle.kts | 21 ++++ .../lib-module/build.gradle.kts | 12 ++ .../lib-module/src/hostMain/kotlin/lib.kt | 6 + .../build-cache-app/settings.gradle | 10 ++ .../src/hostMain/kotlin/app.kt | 6 + .../build-cache-lib/build.gradle.kts | 22 ++++ .../build-cache-lib/settings.gradle | 7 ++ .../src/hostMain/kotlin/lib.kt | 6 + .../kotlin/gradle/plugin/KotlinPlugin.kt | 7 +- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 5 +- .../sources/DefaultLanguageSettingsBuilder.kt | 5 +- .../targets/native/tasks/KotlinNativeTasks.kt | 90 +++++++++------ 16 files changed, 278 insertions(+), 49 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/src/hostMain/kotlin/lib.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/src/hostMain/kotlin/app.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/settings.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/src/hostMain/kotlin/lib.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 83890fd8c5a..a014cf0b93e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -36,6 +36,8 @@ abstract class BaseGradleIT { open val defaultGradleVersion: GradleVersionRequired get() = GradleVersionRequired.None + val isTeamCityRun = System.getenv("TEAMCITY_VERSION") != null + @Before fun setUp() { // Aapt2 from Android Gradle Plugin 3.2 and below does not handle long paths on Windows. @@ -198,6 +200,7 @@ abstract class BaseGradleIT { val jsIrBackend: Boolean? = null, val androidHome: File? = null, val javaHome: File? = null, + val gradleUserHome: File? = null, val androidGradlePluginVersion: AGPVersion? = null, val forceOutputToStdout: Boolean = false, val debug: Boolean = false, @@ -510,6 +513,16 @@ abstract class BaseGradleIT { assertTasksExecuted(tasks.toList()) } + fun CompiledProject.assertTasksRetrievedFromCache(tasks: Iterable) { + for (task in tasks) { + assertContains("$task FROM-CACHE") + } + } + + fun CompiledProject.assertTasksRetrievedFromCache(vararg tasks: String) { + assertTasksRetrievedFromCache(tasks.toList()) + } + fun CompiledProject.assertTasksUpToDate(tasks: Iterable) { for (task in tasks) { assertContains("$task UP-TO-DATE") @@ -828,6 +841,10 @@ Finished executing task ':$taskName'| options.javaHome?.let { put("JAVA_HOME", it.canonicalPath) } + + options.gradleUserHome?.let { + put("GRADLE_USER_HOME", it.canonicalPath) + } } private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt index d5bbf3a42ae..2dc736dc950 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt @@ -97,7 +97,8 @@ class KlibBasedMppIT : BaseGradleIT() { "published-producer-commonMain.klib", "published-dependency-$hostSpecificSourceSet.klib", "published-dependency-commonMain.klib" - ) + ), + isNative = true ) } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt index d8081040590..6d93a2dffb9 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinSpecificDependenciesIT.kt @@ -291,11 +291,13 @@ private var testBuildRunId = 0 fun BaseGradleIT.Project.checkTaskCompileClasspath( taskPath: String, checkModulesInClasspath: List = emptyList(), - checkModulesNotInClasspath: List = emptyList() + checkModulesNotInClasspath: List = emptyList(), + isNative: Boolean = false ) { val subproject = taskPath.substringBeforeLast(":").takeIf { it.isNotEmpty() && it != taskPath } val taskName = taskPath.removePrefix(subproject.orEmpty()) - val expression = """(tasks.getByName("$taskName") as AbstractCompile).classpath.toList()""" + val taskClass = if (isNative) "org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile<*, *>" else "AbstractCompile" + val expression = """(tasks.getByName("$taskName") as $taskClass).classpath.toList()""" checkPrintedItems(subproject, expression, checkModulesInClasspath, checkModulesNotInClasspath) } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt index e7a1562f540..497ecfedf8b 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/GeneralNativeIT.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.internals.DISABLED_NATIVE_TARGETS_REPORTER_WA import org.jetbrains.kotlin.gradle.internals.NO_NATIVE_STDLIB_PROPERTY_WARNING import org.jetbrains.kotlin.gradle.internals.NO_NATIVE_STDLIB_WARNING import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind +import org.jetbrains.kotlin.gradle.prepareLocalBuildCache import org.jetbrains.kotlin.gradle.transformProjectWithPluginsDsl import org.jetbrains.kotlin.gradle.util.isWindows import org.jetbrains.kotlin.gradle.util.modify @@ -25,6 +26,7 @@ import org.junit.Assume import org.junit.Ignore import org.junit.Test import java.io.File +import java.nio.file.Files import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -86,6 +88,8 @@ class GeneralNativeIT : BaseGradleIT() { val nativeHostTargetName = MPPNativeTargets.current + private val buildCacheEnabledOptions = super.defaultBuildOptions().copy(withBuildCache = true) + private fun Project.targetClassesDir(targetName: String, sourceSetName: String = "main") = classesDir(sourceSet = "$targetName/$sourceSetName") @@ -138,6 +142,8 @@ class GeneralNativeIT : BaseGradleIT() { @Test fun testCanProduceNativeLibraries() = with(transformNativeTestProjectWithPluginDsl("libraries", directoryPrefix = "native-binaries")) { + prepareLocalBuildCache() + val baseName = "native_library" val sharedPrefix = CompilerOutputKind.DYNAMIC.prefix(HostManager.host) @@ -174,10 +180,16 @@ class GeneralNativeIT : BaseGradleIT() { val klibTask = ":compileKotlinHost" - // Building - build(":assemble") { + // Building to local build cache + build("assemble", options = buildCacheEnabledOptions) { assertSuccessful() assertTasksExecuted(linkTasks + klibTask) + } + + // Retrieving from build cache + build(":clean", ":assemble", options = buildCacheEnabledOptions) { + assertSuccessful() + assertTasksRetrievedFromCache(linkTasks + klibTask) sharedPaths.forEach { assertFileExists(it) } staticPaths.forEach { assertFileExists(it) } @@ -830,4 +842,92 @@ class GeneralNativeIT : BaseGradleIT() { } } + @Test + fun testNativeDependenciesBuildCache() { + val libProject = transformNativeTestProjectWithPluginDsl("build-cache-lib", directoryPrefix = "native-build-cache") + val appProject = transformNativeTestProjectWithPluginDsl("build-cache-app", directoryPrefix = "native-build-cache") + val appProjectAltPath = Project("build-cache-app2", directoryPrefix = "native-build-cache") + + val libLocalRepoUri = libProject.projectDir.resolve("repo").toURI() + + with(libProject) { + prepareLocalBuildCache() + + val compileTask = ":compileKotlinHost" + + build("assemble", options = buildCacheEnabledOptions) { + assertSuccessful() + assertTasksExecuted(compileTask) + } + + build("clean", "publish", options = buildCacheEnabledOptions) { + assertSuccessful() + assertTasksRetrievedFromCache(compileTask) + } + } + + val compileAppTasks = listOf( + ":compileKotlinHost", + ":lib-module:compileKotlinHost", + ) + + with(appProject) { + prepareLocalBuildCache() + + val klibPrefix = CompilerOutputKind.LIBRARY.prefix(HostManager.host) + val klibSuffix = CompilerOutputKind.LIBRARY.suffix(HostManager.host) + val klibPaths = listOf( + "${targetClassesDir("host")}${klibPrefix}app$klibSuffix", + "lib-module/${targetClassesDir("host")}${klibPrefix}lib-module$klibSuffix", + ) + + gradleBuildScript().appendText("\nrepositories { maven { setUrl(\"$libLocalRepoUri\") } }") + + build("assemble", options = buildCacheEnabledOptions) { + assertSuccessful() + assertTasksExecuted(compileAppTasks) + klibPaths.forEach { assertFileExists(it) } + } + + build("clean", "assemble", options = buildCacheEnabledOptions) { + assertSuccessful() + assertTasksRetrievedFromCache(compileAppTasks) + klibPaths.forEach { assertFileExists(it) } + } + + assertTrue(projectDir.resolve(klibPaths[0]).delete()) + + build("clean", ":lib-module:assemble") { + assertSuccessful() + assertTasksExecuted(compileAppTasks[1]) + } + + build("assemble", options = buildCacheEnabledOptions) { + assertSuccessful() + assertTasksRetrievedFromCache(compileAppTasks[0]) + assertTasksUpToDate(compileAppTasks[1]) + klibPaths.forEach { assertFileExists(it) } + } + + build("clean") { + assertSuccessful() + } + } + + Files.move(appProject.projectDir.toPath(), appProjectAltPath.projectDir.toPath()) + + // It's very time-consuming check so on Mac TC agent we test only source relocation + val alternateBuildEnvOptions = if (isTeamCityRun && HostManager.hostIsMac) { + buildCacheEnabledOptions + } else { + val alternateGradleHome = File(appProject.projectDir.parentFile, "gradleUserHome") + buildCacheEnabledOptions.copy(gradleUserHome = alternateGradleHome) + } + with(appProjectAltPath) { + build("assemble", options = alternateBuildEnvOptions) { + assertSuccessful() + assertTasksRetrievedFromCache(compileAppTasks) + } + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/build.gradle.kts new file mode 100644 index 00000000000..c3f0b1c85d8 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +repositories { + mavenLocal() + jcenter() +} + +kotlin { + ("host") + + sourceSets { + val hostMain by getting { + dependencies { + implementation("com.example:build-cache-lib:1.0") + api(project(":lib-module")) + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/build.gradle.kts new file mode 100644 index 00000000000..190deb5c47d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform") +} + +repositories { + mavenLocal() + jcenter() +} + +kotlin { + ("host") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/src/hostMain/kotlin/lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/src/hostMain/kotlin/lib.kt new file mode 100644 index 00000000000..f62e857003b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/lib-module/src/hostMain/kotlin/lib.kt @@ -0,0 +1,6 @@ +/* + * 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. + */ + +fun foo() = "some text" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/settings.gradle new file mode 100644 index 00000000000..b5f45925717 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + mavenLocal() + jcenter() + gradlePluginPortal() + } +} + +include ":lib-module" +rootProject.name = "app" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/src/hostMain/kotlin/app.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/src/hostMain/kotlin/app.kt new file mode 100644 index 00000000000..a8a2456dac5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-app/src/hostMain/kotlin/app.kt @@ -0,0 +1,6 @@ +/* + * 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. + */ + +fun printNumber() = println("${getNumber()} ${foo()}") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/build.gradle.kts new file mode 100644 index 00000000000..0b4d38a4e94 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/build.gradle.kts @@ -0,0 +1,22 @@ +group = "com.example" +version = "1.0" + +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +repositories { + mavenLocal() + jcenter() +} + +kotlin { + ("host") +} + +publishing { + repositories { + maven(url = "file://${projectDir.absolutePath.replace('\\', '/')}/repo") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/settings.gradle new file mode 100644 index 00000000000..9f205d955cb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/settings.gradle @@ -0,0 +1,7 @@ +pluginManagement { + repositories { + mavenLocal() + jcenter() + gradlePluginPortal() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/src/hostMain/kotlin/lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/src/hostMain/kotlin/lib.kt new file mode 100644 index 00000000000..5fc37b27969 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-build-cache/build-cache-lib/src/hostMain/kotlin/lib.kt @@ -0,0 +1,6 @@ +/* + * 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. + */ + +fun getNumber() = 42 \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index ac62f5706ad..3627cd19f72 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -23,10 +23,7 @@ import org.gradle.api.plugins.MavenPluginConvention import org.gradle.api.provider.Provider import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.CompileClasspathNormalizer -import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.TaskProvider -import org.gradle.api.tasks.Upload +import org.gradle.api.tasks.* import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.jvm.tasks.Jar import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry @@ -61,7 +58,7 @@ val KOTLIN_DSL_NAME = "kotlin" val KOTLIN_JS_DSL_NAME = "kotlin2js" val KOTLIN_OPTIONS_DSL_NAME = "kotlinOptions" -abstract class KotlinCompilationProcessor( +abstract class KotlinCompilationProcessor( open val kotlinCompilation: KotlinCompilation<*> ) { abstract val kotlinTask: TaskProvider diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index 06f6f3fb0ef..5d7ee49a12a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -17,9 +17,8 @@ import org.gradle.api.publish.PublicationContainer import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPublication import org.gradle.api.publish.maven.internal.publication.MavenPublicationInternal -import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven +import org.gradle.api.tasks.SourceTask import org.gradle.api.tasks.TaskProvider -import org.gradle.api.tasks.compile.AbstractCompile import org.gradle.jvm.tasks.Jar import org.gradle.util.ConfigureUtil import org.gradle.util.GradleVersion @@ -153,7 +152,7 @@ class KotlinMultiplatformPlugin( (sourceSet.languageSettings as? DefaultLanguageSettingsBuilder)?.run { compilerPluginOptionsTask = lazy { val associatedCompilation = primaryCompilationsBySourceSet[sourceSet] ?: metadataCompilation - project.tasks.getByName(associatedCompilation.compileKotlinTaskName) as AbstractCompile + project.tasks.getByName(associatedCompilation.compileKotlinTaskName) as SourceTask } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt index 5512d238ea8..2282e663d4d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/DefaultLanguageSettingsBuilder.kt @@ -8,8 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.sources import org.gradle.api.InvalidUserDataException import org.gradle.api.file.FileCollection import org.gradle.api.provider.Provider -import org.gradle.api.tasks.TaskProvider -import org.gradle.api.tasks.compile.AbstractCompile +import org.gradle.api.tasks.SourceTask import org.jetbrains.kotlin.config.ApiVersion import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersion @@ -70,7 +69,7 @@ internal class DefaultLanguageSettingsBuilder : LanguageSettingsBuilder { /* A Kotlin task that is responsible for code analysis of the owner of this language settings builder. */ @Transient // not needed during Gradle Instant Execution - var compilerPluginOptionsTask: Lazy = lazyOf(null) + var compilerPluginOptionsTask: Lazy = lazyOf(null) val compilerPluginArguments: List? get() { 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 0bfdacd2d2d..0c02b22e374 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 @@ -18,7 +18,6 @@ import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* -import org.gradle.api.tasks.compile.AbstractCompile import org.jetbrains.kotlin.compilerRunner.* import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonToolOptions @@ -113,13 +112,7 @@ private fun Collection.filterKlibsPassedToCompiler(project: Project) = fil } // endregion -abstract class AbstractKotlinNativeCompile : AbstractCompile() { - - init { - sourceCompatibility = "1.6" - targetCompatibility = "1.6" - } - +abstract class AbstractKotlinNativeCompile : SourceTask() { @get:Internal abstract val compilation: Provider @@ -137,7 +130,14 @@ abstract class AbstractKotlinNativeCompile = project.provider { + open val outputFile: Provider = project.provider { val konanTarget = compilation.get().konanTarget val prefix = outputKind.prefix(konanTarget) @@ -203,20 +208,23 @@ abstract class AbstractKotlinNativeCompile - @Internal get() = buildCommonArgs() + get() = buildCommonArgs() // Used by IDE via reflection. + @get:Internal val defaultSerializedCompilerArguments: List - @Internal get() = buildCommonArgs(true) + get() = buildCommonArgs(true) // Args used by both the compiler and IDEA. protected open fun buildCommonArgs(defaultsOnly: Boolean = false): List = mutableListOf().apply { @@ -319,6 +327,7 @@ abstract class AbstractKotlinNativeCompile(), KotlinCompile { @Internal @@ -347,6 +356,10 @@ open class KotlinNativeCompile : AbstractKotlinNativeCompile + get() = super.outputFile + @get:Input val shortModuleName: String by project.provider { baseName } @@ -445,6 +458,7 @@ open class KotlinNativeCompile : AbstractKotlinNativeCompile() { @get:Internal @@ -453,6 +467,9 @@ open class KotlinNativeLink : AbstractKotlinNativeCompile = project.provider { destinationDir.get().resolve(outputFileName) } + @OutputDirectory + val outputDirectoryProvider: Provider = + project.provider { destinationDir.get().resolve("$outputFileName-build") } + + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) val defFile: File - @InputFile get() = settings.defFileProperty.get() + get() = settings.defFileProperty.get() val packageName: String? @Optional @Input get() = settings.packageName @@ -925,8 +945,10 @@ open class CInteropProcess : DefaultTask() { val linkerOpts: List @Input get() = settings.linkerOpts + @get:InputFiles + @get:PathSensitive(PathSensitivity.RELATIVE) val headers: FileCollection - @InputFiles get() = settings.headers + get() = settings.headers val allHeadersDirs: Set @Input get() = settings.includeDirs.allHeadersDirs.files @@ -934,8 +956,10 @@ open class CInteropProcess : DefaultTask() { val headerFilterDirs: Set @Input get() = settings.includeDirs.headerFilterDirs.files + @get:InputFiles + @get:PathSensitive(PathSensitivity.RELATIVE) val libraries: FileCollection - @InputFiles get() = settings.dependencyFiles.filterOutPublishableInteropLibs(project) + get() = settings.dependencyFiles.filterOutPublishableInteropLibs(project) val extraOpts: List @Input get() = settings.extraOpts