[Gradle] Migrate reporting of K/N targets disabled on current host

This commit is contained in:
Dmitry Savvinov
2023-04-19 19:03:38 +02:00
parent 5a9aa43aa5
commit 5658991fe3
8 changed files with 50 additions and 75 deletions
@@ -11,8 +11,7 @@ import org.gradle.api.logging.configuration.WarningMode
import org.gradle.util.GradleVersion
import org.jdom.input.SAXBuilder
import 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.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS_PROPERTY
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind
import org.jetbrains.kotlin.gradle.testbase.*
@@ -949,11 +948,11 @@ class GeneralNativeIT : BaseGradleIT() {
hostHaveUnsupportedTarget()
build {
assertSuccessful()
assertEquals(1, output.lines().count { DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX in it })
assertHasDiagnostic(KotlinToolingDiagnostics.DisabledKotlinNativeTargets)
}
build("-P$DISABLED_NATIVE_TARGETS_REPORTER_DISABLE_WARNING_PROPERTY_NAME=true") {
build("-P$KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS_PROPERTY=true") {
assertSuccessful()
assertNotContains(DISABLED_NATIVE_TARGETS_REPORTER_WARNING_PREFIX)
assertNoDiagnostic(KotlinToolingDiagnostics.DisabledKotlinNativeTargets)
}
}
@@ -40,6 +40,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLI
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_KGP_DEPENDENCY_RESOLUTION
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_MPP_IMPORT_ENABLE_SLOW_SOURCES_JAR_RESOLVER
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_DEPENDENCY_PROPAGATION
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_USE_XCODE_MESSAGE_STYLE
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_RUN_COMPILER_VIA_BUILD_TOOLS_API
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_STDLIB_DEFAULT_DEPENDENCY
@@ -50,7 +51,6 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnosticOncePerBui
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinIrJsGeneratedTSValidationStrategy
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrOutputGranularity
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy
import org.jetbrains.kotlin.gradle.utils.NativeCompilerDownloader
import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -240,7 +240,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
get() = booleanProperty("$jsCompilerProperty.nowarn") ?: false
val ignoreDisabledNativeTargets: Boolean?
get() = booleanProperty(DisabledNativeTargetsReporter.DISABLE_WARNING_PROPERTY_NAME)
get() = booleanProperty(KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS)
val ignoreAbsentAndroidMultiplatformTarget: Boolean
get() = booleanProperty("kotlin.mpp.absentAndroidTarget.nowarn") ?: false
@@ -618,6 +618,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
const val KOTLIN_INTERNAL_VERBOSE_DIAGNOSTICS = "kotlin.internal.verboseDiagnostics"
const val KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS = "kotlin.suppressGradlePluginWarnings"
const val KOTLIN_SUPPRESS_GRADLE_PLUGIN_ERRORS = "kotlin.internal.suppressGradlePluginErrors"
const val KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS = "kotlin.native.ignoreDisabledTargets"
}
companion object {
@@ -102,7 +102,8 @@ internal interface KotlinGradleProjectChecker {
TargetsWithAmbiguousConsumableConfigurationsChecker,
AndroidPluginWithoutAndroidTargetChecker,
NoKotlinTargetsDeclaredChecker,
DisabledCinteropCommonizationInHmppProjectChecker
DisabledCinteropCommonizationInHmppProjectChecker,
DisabledNativeTargetsChecker
)
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics
import org.jetbrains.kotlin.gradle.InternalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.*
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV1
import org.jetbrains.kotlin.gradle.plugin.sources.android.multiplatformAndroidSourceSetLayoutV2
@@ -269,4 +270,14 @@ object KotlinToolingDiagnostics {
""".trimIndent()
)
}
object DisabledKotlinNativeTargets : ToolingDiagnosticFactory(WARNING) {
operator fun invoke(disabledTargetNames: Collection<String>): ToolingDiagnostic = build(
"""
The following Kotlin/Native targets cannot be built on this machine and are disabled:
${disabledTargetNames.joinToString()}
To hide this message, add '$KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS=true' to the Gradle properties.
""".trimIndent()
)
}
}
@@ -0,0 +1,28 @@
/*
* Copyright 2010-2023 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.diagnostics.checkers
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost
internal object DisabledNativeTargetsChecker : KotlinGradleProjectChecker {
override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) {
if (multiplatformExtension == null || kotlinPropertiesProvider.ignoreDisabledNativeTargets == true) return
val disabledTargets = multiplatformExtension.awaitTargets()
.filterIsInstance<KotlinNativeTarget>()
.filter { !it.konanTarget.enabledOnCurrentHost }
.map { it.name }
if (disabledTargets.isNotEmpty()) {
collector.reportOncePerGradleProject(project, KotlinToolingDiagnostics.DisabledKotlinNativeTargets(disabledTargets))
}
}
}
@@ -26,57 +26,3 @@ internal abstract class AggregateReporter {
protected abstract fun printWarning(project: Project)
}
internal object DisabledNativeTargetsReporter : AggregateReporter() {
private const val EXTRA_PROPERTY_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>)
private fun getOrRegisterDisabledTargets(project: Project) =
getOrRegisterData<DisabledTarget>(project, EXTRA_PROPERTY_NAME)
override fun printWarning(project: Project) {
if (PropertiesProvider(project).ignoreDisabledNativeTargets == true) {
return
}
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 {
appendLine("\n$WARNING_PREFIX${HostManager.host} machine and are disabled:")
disabledTargetGroups.forEach { (targetProject, targetsBySupportedHosts) ->
appendLine(
" * 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(", ")}"
}
appendLine(" (can be built with $supportedHostsString)")
}
}
appendLine("To hide this message, add '$DISABLE_WARNING_PROPERTY_NAME=true' to the Gradle properties.")
})
}
}
@@ -11,8 +11,6 @@ package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
import org.jetbrains.kotlin.gradle.targets.native.internal.*
import org.jetbrains.kotlin.gradle.utils.SingleActionPerProject
import org.jetbrains.kotlin.gradle.utils.setupNativeCompiler
@@ -66,13 +64,6 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
project.setupCInteropPropagatedDependencies()
}
if (!konanTarget.enabledOnCurrentHost) {
with(HostManager()) {
val supportedHosts = enabledByHost.filterValues { konanTarget in it }.keys
DisabledNativeTargetsReporter.reportDisabledTarget(project, result, supportedHosts)
}
}
return result
}
@@ -5,18 +5,16 @@
package org.jetbrains.kotlin.gradle.internals
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.PropertyNames.KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS
import org.jetbrains.kotlin.gradle.plugin.diagnostics.DIAGNOSTIC_SEPARATOR
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinProjectStructureMetadata
import org.jetbrains.kotlin.gradle.plugin.mpp.MULTIPLATFORM_PROJECT_METADATA_JSON_FILE_NAME
import org.jetbrains.kotlin.gradle.plugin.mpp.parseKotlinSourceSetMetadataFromJson
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
fun parseKotlinSourceSetMetadataFromJson(json: String): KotlinProjectStructureMetadata = parseKotlinSourceSetMetadataFromJson(json)
const val MULTIPLATFORM_PROJECT_METADATA_JSON_FILE_NAME = MULTIPLATFORM_PROJECT_METADATA_JSON_FILE_NAME
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
const val KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS_PROPERTY = KOTLIN_NATIVE_IGNORE_DISABLED_TARGETS
const val VERBOSE_DIAGNOSTIC_SEPARATOR = DIAGNOSTIC_SEPARATOR