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
This commit is contained in:
+14
@@ -4,6 +4,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.jetbrains.kotlin.gradle
|
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.internals.GRADLE_NO_METADATA_WARNING
|
||||||
import org.jetbrains.kotlin.gradle.plugin.ProjectLocalConfigurations
|
import org.jetbrains.kotlin.gradle.plugin.ProjectLocalConfigurations
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmWithJavaTargetPreset
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+4
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.gradle.plugin
|
|||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.dsl.Coroutines
|
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.AbstractKotlinCompile
|
||||||
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
||||||
@@ -92,6 +93,9 @@ internal class PropertiesProvider(private val project: Project) {
|
|||||||
val enableGranularSourceSetsMetadata: Boolean?
|
val enableGranularSourceSetsMetadata: Boolean?
|
||||||
get() = booleanProperty("kotlin.mpp.enableGranularSourceSetsMetadata")
|
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.
|
* Enables parallel tasks execution within a project with Workers API.
|
||||||
* Does not enable using actual worker proccesses
|
* Does not enable using actual worker proccesses
|
||||||
|
|||||||
+74
@@ -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<KonanTarget>) {
|
||||||
|
val disabledTargetsList = getOrRegisterDisabledTargets(project)
|
||||||
|
disabledTargetsList.add(DisabledTarget(project, target, supportedHosts))
|
||||||
|
}
|
||||||
|
|
||||||
|
private data class DisabledTarget(val project: Project, val target: KotlinNativeTarget, val supportedHosts: Collection<KonanTarget>)
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
private fun getOrRegisterDisabledTargets(project: Project) =
|
||||||
|
project.rootProject.extensions.run {
|
||||||
|
if (findByName(EXTENSION_NAME) == null) {
|
||||||
|
add(EXTENSION_NAME, mutableListOf<DisabledTarget>())
|
||||||
|
printWarningWhenTaskGraphIsReady(project)
|
||||||
|
}
|
||||||
|
getByName(EXTENSION_NAME)
|
||||||
|
} as MutableList<DisabledTarget>
|
||||||
|
|
||||||
|
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<DisabledTarget>()
|
||||||
|
.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.")
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-8
@@ -89,14 +89,7 @@ class KotlinNativeTargetPreset(
|
|||||||
if (!konanTarget.enabledOnCurrentHost) {
|
if (!konanTarget.enabledOnCurrentHost) {
|
||||||
with(HostManager()) {
|
with(HostManager()) {
|
||||||
val supportedHosts = enabledByHost.filterValues { konanTarget in it }.keys
|
val supportedHosts = enabledByHost.filterValues { konanTarget in it }.keys
|
||||||
val supportedHostsString =
|
DisabledNativeTargetsReporter.reportDisabledTarget(project, result, supportedHosts)
|
||||||
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."
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+8
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.internals
|
package org.jetbrains.kotlin.gradle.internals
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.mpp.DisabledNativeTargetsReporter
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinProjectStructureMetadata
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinProjectStructureMetadata
|
||||||
import org.w3c.dom.Document
|
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
|
org.jetbrains.kotlin.gradle.plugin.mpp.MULTIPLATFORM_PROJECT_METADATA_FILE_NAME
|
||||||
|
|
||||||
const val GRADLE_NO_METADATA_WARNING =
|
const val GRADLE_NO_METADATA_WARNING =
|
||||||
org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.GRADLE_NO_METADATA_WARNING
|
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
|
||||||
Reference in New Issue
Block a user