From c292380aff136a8dff856b719187b528d254c147 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 8 Jul 2019 21:02:27 +0300 Subject: [PATCH] Improve Kotlin/Native disabled targets warning, KT-29693 * Group all disabled targets from all subprojects in a single warning * Make the warning optional, suggest disabling it with a Gradle property Issue #KT-29693 Fixed --- .../kotlin/gradle/NewMultiplatformIT.kt | 14 ++++ .../kotlin/gradle/plugin/KotlinProperties.kt | 4 + .../native/DisabledNativeTargetsReporter.kt | 74 +++++++++++++++++++ .../native/KotlinNativeTargetPreset.kt | 9 +-- .../internals/ExposedForIntegrationTests.kt | 9 ++- 5 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisabledNativeTargetsReporter.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 66100f80493..e34bb622e47 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -4,6 +4,8 @@ */ package org.jetbrains.kotlin.gradle +import org.jetbrains.kotlin.gradle.internals.DISABLED_NATIVE_TARGETS_REPORTER_DISABLE_WARNING_PROPERTY_NAME +import org.jetbrains.kotlin.gradle.internals.DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX import org.jetbrains.kotlin.gradle.internals.GRADLE_NO_METADATA_WARNING import org.jetbrains.kotlin.gradle.plugin.ProjectLocalConfigurations import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmWithJavaTargetPreset @@ -1894,4 +1896,16 @@ class NewMultiplatformIT : BaseGradleIT() { } } } + + @Test + fun testIgnoreDisabledNativeTargets() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) { + build { + assertSuccessful() + assertEquals(1, output.lines().count { DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX in it }) + } + build("-P$DISABLED_NATIVE_TARGETS_REPORTER_DISABLE_WARNING_PROPERTY_NAME=true") { + assertSuccessful() + assertNotContains(DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX) + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 56b47be0cfa..bc2c2962fef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.Coroutines +import org.jetbrains.kotlin.gradle.plugin.mpp.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -92,6 +93,9 @@ internal class PropertiesProvider(private val project: Project) { val enableGranularSourceSetsMetadata: Boolean? get() = booleanProperty("kotlin.mpp.enableGranularSourceSetsMetadata") + val ignoreDisabledNativeTargets: Boolean? + get() = booleanProperty(DisabledNativeTargetsReporter.DISABLE_WARNING_PROPERTY_NAME) + /** * Enables parallel tasks execution within a project with Workers API. * Does not enable using actual worker proccesses diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisabledNativeTargetsReporter.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisabledNativeTargetsReporter.kt new file mode 100644 index 00000000000..f0d4e7f5f17 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/DisabledNativeTargetsReporter.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.mpp + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider +import org.jetbrains.kotlin.konan.target.HostManager +import org.jetbrains.kotlin.konan.target.KonanTarget + +internal object DisabledNativeTargetsReporter { + private const val EXTENSION_NAME = "org.jetbrains.kotlin.native.disabledTargets" + + internal const val WARNING_PREFIX = "Some Kotlin/Native targets cannot be built on this " + + internal const val DISABLE_WARNING_PROPERTY_NAME = "kotlin.native.ignoreDisabledTargets" + + fun reportDisabledTarget(project: Project, target: KotlinNativeTarget, supportedHosts: Collection) { + val disabledTargetsList = getOrRegisterDisabledTargets(project) + disabledTargetsList.add(DisabledTarget(project, target, supportedHosts)) + } + + private data class DisabledTarget(val project: Project, val target: KotlinNativeTarget, val supportedHosts: Collection) + + @Suppress("UNCHECKED_CAST") + private fun getOrRegisterDisabledTargets(project: Project) = + project.rootProject.extensions.run { + if (findByName(EXTENSION_NAME) == null) { + add(EXTENSION_NAME, mutableListOf()) + printWarningWhenTaskGraphIsReady(project) + } + getByName(EXTENSION_NAME) + } as MutableList + + private fun printWarningWhenTaskGraphIsReady(project: Project) { + project.gradle.taskGraph.whenReady { + if (PropertiesProvider(project).ignoreDisabledNativeTargets == true) { + return@whenReady + } + + val disabledTargetsList = getOrRegisterDisabledTargets(project) + + @Suppress("UselessCallOnCollection") // filterIsInstance helps against potential class loaders conflict or misconfiguration + val disabledTargetGroups = disabledTargetsList + .filterIsInstance() + .groupBy { it.project } + .mapValues { (_, disabledTargetsInProject) -> disabledTargetsInProject.groupBy { it.supportedHosts } } + .toSortedMap(compareBy { it.path }) + + project.logger.warn(buildString { + appendln("\n$WARNING_PREFIX${HostManager.host} machine and are disabled:") + + disabledTargetGroups.forEach { (targetProject, targetsBySupportedHosts) -> + appendln( + " * In project '${targetProject.path}':" + ) + targetsBySupportedHosts.forEach { (supportedHosts, disabledTargets) -> + append(" * target" + "s".takeIf { disabledTargets.size > 1 }.orEmpty() + " ") + append(disabledTargets.joinToString { "'${it.target.name}'" }) + + val supportedHostsString = when (supportedHosts.size) { + 1 -> "a ${supportedHosts.single()} host" + else -> "one of the hosts: ${supportedHosts.joinToString(", ")}" + } + appendln(" (can be built with $supportedHostsString)") + } + } + appendln("To hide this message, add '$DISABLE_WARNING_PROPERTY_NAME=true' to the Gradle properties.") + }) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt index 96692382b0d..c530208ef6f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetPreset.kt @@ -89,14 +89,7 @@ class KotlinNativeTargetPreset( if (!konanTarget.enabledOnCurrentHost) { with(HostManager()) { val supportedHosts = enabledByHost.filterValues { konanTarget in it }.keys - val supportedHostsString = - if (supportedHosts.size == 1) - "a ${supportedHosts.single()} host" else - "one of the host platforms: ${supportedHosts.joinToString(", ")}" - project.logger.warn( - "Target '$name' for platform ${konanTarget} is ignored during build on this ${HostManager.host} machine. " + - "You can build it with $supportedHostsString." - ) + DisabledNativeTargetsReporter.reportDisabledTarget(project, result, supportedHosts) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt index c1242e83c8c..06625097a9e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internals/ExposedForIntegrationTests.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.internals +import org.jetbrains.kotlin.gradle.plugin.mpp.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinProjectStructureMetadata import org.w3c.dom.Document @@ -15,4 +16,10 @@ const val MULTIPLATFORM_PROJECT_METADATA_FILE_NAME = org.jetbrains.kotlin.gradle.plugin.mpp.MULTIPLATFORM_PROJECT_METADATA_FILE_NAME const val GRADLE_NO_METADATA_WARNING = - org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.GRADLE_NO_METADATA_WARNING \ No newline at end of file + org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.GRADLE_NO_METADATA_WARNING + +const val DISABLED_NATIVE_TARGETS_REPORTER_DISABLE_WARNING_PROPERTY_NAME = + DisabledNativeTargetsReporter.DISABLE_WARNING_PROPERTY_NAME + +const val DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX: String = + DisabledNativeTargetsReporter.WARNING_PREFIX \ No newline at end of file