diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt index a677e456d89..7d619661ed8 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt @@ -44,10 +44,7 @@ import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeTestComponent import org.jetbrains.kotlin.gradle.plugin.experimental.internal.* import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.CInteropTask import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile -import org.jetbrains.kotlin.gradle.plugin.konan.KonanPlugin -import org.jetbrains.kotlin.gradle.plugin.konan.hasProperty -import org.jetbrains.kotlin.gradle.plugin.konan.konanCompilerDownloadDir -import org.jetbrains.kotlin.gradle.plugin.konan.setProperty +import org.jetbrains.kotlin.gradle.plugin.konan.* import org.jetbrains.kotlin.gradle.plugin.loadKotlinVersionFromResource import org.jetbrains.kotlin.gradle.plugin.tasks.KonanCompilerDownloadTask import org.jetbrains.kotlin.konan.target.CompilerOutputKind @@ -288,6 +285,7 @@ class KotlinNativeBasePlugin: Plugin { private fun ProjectInternal.addCompilerDownloadingTask(): KonanCompilerDownloadTask { val result = tasks.create(KonanPlugin.KONAN_DOWNLOAD_TASK_NAME, KonanCompilerDownloadTask::class.java) + project.warnAboutDeprecatedProperty(KonanPlugin.ProjectProperty.KONAN_HOME) if (!hasProperty(KonanPlugin.ProjectProperty.KONAN_HOME)) { setProperty(KonanPlugin.ProjectProperty.KONAN_HOME, project.konanCompilerDownloadDir()) setProperty(KonanPlugin.ProjectProperty.DOWNLOAD_COMPILER, true) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt index 3c2ed944be4..5c55d544fc2 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/konan/KonanPlugin.kt @@ -45,14 +45,30 @@ import javax.inject.Inject /** * We use the following properties: - * konan.home - directory where compiler is located (aka dist in konan project output). - * konan.version - a konan compiler version for downloading. - * konan.build.targets - list of targets to build (by default all the declared targets are built). - * konan.jvmArgs - additional args to be passed to a JVM executing the compiler/cinterop tool. + * org.jetbrains.kotlin.native.home - directory where compiler is located (aka dist in konan project output). + * org.jetbrains.kotlin.native.version - a konan compiler version for downloading. + * konan.build.targets - list of targets to build (by default all the declared targets are built). + * konan.jvmArgs - additional args to be passed to a JVM executing the compiler/cinterop tool. */ -internal fun Project.hasProperty(property: KonanPlugin.ProjectProperty) = hasProperty(property.propertyName) -internal fun Project.findProperty(property: KonanPlugin.ProjectProperty): Any? = findProperty(property.propertyName) +internal fun Project.warnAboutDeprecatedProperty(property: KonanPlugin.ProjectProperty) = + property.deprecatedPropertyName?.let { deprecated -> + if (project.hasProperty(deprecated)) { + logger.warn("Project property '$deprecated' is deprecated. Use '${property.propertyName}' instead.") + } + } + +internal fun Project.hasProperty(property: KonanPlugin.ProjectProperty) = with(property) { + when { + hasProperty(propertyName) -> true + deprecatedPropertyName != null && hasProperty(deprecatedPropertyName) -> true + else -> false + } +} + +internal fun Project.findProperty(property: KonanPlugin.ProjectProperty): Any? = with(property) { + return findProperty(propertyName) ?: deprecatedPropertyName?.let { findProperty(it) } +} internal fun Project.getProperty(property: KonanPlugin.ProjectProperty) = findProperty(property) ?: throw IllegalArgumentException("No such property in the project: ${property.propertyName}") @@ -270,8 +286,8 @@ open class KonanSoftwareComponent(val project: ProjectInternal?): SoftwareCompon class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderRegistry) : Plugin { - enum class ProjectProperty(val propertyName: String) { - KONAN_HOME ("konan.home"), + enum class ProjectProperty(val propertyName: String, val deprecatedPropertyName: String? = null) { + KONAN_HOME ("org.jetbrains.kotlin.native.home", "konan.home"), KONAN_VERSION ("org.jetbrains.kotlin.native.version"), KONAN_BUILD_TARGETS ("konan.build.targets"), KONAN_JVM_ARGS ("konan.jvmArgs"), @@ -328,6 +344,8 @@ class KonanPlugin @Inject constructor(private val registry: ToolingModelBuilderR project.logger.warn("feature GRADLE_METADATA is not enabled: publication is disabled") } + project.warnAboutDeprecatedProperty(ProjectProperty.KONAN_HOME) + // Set additional project properties like konan.home, konan.build.targets etc. if (!project.hasProperty(ProjectProperty.KONAN_HOME)) { project.setProperty(ProjectProperty.KONAN_HOME, project.konanCompilerDownloadDir()) diff --git a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy index 9e86bb81e8c..816773d1bf0 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy +++ b/tools/kotlin-native-gradle-plugin/src/test/groovy/org/jetbrains/kotlin/gradle/plugin/test/KonanProject.groovy @@ -214,7 +214,7 @@ class KonanProject { /** Generates gradle.properties file with the konan.home and konan.jvmArgs properties set. */ File generatePropertiesFile(String konanHome, String konanJvmArgs = System.getProperty("konan.jvmArgs") ?: "") { propertiesFile = createFile(projectPath, "gradle.properties", """\ - konan.home=$konanHome + org.jetbrains.kotlin.native.home=$konanHome ${!konanJvmArgs.isEmpty() ? "konan.jvmArgs=$konanJvmArgs\n" : ""} """.stripIndent()) return propertiesFile diff --git a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt index 636f000f7f1..3ce104dfbf7 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt +++ b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ExperimentalPluginTests.kt @@ -1019,7 +1019,21 @@ class ExperimentalPluginTests { "-i" ).build() assertTrue(result.output.contains( - "Downloading Kotlin/Native compiler from.*kotlin-native-${HostManager.simpleOsName()}-0.9.3".toRegex()) - ) + "Downloading Kotlin/Native compiler from.*kotlin-native-${HostManager.simpleOsName()}-0.9.3".toRegex() + )) + } + + @Test + fun `Plugin should show warning if deprecated properties are used`() { + val project = KonanProject.createEmpty(projectDirectory).apply { + buildFile.writeText("plugins { id 'kotlin-native' }") + val properties = propertiesFile.readText().replace("org.jetbrains.kotlin.native.home", "konan.home") + propertiesFile.writeText(properties) + } + + val result = project.createRunner().withArguments("tasks").build() + assertTrue(result.output.contains( + "Project property 'konan.home' is deprecated. Use 'org.jetbrains.kotlin.native.home' instead." + )) } } diff --git a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ToolingModelTests.kt b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ToolingModelTests.kt index 68a0f91ad6b..d458285bce6 100644 --- a/tools/kotlin-native-gradle-plugin/src/test/kotlin/ToolingModelTests.kt +++ b/tools/kotlin-native-gradle-plugin/src/test/kotlin/ToolingModelTests.kt @@ -153,7 +153,7 @@ open class ToolingModelTests { dependsOn('compileKonanBaz') doLast { def model = KonanToolingModelBuilder.INSTANCE.buildAll("KonanModel", project) - assertEquals(model.konanHome, file(project.getProperty('konan.home'))) + assertEquals(model.konanHome, file(project.getProperty('org.jetbrains.kotlin.native.home'))) assertEquals(model.konanVersion.toString(), "$konanVersion") assertEquals(model.languageVersion, "1.2")