[Gradle] Implement ConfigureBuildSideEffect (replacing 'configureBuild')

KT-61634
This commit is contained in:
Sebastian Sellmair
2023-10-25 15:51:00 +02:00
committed by Space Team
parent 5676759287
commit 40820e42a6
3 changed files with 41 additions and 29 deletions
@@ -36,11 +36,9 @@ interface KotlinTargetConfigurator<KotlinTargetType : KotlinTarget> {
) {
target.runKotlinCompilationSideEffects()
target.runKotlinTargetSideEffects()
configureBuild(target)
configurePlatformSpecificModel(target)
}
fun configureBuild(target: KotlinTargetType)
fun configurePlatformSpecificModel(target: KotlinTargetType) = Unit
}
@@ -50,33 +48,6 @@ abstract class AbstractKotlinTargetConfigurator<KotlinTargetType : KotlinTarget>
protected open val runtimeIncludesCompilationOutputs = true
override fun configureBuild(target: KotlinTargetType) {
val project = target.project
val buildNeeded = project.tasks.named(JavaBasePlugin.BUILD_NEEDED_TASK_NAME)
val buildDependent = project.tasks.named(JavaBasePlugin.BUILD_DEPENDENTS_TASK_NAME)
if (createTestCompilation) {
val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME)
if (testCompilation is KotlinCompilationToRunnableFiles) {
addDependsOnTaskInOtherProjects(project, buildNeeded, true, testCompilation.runtimeDependencyConfigurationName)
addDependsOnTaskInOtherProjects(project, buildDependent, false, testCompilation.runtimeDependencyConfigurationName)
}
}
}
private fun addDependsOnTaskInOtherProjects(
project: Project,
taskProvider: TaskProvider<*>,
useDependedOn: Boolean,
configurationName: String,
) {
val configuration = project.configurations.getByName(configurationName)
taskProvider.configure { task ->
task.dependsOn(configuration.getTaskDependencyFromProjectDependency(useDependedOn, taskProvider.name))
}
}
companion object {
const val testTaskNameSuffix = "test"
const val runTaskNameSuffix = "run"
@@ -56,6 +56,8 @@ import org.jetbrains.kotlin.gradle.plugin.sources.KotlinMultiplatformSourceSetSe
import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction
import org.jetbrains.kotlin.gradle.plugin.statistics.MultiplatformBuildStatsReportSetupAction
import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubpluginSetupAction
import org.jetbrains.kotlin.gradle.targets.*
import org.jetbrains.kotlin.gradle.targets.ConfigureBuildSideEffect
import org.jetbrains.kotlin.gradle.targets.CreateArtifactsSideEffect
import org.jetbrains.kotlin.gradle.targets.CreateDefaultCompilationsSideEffect
import org.jetbrains.kotlin.gradle.targets.CreateTargetConfigurationsSideEffect
@@ -109,6 +111,7 @@ internal fun Project.registerKotlinPluginExtensions() {
register(project, CreateTargetConfigurationsSideEffect)
register(project, NativeForwardImplementationToApiElementsSideEffect)
register(project, CreateArtifactsSideEffect)
register(project, ConfigureBuildSideEffect)
}
KotlinCompilationSideEffect.extensionPoint.apply {
@@ -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.targets
import org.gradle.api.Project
import org.gradle.api.plugins.JavaBasePlugin
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles
internal val ConfigureBuildSideEffect = KotlinTargetSideEffect { target ->
val project = target.project
val buildNeeded = project.tasks.named(JavaBasePlugin.BUILD_NEEDED_TASK_NAME)
val buildDependent = project.tasks.named(JavaBasePlugin.BUILD_DEPENDENTS_TASK_NAME)
val testCompilation = target.compilations.findByName(KotlinCompilation.TEST_COMPILATION_NAME)
@Suppress("DEPRECATION")
if (testCompilation is KotlinCompilationToRunnableFiles) {
addDependsOnTaskInOtherProjects(project, buildNeeded, true, testCompilation.runtimeDependencyConfigurationName)
addDependsOnTaskInOtherProjects(project, buildDependent, false, testCompilation.runtimeDependencyConfigurationName)
}
}
private fun addDependsOnTaskInOtherProjects(
project: Project,
taskProvider: TaskProvider<*>,
useDependedOn: Boolean,
configurationName: String,
) {
val configuration = project.configurations.getByName(configurationName)
taskProvider.configure { task ->
task.dependsOn(configuration.getTaskDependencyFromProjectDependency(useDependedOn, taskProvider.name))
}
}