diff --git a/GRADLE_PLUGIN.md b/GRADLE_PLUGIN.md index 3ea8a6c4f6f..34a2ed3770a 100644 --- a/GRADLE_PLUGIN.md +++ b/GRADLE_PLUGIN.md @@ -26,8 +26,13 @@ The Kotlin/Native plugin depends on `org.jetbrains.kotlin:kotlin-gradle-plugin`. plugins as buildscript dependencies, it's recommended to **declare them in the same `build.gradle`** to avoid issues with plugin classpath. +The plugin downloads the compiler during its first run. You may specify a version of the compiler using `konan.version` +project property: + + konan.version=0.3 + If you already downloaded the compiler manually you may specify the path to its root directory using `konan.home` -project property (e.g. in `gradle.properties`). +project property (e.g. in `gradle.properties`). Note: the plugin ignores the `konan.version` property in this case. konan.home=/home/user/kotlin-native-0.5 diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index b72335ea142..3a550d97dda 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -31,7 +31,6 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.config.addKotlinSourceRoots import org.jetbrains.kotlin.config.kotlinSourceRoots -import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.psi.KtFile diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/MetaVersion.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanVersion.kt similarity index 66% rename from shared/src/main/kotlin/org/jetbrains/kotlin/konan/MetaVersion.kt rename to backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanVersion.kt index 8d9246349a2..73c33132785 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/MetaVersion.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanVersion.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.jetbrains.kotlin.konan +package org.jetbrains.kotlin.backend.konan /** * https://en.wikipedia.org/wiki/Software_versioning @@ -22,9 +22,15 @@ package org.jetbrains.kotlin.konan */ enum class MetaVersion { - DEV, EAP, ALPHA, BETA, RC -} \ No newline at end of file +} + +class KonanVersion(val meta: MetaVersion?, val major: Int, val minor: Int, val maintenance: Int, val build:Int) { + companion object { + val CURRENT = KonanVersion(MetaVersion.EAP, 0, 6, 2, 0) + } + override fun toString() = if (meta != null) "$meta $major.$minor.$maintenance.$build" else "$major.$minor.$maintenance.$build" +} diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt index 0049dced668..566931c3549 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/llvm/DebugUtils.kt @@ -20,7 +20,7 @@ import kotlinx.cinterop.allocArrayOf import kotlinx.cinterop.memScoped import llvm.* import org.jetbrains.kotlin.backend.konan.Context -import org.jetbrains.kotlin.konan.KonanVersion +import org.jetbrains.kotlin.backend.konan.KonanVersion import org.jetbrains.kotlin.backend.konan.irasdescriptors.FunctionDescriptor import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.ir.SourceManager.FileEntry diff --git a/buildSrc/shared/build.gradle b/buildSrc/shared/build.gradle index 1c91b22068c..ee04469f324 100644 --- a/buildSrc/shared/build.gradle +++ b/buildSrc/shared/build.gradle @@ -27,7 +27,7 @@ buildscript { apply plugin: 'kotlin' // We reuse the source code from the Project in buildSrc. -sourceSets.main.kotlin.srcDirs = ["$projectDir/../../shared/src/main/kotlin"] +sourceSets.main.kotlin.srcDirs = ["$projectDir/../../shared"] dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$buildKotlinVersion" diff --git a/gradle.properties b/gradle.properties index 90c16abce8a..ccb2e1ca7b5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,6 +22,6 @@ remoteRoot=konan_tests testDataVersion=1226829:id kotlinCompilerRepo=https://teamcity.jetbrains.com/guestAuth/app/rest/builds/buildType:(id:Kotlin_dev_CompilerAllPlugins),number:1.2.50-dev-515,tag:kotlin-native,pinned:true/artifacts/content/maven kotlinVersion=1.2.50-dev-515 -konanVersion=0.7 +konanVersion=0.6.2 org.gradle.jvmargs='-Dfile.encoding=UTF-8' diff --git a/shared/build.gradle b/shared/build.gradle index 66bbb345c55..93831aad4d3 100644 --- a/shared/build.gradle +++ b/shared/build.gradle @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import org.jetbrains.kotlin.VersionGenerator buildscript { - ext.rootBuildDirectory = file('..') + ext.rootBuildDirectory = file('../') apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle" apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle" @@ -34,19 +33,6 @@ repositories { } } -task generateCompilerVersion(type: VersionGenerator){} - -sourceSets { - main.kotlin { - srcDir 'src/main/kotlin' - srcDir generateCompilerVersion.versionSourceDirectory - } -} - -compileKotlin{ - dependsOn('generateCompilerVersion') -} - jar { archiveName = "shared.jar" } diff --git a/shared/buildSrc/build.gradle b/shared/buildSrc/build.gradle deleted file mode 100644 index 0e9a8ff4d33..00000000000 --- a/shared/buildSrc/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2010-2017 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -buildscript { - println("rootDir: $rootDir") - ext.rootBuildDirectory = "$rootDir/../.." - apply from: "$rootBuildDirectory/gradle/loadRootProperties.gradle" - apply from: "$rootBuildDirectory/gradle/kotlinGradlePlugin.gradle" - -} - - -apply plugin: 'kotlin' - -repositories { - mavenCentral() -} - -dependencies { - compile gradleApi() - compile localGroovy() - compile "org.jetbrains.kotlin:kotlin-stdlib:$buildKotlinVersion" -} \ No newline at end of file diff --git a/shared/buildSrc/src/main/kotlin/org/jetbrains/kotlin/VersionGenerator.kt b/shared/buildSrc/src/main/kotlin/org/jetbrains/kotlin/VersionGenerator.kt deleted file mode 100644 index 132c6a91313..00000000000 --- a/shared/buildSrc/src/main/kotlin/org/jetbrains/kotlin/VersionGenerator.kt +++ /dev/null @@ -1,55 +0,0 @@ -package org.jetbrains.kotlin - -import groovy.lang.Closure -import org.gradle.api.DefaultTask -import org.gradle.api.Task -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.OutputFile -import java.io.File - - -open class VersionGenerator: DefaultTask() { - @OutputDirectory - val versionSourceDirectory = project.file("build/generated") - @OutputFile - val versionFile:File = project.file("${versionSourceDirectory.path}/org/jetbrains/kotlin/konan/KonanVersion.kt") - - - override fun configure(closure: Closure<*>): Task { - val result = super.configure(closure) - doFirst { - val content = buildString { - operator fun String.unaryPlus() = this@buildString.append(this) - val version = project.properties["konanVersion"].toString().split(".") - val major = version[0].toInt() - val minor = version[1].toInt() - val maintenance = if (version.size > 2) version[2].toInt() else 0 - val build = System.getenv("env.dep.Kotlin_KotlinNative_Master_KotlinNativeCheckout.build.counter")?.let { - it.split("-")[2].toInt() //7-dev-buildcount - }?: -1 - val meta = project.properties["konanMetaVersion"]?.let { "MetaVersion.${it.toString().toUpperCase()}" } ?: "MetaVersion.DEV" - - + """ - |package org.jetbrains.kotlin.konan - |data class KonanVersion(val meta: MetaVersion = MetaVersion.DEV, - | val major: Int, - | val minor: Int, - | val maintenance: Int, - | val build:Int) { - | companion object { - | val CURRENT = KonanVersion($meta, $major, $minor, $maintenance, $build) - | } - | private val versionString by lazy { - | "${'$'}{meta.name} ${'$'}major.${'$'}minor.${'$'}maintenance-${'$'}build".trim() - | } - | override fun toString() = versionString - |} - """.trimMargin() - } - versionFile.printWriter().use { - it.println(content) - } - } - return result - } -} diff --git a/tools/kotlin-native-gradle-plugin/build.gradle b/tools/kotlin-native-gradle-plugin/build.gradle index d351a896b50..3f120802ed6 100644 --- a/tools/kotlin-native-gradle-plugin/build.gradle +++ b/tools/kotlin-native-gradle-plugin/build.gradle @@ -122,6 +122,8 @@ test { processResources { // We add konanVersion as a task input to avoid considering this task up-to-date when // konanVersion is actually changed and should be updated in the plugin jar. + inputs.property("konanVersion", konanVersion) + expand('konanVersion': konanVersion) from(file("$rootBuildDirectory/utilities/env_blacklist")) } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt index 507b2210bd4..0e360971930 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanPlugin.kt @@ -37,7 +37,6 @@ import org.gradle.language.nativeplatform.internal.Names import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry import org.jetbrains.kotlin.gradle.plugin.KonanPlugin.Companion.COMPILE_ALL_TASK_NAME import org.jetbrains.kotlin.gradle.plugin.tasks.* -import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.customerDistribution @@ -111,6 +110,9 @@ internal val Project.konanExtension: KonanExtension internal val Project.konanCompilerDownloadTask get() = tasks.getByName(KonanPlugin.KONAN_DOWNLOAD_TASK_NAME) +internal val Project.konanVersion + get() = getProperty(KonanPlugin.ProjectProperty.KONAN_VERSION, KonanPlugin.DEFAULT_KONAN_VERSION) as String + internal val Project.requestedTargets get() = findProperty(KonanPlugin.ProjectProperty.KONAN_BUILD_TARGETS)?.let { it.toString().trim().split("\\s+".toRegex()) @@ -139,7 +141,7 @@ private fun Project.getOrCreateTask(name: String): Task = with(tasks) { } internal fun Project.konanCompilerName(): String = - "kotlin-native-${project.simpleOsName}-${KonanVersion.CURRENT}" + "kotlin-native-${project.simpleOsName}-${this.konanVersion}" internal fun Project.konanCompilerDownloadDir(): String = DependencyProcessor.localKonanDir.resolve(project.konanCompilerName()).absolutePath @@ -216,7 +218,7 @@ internal fun dumpProperties(task: Task) { println("target : $target") println("languageVersion : $languageVersion") println("apiVersion : $apiVersion") - println("konanVersion : ${KonanVersion.CURRENT}") + println("konanVersion : $konanVersion") println("konanHome : $konanHome") println() } @@ -237,7 +239,7 @@ internal fun dumpProperties(task: Task) { println("linkerOpts : $linkerOpts") println("headers : ${headers.dump()}") println("linkFiles : ${linkFiles.dump()}") - println("konanVersion : ${KonanVersion.CURRENT}") + println("konanVersion : $konanVersion") println("konanHome : $konanHome") println() } @@ -271,6 +273,7 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR enum class ProjectProperty(val propertyName: String) { KONAN_HOME ("konan.home"), + KONAN_VERSION ("konan.version"), KONAN_BUILD_TARGETS ("konan.build.targets"), KONAN_JVM_ARGS ("konan.jvmArgs"), KONAN_USE_ENVIRONMENT_VARIABLES("konan.useEnvironmentVariables"), @@ -291,6 +294,11 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR internal const val KONAN_MAIN_VARIANT = "konan_main_variant" internal const val KONAN_EXTENSION_NAME = "konan" + + internal val DEFAULT_KONAN_VERSION = Properties().apply { + load(KonanPlugin::class.java.getResourceAsStream("/META-INF/gradle-plugins/konan.properties") ?: + throw RuntimeException("Cannot find a properties file")) + }.getProperty("default-konan-version") ?: throw RuntimeException("Cannot read the default compiler version") } private fun Project.cleanKonan() = project.tasks.withType(KonanBuildingTask::class.java).forEach { diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolingModelBuilder.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolingModelBuilder.kt index 815327851eb..35a2f648d6d 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolingModelBuilder.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KonanToolingModelBuilder.kt @@ -20,7 +20,6 @@ import org.gradle.api.Project import org.gradle.tooling.provider.model.ToolingModelBuilder import org.jetbrains.kotlin.gradle.plugin.model.KonanArtifact import org.jetbrains.kotlin.gradle.plugin.model.KonanModel -import org.jetbrains.kotlin.konan.KonanVersion import org.jetbrains.kotlin.konan.util.visibleName object KonanToolingModelBuilder : ToolingModelBuilder { @@ -30,11 +29,12 @@ object KonanToolingModelBuilder : ToolingModelBuilder { val artifacts = project.konanArtifactsContainer.flatten() .toList() .map { KonanArtifactImpl("${it.artifact.name}-${it.konanTarget.visibleName}", it.artifact.canonicalPath) } - return KonanModelImpl(artifacts) + return KonanModelImpl(project.konanVersion, artifacts) } } private class KonanModelImpl( + override val konanVersion: String, override val artifacts: List ) : KonanModel diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/model/KonanModel.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/model/KonanModel.kt index b31a870cb3c..18509a7ece9 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/model/KonanModel.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/model/KonanModel.kt @@ -23,6 +23,7 @@ import java.io.Serializable * This model is shared with the client processes such as an IDE. */ interface KonanModel : Serializable { + val konanVersion: String val artifacts: List } diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt index 2953e00e10b..2e48e5a5e97 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanBuildingTask.kt @@ -39,6 +39,8 @@ abstract class KonanBuildingTask: KonanArtifactWithLibrariesTask(), KonanBuildin @Input val extraOpts = mutableListOf() + val konanVersion + @Input get() = project.konanVersion val konanHome @Input get() = project.konanHome diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompilerDownloadTask.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompilerDownloadTask.kt index da3e095002b..2b833317644 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompilerDownloadTask.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/tasks/KonanCompilerDownloadTask.kt @@ -21,8 +21,6 @@ import org.gradle.api.GradleScriptException import org.gradle.api.tasks.Internal import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.konan.KonanVersion -import org.jetbrains.kotlin.konan.MetaVersion import org.jetbrains.kotlin.konan.util.DependencyProcessor import org.jetbrains.kotlin.konan.util.DependencySource import org.jetbrains.kotlin.konan.util.visibleName @@ -45,15 +43,18 @@ open class KonanCompilerDownloadTask : DefaultTask() { if (!project.hasProperty(KonanPlugin.ProjectProperty.DOWNLOAD_COMPILER)) { val konanHome = project.getProperty(KonanPlugin.ProjectProperty.KONAN_HOME) logger.info("Use a user-defined compiler path: $konanHome") + if (project.hasProperty(KonanPlugin.ProjectProperty.KONAN_VERSION)) { + val konanVersion = project.getProperty(KonanPlugin.ProjectProperty.KONAN_VERSION) + logger.warn("${KonanPlugin.ProjectProperty.KONAN_VERSION.propertyName} " + + "(=$konanVersion) property is ignored " + + "because a user-defined compiler path is specified: $konanHome") + } } else { try { val downloadUrlDirectory = buildString { append("$BASE_DOWNLOAD_URL/") - val version = KonanVersion.CURRENT - when (version.meta) { - MetaVersion.DEV -> append("dev/") - else -> append("releases/") - } + val version = project.konanVersion + append(if (version.contains("dev")) "dev/" else "releases/") append("$version/") append(project.simpleOsName) } diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy index 50ab9d0f3d5..81f5aebe48b 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/IncrementalSpecification.groovy @@ -274,6 +274,20 @@ class IncrementalSpecification extends BaseKonanSpecification { recompilationAndInteropProcessingHappened(*results) } + def 'konan version change should cause recompilation and interop reprocessing'() { + when: + def project = KonanProject.createWithInterop(projectDirectory, ArtifactType.LIBRARY) { KonanProject it -> + it.propertiesFile.append("konan.version=0.3\n") + } + def results = buildTwice(project) { KonanProject it -> + def newText = it.propertiesFile.text.replace('konan.version=0.3', 'konan.version=0.4') + it.propertiesFile.write(newText) + } + + then: + recompilationAndInteropProcessingHappened(*results) + } + def 'Common source change should cause recompilation'() { when: File commonSource