From 7d6adbd08896ce84d22137057cba3d562283e2d1 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Tue, 18 Sep 2018 12:31:12 +0300 Subject: [PATCH] Serialize native compiler args --- .../kotlin/gradle/tasks/KotlinNativeTasks.kt | 132 +++++++++++------- 1 file changed, 82 insertions(+), 50 deletions(-) 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 c36e28183ee..724759899dc 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 @@ -2,29 +2,25 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.api.DefaultTask import org.gradle.api.Project -import org.gradle.api.artifacts.repositories.ArtifactRepository -import org.gradle.api.artifacts.repositories.IvyPatternRepositoryLayout import org.gradle.api.file.FileCollection import org.gradle.api.file.FileTree import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.api.tasks.compile.AbstractCompile -import org.jetbrains.kotlin.compilerRunner.* +import org.jetbrains.kotlin.compilerRunner.KonanCompilerRunner +import org.jetbrains.kotlin.compilerRunner.KonanInteropRunner +import org.jetbrains.kotlin.compilerRunner.konanHome +import org.jetbrains.kotlin.compilerRunner.konanVersion +import org.jetbrains.kotlin.gradle.dsl.KotlinCommonToolOptions import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultCInteropSettings import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.defaultSourceSetName import org.jetbrains.kotlin.gradle.plugin.mpp.isMainCompilation -import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader -import org.jetbrains.kotlin.konan.KonanVersion -import org.jetbrains.kotlin.konan.KonanVersionImpl -import org.jetbrains.kotlin.konan.MetaVersion import org.jetbrains.kotlin.konan.target.CompilerOutputKind -import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget -import org.jetbrains.kotlin.konan.util.DependencyDirectories import java.io.File // TODO: It's just temporary tasks used while KN isn't integrated with Big Kotlin compilation infrastructure. @@ -152,6 +148,22 @@ open class KotlinNativeCompile : AbstractCompile() { @Input get() = languageSettings?.enabledLanguageFeatures ?: emptySet() // endregion. + // region DSL for compiler options + private inner class NativeCompilerOpts : KotlinCommonToolOptions { + override var allWarningsAsErrors: Boolean = false + override var suppressWarnings: Boolean = false + override var verbose: Boolean = false + + // Delegate for compilations's exptra options. + override var freeCompilerArgs: List + get() = compilation.extraOpts + set(value) { compilation.extraOpts = value.toMutableList() } + } + + @Internal val kotlinOptions: KotlinCommonToolOptions = NativeCompilerOpts() + + // endregion. + val kotlinNativeVersion: String @Input get() = project.konanVersion.toString() @@ -169,43 +181,56 @@ open class KotlinNativeCompile : AbstractCompile() { @Optional @InputFiles var compilerPluginClasspath: FileCollection? = null - @TaskAction - override fun compile() { - val output = outputFile.get() - output.parentFile.mkdirs() + val serializedCompilerArguments: List + @Internal get() = buildCommonArgs() - val args = mutableListOf().apply { - addArg("-o", outputFile.get().absolutePath) - addKey("-opt", optimized) - addKey("-g", debuggable) - addKey("-ea", debuggable) - addKey("-tr", processTests) + val defaultSerializedCompilerArguments: List + @Internal get() = buildCommonArgs(true) - addArg("-target", target) - addArg("-p", outputKind.name.toLowerCase()) - addArgIfNotNull("-entry", entryPoint) + private fun buildCommonArgs(defaultsOnly: Boolean = false) = mutableListOf().apply { - add("-Xmulti-platform") + add("-Xmulti-platform") - // Language features. - addArgIfNotNull("-language-version", languageVersion) - addArgIfNotNull("-api-version", apiVersion) - addKey("-progressive", progressiveMode) - enabledLanguageFeatures.forEach { featureName -> - add("-XXLanguage:+$featureName") + // Language features. + addArgIfNotNull("-language-version", languageVersion) + addArgIfNotNull("-api-version", apiVersion) + addKey("-progressive", progressiveMode) + enabledLanguageFeatures.forEach { featureName -> + add("-XXLanguage:+$featureName") + } + + // Compiler plugins. + compilerPluginClasspath?.let { pluginClasspath -> + pluginClasspath.map { it.canonicalPath }.sorted().forEach { path -> + add("-Xplugin=$path") } - - // Compiler plugins. - compilerPluginClasspath?.let { pluginClasspath -> - pluginClasspath.map { it.canonicalPath }.sorted().forEach { path -> - add("-Xplugin=$path") - } - compilerPluginOptions.arguments.forEach { - add("-P$it") - } + compilerPluginOptions.arguments.forEach { + add("-P$it") } + } + // kotlin options + addKey("-Werror", kotlinOptions.allWarningsAsErrors) + addKey("-nowarn", kotlinOptions.suppressWarnings) + addKey("-verbose", kotlinOptions.verbose) + + if (!defaultsOnly) { addAll(additionalCompilerOptions) + } + } + + private fun buildArgs(defaultsOnly: Boolean = false) = mutableListOf().apply { + addKey("-opt", optimized) + addKey("-g", debuggable) + addKey("-ea", debuggable) + addKey("-tr", processTests) + + addArg("-target", target) + addArg("-p", outputKind.name.toLowerCase()) + addArgIfNotNull("-entry", entryPoint) + + if (!defaultsOnly) { + addArg("-o", outputFile.get().absolutePath) // Libraries. libraries.files.filter { @@ -215,20 +240,27 @@ open class KotlinNativeCompile : AbstractCompile() { library.parent?.let { addArg("-r", it) } addArg("-l", library.nameWithoutExtension) } - - val friends = friendModule?.files - if (friends != null && friends.isNotEmpty()) { - addArg("-friend-modules", friends.map { it.absolutePath }.joinToString(File.pathSeparator)) - } - - addListArg("-linker-options", linkerOpts) - - // Sources. - addAll(getSource().map { it.absolutePath }) - add("-Xcommon-sources=${commonSources.map { it.absolutePath }.joinToString(separator = ",")}") } - KonanCompilerRunner(project).run(args) + val friends = friendModule?.files + if (friends != null && friends.isNotEmpty()) { + addArg("-friend-modules", friends.map { it.absolutePath }.joinToString(File.pathSeparator)) + } + + addListArg("-linker-options", linkerOpts) + + addAll(buildCommonArgs(defaultsOnly)) + + // Sources. + addAll(getSource().map { it.absolutePath }) + add("-Xcommon-sources=${commonSources.map { it.absolutePath }.joinToString(separator = ",")}") + } + + @TaskAction + override fun compile() { + val output = outputFile.get() + output.parentFile.mkdirs() + KonanCompilerRunner(project).run(buildArgs()) } }