From 14c80baec8906ab97995fac0e0e658ac8bcb6fef Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Thu, 16 Nov 2017 22:25:50 +0300 Subject: [PATCH] Make the tasks cacheable, add logic that decides whether to cache them --- .../internal/Kapt3KotlinGradleSubplugin.kt | 15 +++++++- .../gradle/internal/KaptGenerateStubsTask.kt | 1 + .../kotlin/gradle/internal/KaptTask.kt | 1 + .../kotlin/gradle/plugin/KotlinJsDcePlugin.kt | 3 ++ .../kotlin/gradle/tasks/CacheableTasks.kt | 38 +++++++++++++++++++ .../gradle/tasks/KotlinCompileCommon.kt | 2 + .../kotlin/gradle/tasks/KotlinJsDce.kt | 2 + .../jetbrains/kotlin/gradle/tasks/Tasks.kt | 2 + .../kotlin/gradle/tasks/TasksProvider.kt | 3 ++ 9 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CacheableTasks.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt index 4d0544333bb..6c5150cdb2d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt @@ -34,6 +34,7 @@ import java.io.File import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.getKaptGeneratedSourcesDir import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.getKaptGeneratedClassesDir import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin.Companion.getKaptGeneratedKotlinSourcesDir +import org.jetbrains.kotlin.gradle.tasks.useBuildCacheIfSupported import java.io.ByteArrayOutputStream import java.io.ObjectOutputStream import java.util.* @@ -280,7 +281,12 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { } private fun Kapt3SubpluginContext.createKaptKotlinTask(): KaptTask { - val kaptTask = project.tasks.create(getKaptTaskName("kapt"), KaptTask::class.java) + val kaptTask = project.tasks.create( + getKaptTaskName("kapt"), + KaptTask::class.java) + + kaptTask.useBuildCacheIfSupported() + kaptTask.kotlinCompileTask = kotlinCompile kaptClasspathArtifacts.forEach { kaptTask.pluginOptions.addClasspathEntry(it) } @@ -312,7 +318,12 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { } private fun Kapt3SubpluginContext.createKaptGenerateStubsTask(): KaptGenerateStubsTask { - val kaptTask = project.tasks.create(getKaptTaskName("kaptGenerateStubs"), KaptGenerateStubsTask::class.java) + val kaptTask = project.tasks.create( + getKaptTaskName("kaptGenerateStubs"), + KaptGenerateStubsTask::class.java) + + kaptTask.useBuildCacheIfSupported() + kaptTask.sourceSetName = sourceSetName kaptTask.kotlinCompileTask = kotlinCompile kotlinToKaptGenerateStubsTasksMap[kotlinCompile] = kaptTask diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt index a720d5895d3..93039b54cb7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptGenerateStubsTask.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.incremental.destinationAsFile import org.jetbrains.kotlin.incremental.pathsAsStringRelativeTo import java.io.File +@CacheableTask open class KaptGenerateStubsTask : KotlinCompile() { override val sourceRootsContainer = FilteringSourceRootsContainer(emptyList(), { isSourceRootAllowed(it) }) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt index 3c7ef00f822..f56e5475bc2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/KaptTask.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.compilerRunner.OutputItemsCollectorImpl import org.jetbrains.kotlin.gradle.tasks.* import java.io.File +@CacheableTask open class KaptTask : ConventionTask(), CompilerArgumentAware { @get:Internal diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt index 8c30d5ff958..341c6ac8b23 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJsDcePlugin.kt @@ -26,6 +26,7 @@ import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.tasks.SourceSet import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinJsDce +import org.jetbrains.kotlin.gradle.tasks.useBuildCacheIfSupported import java.io.File class KotlinJsDcePlugin : Plugin { @@ -45,6 +46,8 @@ class KotlinJsDcePlugin : Plugin { project.tasks.findByName("build")!!.dependsOn(it) } + dceTask.useBuildCacheIfSupported() + project.afterEvaluate { val outputDir = File(File(project.buildDir, DEFAULT_OUT_DIR), sourceSet.name) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CacheableTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CacheableTasks.kt new file mode 100644 index 00000000000..bac2d4b41ad --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/CacheableTasks.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.gradle.tasks + +import org.gradle.api.Task +import org.gradle.util.GradleVersion + +private val gradleVersion = GradleVersion.current() + +internal fun shouldEnableGradleCache(): Boolean = + gradleVersion >= GradleVersion.version("4.3") + +internal fun T.useBuildCacheIfSupported() { + when { + gradleVersion >= GradleVersion.version("3.4") -> + outputs.cacheIf("Gradle version is at least 4.3") { shouldEnableGradleCache() } + + // There was no 'cacheIf' method accepting a reason string before 3.4: + gradleVersion >= GradleVersion.version("3.0") -> outputs.cacheIf { false } + + // Before 3.0, there was no build cache at all, no need to restrict anything + else -> Unit + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt index 187286dd552..94fc7198d00 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompileCommon.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.Project +import org.gradle.api.tasks.CacheableTask import org.gradle.api.tasks.compile.AbstractCompile import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments import org.jetbrains.kotlin.compilerRunner.GradleCompilerEnvironment @@ -29,6 +30,7 @@ import org.jetbrains.kotlin.gradle.dsl.fillDefaultValues import org.jetbrains.kotlin.incremental.ChangedFiles import java.io.File +@CacheableTask internal open class KotlinCompileCommon : AbstractKotlinCompile(), KotlinCommonCompile { private val kotlinOptionsImpl = KotlinMultiplatformCommonOptionsImpl() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt index 535aea2b7ca..faa9c7f75c8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJsDce.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.Project +import org.gradle.api.tasks.CacheableTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction @@ -31,6 +32,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsDceOptions import org.jetbrains.kotlin.gradle.dsl.KotlinJsDceOptionsImpl import java.io.File +@CacheableTask open class KotlinJsDce : AbstractKotlinCompileTool(), KotlinJsDce { override fun createCompilerArgs(): K2JSDceArguments = K2JSDceArguments() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index b5e36709106..429a47fb15c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -240,6 +240,7 @@ abstract class AbstractKotlinCompile() : AbstractKo } } +@CacheableTask open class KotlinCompile : AbstractKotlinCompile(), KotlinJvmCompile { @get:Internal internal var parentKotlinOptionsImpl: KotlinJvmOptionsImpl? = null @@ -430,6 +431,7 @@ open class KotlinCompile : AbstractKotlinCompile(), Kotl } } +@CacheableTask open class Kotlin2JsCompile() : AbstractKotlinCompile(), KotlinJsCompile { private val kotlinOptionsImpl = KotlinJsOptionsImpl() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt index 93d47370b87..ad0e1bc1223 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/TasksProvider.kt @@ -24,16 +24,19 @@ import org.jetbrains.kotlin.gradle.plugin.mapKotlinTaskProperties internal open class KotlinTasksProvider { fun createKotlinJVMTask(project: Project, name: String, sourceSetName: String): KotlinCompile = project.tasks.create(name, KotlinCompile::class.java).apply { + useBuildCacheIfSupported() configure(project, sourceSetName) } fun createKotlinJSTask(project: Project, name: String, sourceSetName: String): Kotlin2JsCompile = project.tasks.create(name, Kotlin2JsCompile::class.java).apply { + useBuildCacheIfSupported() configure(project, sourceSetName) } fun createKotlinCommonTask(project: Project, name: String, sourceSetName: String): KotlinCompileCommon = project.tasks.create(name, KotlinCompileCommon::class.java).apply { + useBuildCacheIfSupported() configure(project, sourceSetName) }