From 14e4f219dad8fff4687eb599fc53ecbc6fd2ff8d Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Thu, 6 Sep 2018 20:11:07 +0700 Subject: [PATCH] Support compiler plugins in native part of the mpp plugin --- .../gradle/plugin/KotlinTargetConfigurator.kt | 14 +++++++- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 2 +- .../gradle/plugin/mpp/kotlinTargetPresets.kt | 5 +-- .../kotlin/gradle/tasks/KotlinNativeTasks.kt | 36 +++++++++++++++++-- 4 files changed, 50 insertions(+), 7 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 975bfee22ba..023993ce3a6 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 @@ -28,6 +28,7 @@ import org.gradle.internal.cleanup.BuildOutputCleanupRegistry import org.gradle.language.base.plugins.LifecycleBasePlugin 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.mpp.* import org.jetbrains.kotlin.gradle.plugin.sources.getSourceSetHierarchy @@ -374,7 +375,8 @@ open class KotlinTargetConfigurator( open class KotlinNativeTargetConfigurator( - buildOutputCleanupRegistry: BuildOutputCleanupRegistry + buildOutputCleanupRegistry: BuildOutputCleanupRegistry, + private val kotlinPluginVersion: String ) : AbstractKotlinTargetConfigurator( buildOutputCleanupRegistry, createDefaultSourceSets = true, @@ -438,6 +440,13 @@ open class KotlinNativeTargetConfigurator( return buildDir.resolve("classes/kotlin/$targetSubDirectory${compilation.name}") } + private fun KotlinNativeCompile.addCompilerPlugins() { + SubpluginEnvironment + .loadSubplugins(project, kotlinPluginVersion) + .addSubpluginOptions(project, this, compilerPluginOptions) + compilerPluginClasspath = project.configurations.getByName(PLUGIN_CLASSPATH_CONFIGURATION_NAME) + } + private fun KotlinNativeCompile.registerOutputFiles(outputDirectory: File) { val konanTarget = compilation.target.konanTarget @@ -504,6 +513,8 @@ open class KotlinNativeTargetConfigurator( debuggable = buildType.debuggable registerOutputFiles(binaryOutputDirectory(buildType, kind, compilation)) + addCompilerPlugins() + dependsOnCompilerDownloading() linkAll.dependsOn(this) } @@ -555,6 +566,7 @@ open class KotlinNativeTargetConfigurator( enabled = compilation.target.konanTarget.enabledOnCurrentHost registerOutputFiles(klibOutputDirectory(compilation)) + addCompilerPlugins() dependsOnCompilerDownloading() compilation.output.tryAddClassesDir { project.files(this.outputFile).builtBy(this) 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 63452219dbf..525081e0751 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 @@ -87,7 +87,7 @@ class KotlinMultiplatformPlugin( add(KotlinAndroidTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) HostManager().targets.forEach { _, target -> - add(KotlinNativeTargetPreset(target.presetName, project, target, buildOutputCleanupRegistry)) + add(KotlinNativeTargetPreset(target.presetName, project, target, buildOutputCleanupRegistry, kotlinPluginVersion)) } } } 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 da36894a01b..1e10e8bea50 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 @@ -239,7 +239,8 @@ class KotlinNativeTargetPreset( private val name: String, val project: Project, val konanTarget: KonanTarget, - private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry + private val buildOutputCleanupRegistry: BuildOutputCleanupRegistry, + private val kotlinPluginVersion: String ) : KotlinTargetPreset { override fun getName(): String = name @@ -273,7 +274,7 @@ class KotlinNativeTargetPreset( compilations = project.container(compilationFactory.itemClass, compilationFactory) } - KotlinNativeTargetConfigurator(buildOutputCleanupRegistry).configureTarget(result) + KotlinNativeTargetConfigurator(buildOutputCleanupRegistry, kotlinPluginVersion).configureTarget(result) // Allow IDE to resolve the libraries provided by the compiler by adding them into dependencies. result.compilations.all { 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 137904096aa..a69debb98db 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 @@ -7,6 +7,7 @@ import org.gradle.api.file.FileCollection import org.gradle.api.file.FileTree import org.gradle.api.provider.Property import org.gradle.api.tasks.* +import org.gradle.api.tasks.compile.AbstractCompile import org.jetbrains.kotlin.compilerRunner.* import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.konan.KonanVersion @@ -19,10 +20,19 @@ import java.io.File // TODO: It's just temporary tasks used while KN isn't integrated with Big Kotlin compilation infrastructure. -open class KotlinNativeCompile : DefaultTask() { +open class KotlinNativeCompile : AbstractCompile() { init { - super.dependsOn(KonanCompilerDownloadTask.KONAN_DOWNLOAD_TASK_NAME) + dependsOn(KonanCompilerDownloadTask.KONAN_DOWNLOAD_TASK_NAME) + + @Suppress("LeakingThis") + setDestinationDir(project.provider { + val output = outputFile.get() + if (output.isDirectory) output else output.parentFile + }) + + sourceCompatibility = "1.6" + targetCompatibility = "1.6" } @Internal @@ -34,6 +44,8 @@ open class KotlinNativeCompile : DefaultTask() { // Inputs and outputs + override fun getSource(): FileTree = sources.asFileTree + val sources: FileCollection @InputFiles @SkipWhenEmpty @@ -46,6 +58,11 @@ open class KotlinNativeCompile : DefaultTask() { // It's already taken into account in libraries @Internal get() = compilation.friendCompilation?.output + override fun getClasspath(): FileCollection = libraries + override fun setClasspath(configuration: FileCollection?) { + throw UnsupportedOperationException("Setting class path directly is unsupported.") + } + @Input var optimized = false @Input @@ -68,6 +85,8 @@ open class KotlinNativeCompile : DefaultTask() { val outputFile: Property = project.objects.property(File::class.java) // endregion + val compilerPluginOptions = CompilerPluginOptions() + var compilerPluginClasspath: FileCollection? = null // region Useful extensions internal fun MutableList.addArg(parameter: String, value: String) { @@ -116,7 +135,7 @@ open class KotlinNativeCompile : DefaultTask() { get() = toPath().startsWith(project.file(project.konanHome).toPath()) @TaskAction - fun compile() { + override fun compile() { val output = outputFile.get() output.parentFile.mkdirs() @@ -132,6 +151,17 @@ open class KotlinNativeCompile : DefaultTask() { add("-Xmulti-platform") + println("Trying to obtain a plugin classpath") + compilerPluginClasspath?.let { pluginClasspath -> + println(pluginClasspath) + pluginClasspath.map { it.canonicalPath }.sorted().forEach { path -> + add("-Xplugin=$path") + } + compilerPluginOptions.arguments.forEach { + add("-P$it") + } + } + addAll(additionalCompilerOptions) libraries.files.filter {