From 29048ce5aed487fb2c6907465654249a68abf833 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Tue, 11 Sep 2018 16:07:33 +0300 Subject: [PATCH] Add generated interop libraries in compile dependency configuration (#1864) --- .../kotlin/gradle/plugin/CinteropSettings.kt | 3 ++ .../gradle/plugin/KotlinTargetConfigurator.kt | 49 +++++++++++++++++-- ...Settings.kt => DefaultCInteropSettings.kt} | 6 ++- .../gradle/plugin/mpp/kotlinCompilations.kt | 2 - .../kotlin/gradle/tasks/KotlinNativeTasks.kt | 4 +- 5 files changed, 56 insertions(+), 8 deletions(-) rename libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/{CInteropSettings.kt => DefaultCInteropSettings.kt} (94%) diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CinteropSettings.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CinteropSettings.kt index bfb28b8a641..5988983fc22 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CinteropSettings.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/CinteropSettings.kt @@ -24,6 +24,9 @@ interface CInteropSettings: Named { // TODO: Provide an interface for native compilations. val compilation: KotlinCompilation + val dependencyConfigurationName: String + var dependencyFiles: FileCollection + // DSL. fun defFile(file: Any) 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 86b76a4356c..f969de3e41b 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 @@ -30,6 +30,8 @@ import org.gradle.language.jvm.tasks.ProcessResources import org.gradle.nativeplatform.test.tasks.RunTestExecutable import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile @@ -601,7 +603,7 @@ open class KotlinNativeTargetConfigurator( settings = interop destinationDir = provider { klibOutputDirectory(compilation) } group = INTEROP_GROUP - description = "Generates Kotlin/Native interop library '${interop.name}' " + + description = "Generates Kotlin/Native interop library '${interop.name}' " + "for compilation '${compilation.name}'" + "of target '${konanTarget.name}'." enabled = compilation.target.konanTarget.enabledOnCurrentHost @@ -609,7 +611,7 @@ open class KotlinNativeTargetConfigurator( dependsOnCompilerDownloading() val interopOutput = project.files(outputFileProvider).builtBy(this) with(compilation) { - interopFiles += interopOutput + project.dependencies.add(compileDependencyConfigurationName, interopOutput) output.tryAddClassesDir { interopOutput } } } @@ -621,7 +623,6 @@ open class KotlinNativeTargetConfigurator( tasks.create(target.artifactsTaskName) target.compilations.all { createKlibCompilationTask(it) - createCInteropTasks(it) createBinaryLinkTasks(it) } @@ -630,6 +631,29 @@ open class KotlinNativeTargetConfigurator( } } + protected fun configureCInterops(target: KotlinNativeTarget): Unit = with(target.project) { + target.compilations.all { compilation -> + createCInteropTasks(compilation) + compilation.cinterops.all { + defineConfigurationsForCInterop(compilation, it, target, configurations) + } + } + + if (createTestCompilation) { + val mainCompilation = target.compilations.getByName(MAIN_COMPILATION_NAME) + target.compilations.findByName(TEST_COMPILATION_NAME)?.apply { + cinterops.all { + it.dependencyFiles += mainCompilation.output + } + } + } + } + + override fun configureTarget(target: KotlinNativeTarget) { + super.configureTarget(target) + configureCInterops(target) + } + private fun Task.dependsOnCompilerDownloading() = dependsOn(KonanCompilerDownloadTask.KONAN_DOWNLOAD_TASK_NAME) @@ -639,6 +663,25 @@ open class KotlinNativeTargetConfigurator( companion object { const val INTEROP_GROUP = "interop" + + protected fun defineConfigurationsForCInterop( + compilation: KotlinNativeCompilation, + cinterop: CInteropSettings, + target: KotlinTarget, + configurations: ConfigurationContainer + ) { + val compileOnlyConfiguration = configurations.getByName(compilation.compileOnlyConfigurationName) + val implementationConfiguration = configurations.getByName(compilation.implementationConfigurationName) + + cinterop.dependencyFiles = configurations.maybeCreate(cinterop.dependencyConfigurationName).apply { + extendsFrom(compileOnlyConfiguration, implementationConfiguration) + usesPlatformOf(target) + isVisible = false + isCanBeConsumed = false + attributes.attribute(USAGE_ATTRIBUTE, compilation.target.project.usageByName(Usage.JAVA_API)) + description = "Dependencies for cinterop '${cinterop.name}' (compilation '${compilation.name}')." + } + } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CInteropSettings.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultCInteropSettings.kt similarity index 94% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CInteropSettings.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultCInteropSettings.kt index ab513513aa3..cfffb5d9ae1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/CInteropSettings.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultCInteropSettings.kt @@ -9,7 +9,6 @@ import groovy.lang.Closure import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.file.FileCollection -import org.gradle.api.tasks.SourceSetOutput import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.CInteropSettings import org.jetbrains.kotlin.gradle.plugin.CInteropSettings.IncludeDirectories @@ -43,6 +42,11 @@ open class DefaultCInteropSettings @Inject constructor( val target: KotlinNativeTarget get() = compilation.target + override val dependencyConfigurationName: String + get() = compilation.disambiguateName("${name.capitalize()}CInterop") + + override var dependencyFiles: FileCollection = project.files() + val interopProcessingTaskName: String get() = lowerCamelCaseName( "cinterop", 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 bf76d994553..d5ee4c50b0a 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 @@ -284,8 +284,6 @@ class KotlinNativeCompilation( var friendCompilationName: String? = null - var interopFiles: FileCollection = project.files() - internal val friendCompilation: KotlinNativeCompilation? get() = friendCompilationName?.let { target.compilations.getByName(it) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt index 8f0a4e4587a..e660140f211 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinNativeTasks.kt @@ -106,7 +106,7 @@ open class KotlinNativeCompile : AbstractCompile() { get() = compilation.allSources val libraries: FileCollection - @InputFiles get() = compilation.compileDependencyFiles + compilation.interopFiles + @InputFiles get() = compilation.compileDependencyFiles private val friendModule: FileCollection? // It's already taken into account in libraries @@ -289,7 +289,7 @@ open class CInteropProcess: DefaultTask() { @Input get() = settings.includeDirs.headerFilterDirs.files val libraries: FileCollection - @InputFiles get() = settings.compilation.compileDependencyFiles + @InputFiles get() = settings.dependencyFiles val extraOpts: List @Input get() = settings.extraOpts