rrn/rd/KT-55578 User-provided hints for linker errors
[K/N] KT-55578 Show customized user suggestions on linkage errors Merge-request: KT-MR-9636 Merged-by: Gleb Lukianets <Gleb.Lukianets@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
1e0115aef8
commit
242ca73d83
+4
@@ -34,6 +34,7 @@ const val SHORT_MODULE_NAME = "Xshort-module-name"
|
||||
const val FOREIGN_EXCEPTION_MODE = "Xforeign-exception-mode"
|
||||
const val DUMP_BRIDGES = "Xdump-bridges"
|
||||
const val DISABLE_EXCEPTION_PRETTIFIER = "Xdisable-exception-prettifier"
|
||||
const val USER_SETUP_HINT = "Xuser-setup-hint"
|
||||
|
||||
// TODO: unify camel and snake cases.
|
||||
// Possible solution is to accept both cases
|
||||
@@ -138,6 +139,9 @@ open class CInteropArguments(argParser: ArgParser =
|
||||
|
||||
val disableExceptionPrettifier by argParser.option(ArgType.Boolean, DISABLE_EXCEPTION_PRETTIFIER,
|
||||
description = "Don't hide exceptions with user-friendly ones").default(false)
|
||||
|
||||
val userSetupHint by argParser.option(ArgType.String, USER_SETUP_HINT,
|
||||
description = "A suggestion that is displayed to the user if produced lib fails to link")
|
||||
}
|
||||
|
||||
class JSInteropArguments(argParser: ArgParser = ArgParser("jsinterop",
|
||||
|
||||
+6
@@ -388,6 +388,12 @@ private fun processCLib(
|
||||
ForeignExceptionMode.byValue(it).value // may throw IllegalArgumentException
|
||||
}
|
||||
|
||||
cinteropArguments.userSetupHint?.let {
|
||||
def.manifestAddendProperties.put("userSetupHint", it)?.also {
|
||||
warn("User setup hint provided in .def file will be shadowed by command line argument")
|
||||
}
|
||||
}
|
||||
|
||||
manifestAddend?.parentFile?.mkdirs()
|
||||
manifestAddend?.let { def.manifestAddendProperties.storeProperties(it) }
|
||||
|
||||
|
||||
+31
-11
@@ -9,6 +9,8 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||
import org.jetbrains.kotlin.konan.target.Family
|
||||
import org.jetbrains.kotlin.konan.target.LinkerOutputKind
|
||||
import org.jetbrains.kotlin.konan.target.presetName
|
||||
import org.jetbrains.kotlin.library.isInterop
|
||||
import org.jetbrains.kotlin.library.uniqueName
|
||||
|
||||
internal fun determineLinkerOutput(context: PhaseContext): LinkerOutputKind =
|
||||
when (context.config.produce) {
|
||||
@@ -144,15 +146,33 @@ internal fun runLinkerCommands(context: PhaseContext, commands: List<Command>, c
|
||||
it.execute()
|
||||
}
|
||||
} catch (e: KonanExternalToolFailure) {
|
||||
val extraUserInfo =
|
||||
if (cachingInvolved)
|
||||
"""
|
||||
Please try to disable compiler caches and rerun the build. To disable compiler caches, add the following line to the gradle.properties file in the project's root directory:
|
||||
|
||||
kotlin.native.cacheKind.${context.config.target.presetName}=none
|
||||
|
||||
Also, consider filing an issue with full Gradle log here: https://kotl.in/issue
|
||||
""".trimIndent()
|
||||
else ""
|
||||
context.reportCompilationError("${e.toolName} invocation reported errors\n$extraUserInfo\n${e.message}")
|
||||
val extraUserInfo = if (cachingInvolved)
|
||||
"""
|
||||
Please try to disable compiler caches and rerun the build. To disable compiler caches, add the following line to the gradle.properties file in the project's root directory:
|
||||
|
||||
kotlin.native.cacheKind.${context.config.target.presetName}=none
|
||||
|
||||
Also, consider filing an issue with full Gradle log here: https://kotl.in/issue
|
||||
""".trimIndent()
|
||||
else null
|
||||
|
||||
val extraUserSetupInfo = run {
|
||||
context.config.resolvedLibraries.getFullResolvedList()
|
||||
.filter { it.library.isInterop }
|
||||
.mapNotNull { library ->
|
||||
library.library.manifestProperties["userSetupHint"]?.let {
|
||||
"From ${library.library.uniqueName}:\n$it".takeIf { it.isNotEmpty() }
|
||||
}
|
||||
}
|
||||
.mapIndexed { index, message -> "$index. $message" }
|
||||
.takeIf { it.isNotEmpty() }
|
||||
?.joinToString(separator = "\n\n")
|
||||
?.let {
|
||||
"It seems your project produced link errors.\nProposed solutions:\n\n$it\n"
|
||||
}
|
||||
}
|
||||
|
||||
val extraInfo = listOfNotNull(extraUserInfo, extraUserSetupInfo).joinToString(separator = "\n")
|
||||
|
||||
context.reportCompilationError("${e.toolName} invocation reported errors\n$extraInfo\n${e.message}")
|
||||
}
|
||||
Reference in New Issue
Block a user