From 57c4886bd44e51e2d2915b8ebf00e48bfc51f79d Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Tue, 28 Aug 2018 19:24:29 +0300 Subject: [PATCH] Don't create source sets and test compilation for the metadata target Issue #KT-26253 In progress --- .../gradle/plugin/KotlinTargetConfigurator.kt | 82 ++++++++++++------- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 4 +- .../gradle/plugin/mpp/kotlinCompilations.kt | 16 ++-- .../gradle/plugin/mpp/kotlinTargetPresets.kt | 28 ++++++- .../kotlin/gradle/tasks/TasksProvider.kt | 4 +- 5 files changed, 91 insertions(+), 43 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt index cb96cc89761..7861b9c70c2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetConfigurator.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.gradle.plugin -import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.artifacts.Configuration @@ -43,7 +42,9 @@ import java.util.* import java.util.concurrent.Callable abstract class AbstractKotlinTargetConfigurator( - private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry + private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry, + protected val createDefaultSourceSets: Boolean, + protected val createTestCompilation: Boolean ) { open fun configureTarget( target: KotlinTargetType @@ -71,14 +72,16 @@ abstract class AbstractKotlinTargetConfigurator } } - platformTarget.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME).apply { - compileDependencyFiles = project.files(main.output, project.configurations.maybeCreate(compileDependencyConfigurationName)) + if (createTestCompilation) { + platformTarget.compilations.create(KotlinCompilation.TEST_COMPILATION_NAME).apply { + compileDependencyFiles = project.files(main.output, project.configurations.maybeCreate(compileDependencyConfigurationName)) - if (this is KotlinCompilationToRunnableFiles) { - runtimeDependencyFiles = project.files(output, main.output, project.configurations.maybeCreate(runtimeDependencyConfigurationName)) + if (this is KotlinCompilationToRunnableFiles) { + runtimeDependencyFiles = + project.files(output, main.output, project.configurations.maybeCreate(runtimeDependencyConfigurationName)) + } } } - } protected fun configureCompilationDefaults(target: KotlinTargetType) { @@ -87,8 +90,10 @@ abstract class AbstractKotlinTargetConfigurator target.compilations.all { compilation -> defineConfigurationsForCompilation(compilation, target, project.configurations) - project.kotlinExtension.sourceSets.maybeCreate(compilation.defaultSourceSetName).also { sourceSet -> - compilation.source(sourceSet) // also adds dependencies, requires the configurations for target and source set to exist at this point + if (createDefaultSourceSets) { + project.kotlinExtension.sourceSets.maybeCreate(compilation.defaultSourceSetName).also { sourceSet -> + compilation.source(sourceSet) // also adds dependencies, requires the configurations for target and source set to exist at this point + } } if (compilation is KotlinCompilationWithResources) { @@ -101,7 +106,7 @@ abstract class AbstractKotlinTargetConfigurator } protected fun configureTest(target: KotlinTarget) { - val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) as? KotlinCompilationToRunnableFiles + val testCompilation = target.compilations.findByName(KotlinCompilation.TEST_COMPILATION_NAME) as? KotlinCompilationToRunnableFiles ?: return // Otherwise, there is no runtime classpath target.project.tasks.create(lowerCamelCaseName(target.targetName, testTaskNameSuffix), Test::class.java).apply { @@ -157,19 +162,11 @@ abstract class AbstractKotlinTargetConfigurator val defaultConfiguration = configurations.maybeCreate(target.defaultConfigurationName) val mainCompilation = target.compilations.maybeCreate(KotlinCompilation.MAIN_COMPILATION_NAME) - val testCompilation = target.compilations.maybeCreate(KotlinCompilation.TEST_COMPILATION_NAME) val compileConfiguration = configurations.maybeCreate(mainCompilation.deprecatedCompileConfigurationName) val implementationConfiguration = configurations.maybeCreate(mainCompilation.implementationConfigurationName) val runtimeOnlyConfiguration = configurations.maybeCreate(mainCompilation.runtimeOnlyConfigurationName) - val compileTestsConfiguration = configurations.maybeCreate(testCompilation.deprecatedCompileConfigurationName) - val testImplementationConfiguration = configurations.maybeCreate(testCompilation.implementationConfigurationName) - val testRuntimeOnlyConfiguration = configurations.maybeCreate(testCompilation.runtimeOnlyConfigurationName) - - compileTestsConfiguration.extendsFrom(compileConfiguration) - testImplementationConfiguration.extendsFrom(implementationConfiguration) - testRuntimeOnlyConfiguration.extendsFrom(runtimeOnlyConfiguration) configurations.maybeCreate(target.apiElementsConfigurationName).apply { description = "API elements for main." @@ -198,25 +195,38 @@ abstract class AbstractKotlinTargetConfigurator usesPlatformOf(target) } - if (mainCompilation is KotlinCompilationToRunnableFiles && testCompilation is KotlinCompilationToRunnableFiles) { - val runtimeConfiguration = configurations.maybeCreate(mainCompilation.deprecatedRuntimeConfigurationName) - val testRuntimeConfiguration = configurations.maybeCreate(testCompilation.deprecatedRuntimeConfigurationName) - testRuntimeConfiguration.extendsFrom(runtimeConfiguration) - } - defaultConfiguration.extendsFrom(runtimeElementsConfiguration).usesPlatformOf(target) + + if (createTestCompilation) { + val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) + val compileTestsConfiguration = configurations.maybeCreate(testCompilation.deprecatedCompileConfigurationName) + val testImplementationConfiguration = configurations.maybeCreate(testCompilation.implementationConfigurationName) + val testRuntimeOnlyConfiguration = configurations.maybeCreate(testCompilation.runtimeOnlyConfigurationName) + + compileTestsConfiguration.extendsFrom(compileConfiguration) + testImplementationConfiguration.extendsFrom(implementationConfiguration) + testRuntimeOnlyConfiguration.extendsFrom(runtimeOnlyConfiguration) + + if (mainCompilation is KotlinCompilationToRunnableFiles && testCompilation is KotlinCompilationToRunnableFiles) { + val runtimeConfiguration = configurations.maybeCreate(mainCompilation.deprecatedRuntimeConfigurationName) + val testRuntimeConfiguration = configurations.maybeCreate(testCompilation.deprecatedRuntimeConfigurationName) + testRuntimeConfiguration.extendsFrom(runtimeConfiguration) + } + } } protected fun configureBuild(target: KotlinTargetType) { val project = target.project - val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) val buildNeeded = project.tasks.getByName(JavaBasePlugin.BUILD_NEEDED_TASK_NAME) val buildDependent = project.tasks.getByName(JavaBasePlugin.BUILD_DEPENDENTS_TASK_NAME) - if (testCompilation is KotlinCompilationToRunnableFiles) { - addDependsOnTaskInOtherProjects(buildNeeded, true, testCompilation.deprecatedRuntimeConfigurationName) - addDependsOnTaskInOtherProjects(buildDependent, false, testCompilation.deprecatedRuntimeConfigurationName) + if (createTestCompilation) { + val testCompilation = target.compilations.getByName(KotlinCompilation.TEST_COMPILATION_NAME) + if (testCompilation is KotlinCompilationToRunnableFiles) { + addDependsOnTaskInOtherProjects(buildNeeded, true, testCompilation.deprecatedRuntimeConfigurationName) + addDependsOnTaskInOtherProjects(buildDependent, false, testCompilation.deprecatedRuntimeConfigurationName) + } } } @@ -309,8 +319,14 @@ abstract class AbstractKotlinTargetConfigurator } open class KotlinTargetConfigurator( - buildOutputCleanupRegistry: BuildOutputCleanupRegistry -) : AbstractKotlinTargetConfigurator>(buildOutputCleanupRegistry) { + buildOutputCleanupRegistry: BuildOutputCleanupRegistry, + createDefaultSourceSets: Boolean, + createTestCompilation: Boolean +) : AbstractKotlinTargetConfigurator>( + buildOutputCleanupRegistry, + createDefaultSourceSets, + createTestCompilation +) { override fun configureArchivesAndComponent(target: KotlinOnlyTarget) { val project = target.project @@ -358,7 +374,11 @@ open class KotlinTargetConfigurator( open class KotlinNativeTargetConfigurator( buildOutputCleanupRegistry: BuildOutputCleanupRegistry -) : AbstractKotlinTargetConfigurator(buildOutputCleanupRegistry) { +) : AbstractKotlinTargetConfigurator( + buildOutputCleanupRegistry, + createDefaultSourceSets = true, + createTestCompilation = true +) { private val Collection<*>.isDimensionVisible: Boolean get() = size > 1 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 8fc09550b24..1e82488b455 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 @@ -115,11 +115,11 @@ class KotlinMultiplatformPlugin( targets.all { target -> target.compilations.findByName(KotlinCompilation.MAIN_COMPILATION_NAME)?.let { mainCompilation -> - sourceSets.maybeCreate(mainCompilation.defaultSourceSetName).dependsOn(production) + sourceSets.findByName(mainCompilation.defaultSourceSetName)?.dependsOn(production) } target.compilations.findByName(KotlinCompilation.TEST_COMPILATION_NAME)?.let { testCompilation -> - sourceSets.maybeCreate(testCompilation.defaultSourceSetName).dependsOn(test) + sourceSets.findByName(testCompilation.defaultSourceSetName)?.dependsOn(test) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 3b4d1ffa047..523d6f9077e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -85,13 +85,15 @@ abstract class AbstractKotlinCompilation( } if (sourceSet.name != defaultSourceSetName) { - // Temporary solution for checking consistency across source sets participating in a compilation that may - // not be interconnected with the dependsOn relation: check the settings as if the default source set of - // the compilation depends on the one added to the compilation: - defaultSourceSetLanguageSettingsChecker.runAllChecks( - kotlinExtension.sourceSets.getByName(defaultSourceSetName), - sourceSet - ) + kotlinExtension.sourceSets.findByName(defaultSourceSetName)?.let { defaultSourceSet -> + // Temporary solution for checking consistency across source sets participating in a compilation that may + // not be interconnected with the dependsOn relation: check the settings as if the default source set of + // the compilation depends on the one added to the compilation: + defaultSourceSetLanguageSettingsChecker.runAllChecks( + defaultSourceSet, + sourceSet + ) + } } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt index fa6d6095a57..fe5d2923127 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinTargetPresets.kt @@ -11,7 +11,11 @@ import org.gradle.api.plugins.JavaPlugin import org.gradle.internal.cleanup.BuildOutputCleanupRegistry import org.gradle.internal.reflect.Instantiator import org.jetbrains.kotlin.compilerRunner.* +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.source.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.sources.applyLanguageSettingsToKotlinTask import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider import org.jetbrains.kotlin.gradle.tasks.KonanCompilerDownloadTask import org.jetbrains.kotlin.gradle.tasks.KonanCompilerDownloadTask.Companion.KONAN_DOWNLOAD_TASK_NAME @@ -23,10 +27,13 @@ abstract class KotlinOnlyTargetPreset( protected val project: Project, private val instantiator: Instantiator, private val fileResolver: FileResolver, - private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry, + protected val buildOutputCleanupRegistry: BuildOutputCleanupRegistry, protected val kotlinPluginVersion: String ) : KotlinTargetPreset> { + protected open fun createKotlinTargetConfigurator(): KotlinTargetConfigurator = + KotlinTargetConfigurator(buildOutputCleanupRegistry, createDefaultSourceSets = true, createTestCompilation = true) + override fun createTarget(name: String): KotlinOnlyTarget { val result = KotlinOnlyTarget(project, platformType).apply { targetName = name @@ -36,7 +43,7 @@ abstract class KotlinOnlyTargetPreset( compilations = project.container(compilationFactory.itemClass, compilationFactory) } - KotlinTargetConfigurator(buildOutputCleanupRegistry).configureTarget(result) + createKotlinTargetConfigurator().configureTarget(result) result.compilations.all { compilation -> buildCompilationProcessor(compilation).run() @@ -84,6 +91,23 @@ class KotlinMetadataTargetPreset( companion object { const val PRESET_NAME = "metadata" } + + override fun createKotlinTargetConfigurator(): KotlinTargetConfigurator = + KotlinTargetConfigurator(buildOutputCleanupRegistry, createDefaultSourceSets = false, createTestCompilation = false) + + override fun createTarget(name: String): KotlinOnlyTarget = + super.createTarget(name).apply { + val mainCompilation = compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) + val commonMainSourceSet = project.kotlinExtension.sourceSets.getByName(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) + + mainCompilation.source(commonMainSourceSet) + + project.afterEvaluate { + // Since there's no default source set, apply language settings from commonMain: + val compileKotlinMetadata = project.tasks.getByName(mainCompilation.compileKotlinTaskName) as KotlinCompile<*> + applyLanguageSettingsToKotlinTask(commonMainSourceSet.languageSettings, compileKotlinMetadata) + } + } } class KotlinJvmTargetPreset( 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 efc4173106f..706627916b3 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 @@ -52,7 +52,9 @@ internal open class KotlinTasksProvider(val targetName: String) { mapKotlinTaskProperties(project, kotlinTask) project.whenEvaluated { - val languageSettings = project.kotlinExtension.sourceSets.getByName(compilation.defaultSourceSetName).languageSettings + val languageSettings = project.kotlinExtension.sourceSets.findByName(compilation.defaultSourceSetName)?.languageSettings + ?: return@whenEvaluated + kotlinTask as org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*> applyLanguageSettingsToKotlinTask(languageSettings, kotlinTask) }