From 48d8f5eb39145e53d0601974c298304dd9f311e1 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 5 Sep 2018 20:27:48 +0700 Subject: [PATCH] Add libraries provided by the K/N compiler in dependencies --- .../gradle/plugin/mpp/kotlinTargetPresets.kt | 24 +++++++++++++++++- .../kotlin/gradle/tasks/KotlinNativeTasks.kt | 25 +++++++++++++------ 2 files changed, 40 insertions(+), 9 deletions(-) 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 15cc85794d9..f4afb01cf0b 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 @@ -6,12 +6,14 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Project +import org.gradle.api.file.FileCollection import org.gradle.api.internal.file.FileResolver import org.gradle.api.plugins.JavaPlugin import org.gradle.internal.cleanup.BuildOutputCleanupRegistry import org.gradle.internal.reflect.Instantiator import org.jetbrains.kotlin.compilerRunner.KotlinNativeProjectProperty import org.jetbrains.kotlin.compilerRunner.hasProperty +import org.jetbrains.kotlin.compilerRunner.konanHome import org.jetbrains.kotlin.compilerRunner.setProperty import org.jetbrains.kotlin.gradle.dsl.KotlinCompile import org.jetbrains.kotlin.gradle.dsl.kotlinExtension @@ -250,7 +252,19 @@ class KotlinNativeTargetPreset( tasks.maybeCreate(KONAN_DOWNLOAD_TASK_NAME, KonanCompilerDownloadTask::class.java) } + private fun stdlib(target: KonanTarget): FileCollection = with(project) { + files("${konanHome}/klib/common/stdlib").builtBy(createCompilerDownloadingTask()) + } + + private fun platformLibs(target: KonanTarget): FileCollection = with(project) { + files(provider { + file("${project.konanHome}/klib/platform/${target.name}").listFiles { file -> file.isDirectory } ?: emptyArray() + }) + } + override fun createTarget(name: String): KotlinNativeTarget { + createCompilerDownloadingTask() + val result = KotlinNativeTarget(project, konanTarget).apply { targetName = name disambiguationClassifier = name @@ -259,8 +273,16 @@ class KotlinNativeTargetPreset( compilations = project.container(compilationFactory.itemClass, compilationFactory) } - createCompilerDownloadingTask() KotlinNativeTargetConfigurator(buildOutputCleanupRegistry).configureTarget(result) + + // Allow IDE to resolve the libraries provided by the compiler by adding them into dependencies. + result.compilations.all { + val target = it.target.konanTarget + it.dependencies { + implementation(stdlib(target)) + implementation(platformLibs(target)) + } + } return result } } 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 4e8d8febe28..ebb8f6f19bb 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 @@ -40,9 +40,7 @@ open class KotlinNativeCompile : DefaultTask() { get() = compilation.allSources val libraries: FileCollection - @InputFiles get() = compilation.compileDependencyFiles.filter { - it.extension == "klib" - } + @InputFiles get() = compilation.compileDependencyFiles @Input var optimized = false @@ -58,6 +56,12 @@ open class KotlinNativeCompile : DefaultTask() { val additionalCompilerOptions: Collection @Input get() = compilation.extraOpts + val kotlinNativeVersion: String + @Input get() = KonanCompilerDownloadTask.compilerVersion.toString() + + val kotlinNativeHome: File + @Input get() = project.file(project.konanHome) + // We manually register this property as output file or directory depending on output kind. @Internal val outputFile: Property = project.objects.property(File::class.java) @@ -107,6 +111,9 @@ open class KotlinNativeCompile : DefaultTask() { } // endregion + private val File.providedByCompiler: Boolean + get() = toPath().startsWith(project.file(project.konanHome).toPath()) + @TaskAction fun compile() { val output = outputFile.get() @@ -126,7 +133,10 @@ open class KotlinNativeCompile : DefaultTask() { addAll(additionalCompilerOptions) - libraries.files.forEach { library -> + libraries.files.filter { + // Support only klib files for now. + it.extension == "klib" && !it.providedByCompiler + }.forEach { library -> library.parent?.let { addArg("-r", it) } addArg("-l", library.nameWithoutExtension) } @@ -212,24 +222,23 @@ open class KonanCompilerDownloadTask : DefaultTask() { val archive = configuration.files.single() logger.info("Use Kotlin/Native compiler archive: ${archive.absolutePath}") - logger.lifecycle("Unpack Kotlin/Native compiler (version $versionString)...") + logger.lifecycle("Unpacking Kotlin/Native compiler (version $versionString)...") project.copy { it.from(archiveFileTree(archive)) it.into(DependencyDirectories.localKonanDir) } removeRepo(repo) - } - @TaskAction fun checkCompiler() { if (!project.hasProperty(KotlinNativeProjectProperty.DOWNLOAD_COMPILER)) { val konanHome = project.getProperty(KotlinNativeProjectProperty.KONAN_HOME) logger.info("Use a user-defined compiler path: $konanHome") } else { - if (!compilerDirectory.exists()) { + // TODO: Move Kotlin/Native Distribution class in the Big Kotlin repo and use it here. + if (KonanCompilerRunner(project).classpath.isEmpty) { downloadAndExtract() } logger.info("Use Kotlin/Native distribution: $compilerDirectory")