From 4d9f93e4eb618286698d5bca1ce38f3cb4cbe919 Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Fri, 23 Jun 2023 15:51:59 +0000 Subject: [PATCH] [K2/N/MPP] Disable one-stage MPP compilation ^KT-56855 Merge-request: KT-MR-10735 Merged-by: Vladimir Sukharev --- .../org/jetbrains/kotlin/cli/bc/K2Native.kt | 18 +++++++++++++----- .../backend/konan/driver/phases/Frontend.kt | 4 ++-- .../support/group/ExtTestCaseGroupProvider.kt | 7 ++++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index 21b60dd2ac7..dbfded60fa2 100644 --- a/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/kotlin-native/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -20,10 +20,7 @@ import org.jetbrains.kotlin.cli.common.messages.MessageRenderer import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.plugins.PluginCliParser -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.KotlinCompilerVersion -import org.jetbrains.kotlin.config.Services +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.ir.linkage.partial.partialLinkageConfig import org.jetbrains.kotlin.ir.linkage.partial.setupPartialLinkageConfig import org.jetbrains.kotlin.ir.util.IrMessageLogger @@ -69,7 +66,7 @@ class K2Native : CLICompiler() { if (!enoughArguments) { messageCollector.report(ERROR, "You have not specified any compilation arguments. No output has been produced.") } - if(configuration.get(KonanConfigKeys.PRODUCE) != CompilerOutputKind.LIBRARY && + if (configuration.get(KonanConfigKeys.PRODUCE) != CompilerOutputKind.LIBRARY && configuration.getBoolean(CommonConfigurationKeys.USE_FIR) && configuration.kotlinSourceRoots.isNotEmpty()) { // K2/Native backend cannot produce binary directly from FIR frontend output, since descriptors, deserialized from KLib, are needed @@ -79,6 +76,17 @@ class K2Native : CLICompiler() { // In this implementation, 'arguments' is not changed accordingly to changes in `firstStageConfiguration` and `configuration`, // since values of fields `produce`, `output`, `freeArgs`, `includes` does not seem to matter downstream in prepareEnvironment() + if (configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS) + ?.getFeatureSupport(LanguageFeature.MultiPlatformProjects) == LanguageFeature.State.ENABLED) + messageCollector.report(ERROR, + """ + Producing a multiplatform library directly from sources is not allowed. + + If you use the command-line compiler, then first compile the sources to a KLIB with + the `-p library` compiler flag. Then, use '-Xinclude=' to pass the KLIB to + the compiler to produce the required type of binary artifact. + """.trimIndent()) + val firstStageConfiguration = configuration.copy() // For the first stage, use "-p library" produce mode firstStageConfiguration.put(KonanConfigKeys.PRODUCE, CompilerOutputKind.LIBRARY) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Frontend.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Frontend.kt index acad0908d16..87c273837a7 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Frontend.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/Frontend.kt @@ -58,8 +58,8 @@ internal val FrontendPhase = createSimpleNamedCompilerPhase( if (sourceFiles.isNotEmpty()) { require (!input.configuration.getBoolean(CommonConfigurationKeys.USE_FIR)) { - "For K2 compiler, no source files should have been passed here. " + - "K2Native.doExecute() must transform such compilation into two-stage compilation" + "Internal error: For K2 compiler, no source files should have been passed here. " + + "K2Native.doExecute() must transform such compilation into two-stage compilation.\n" } } else { // TODO: we shouldn't be here in this case. diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/ExtTestCaseGroupProvider.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/ExtTestCaseGroupProvider.kt index ace260f96da..39fc24b6045 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/ExtTestCaseGroupProvider.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/support/group/ExtTestCaseGroupProvider.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CompilerConfiguration +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.konan.blackboxtest.support.* import org.jetbrains.kotlin.konan.blackboxtest.support.TestCase.WithTestRunnerExtras import org.jetbrains.kotlin.konan.blackboxtest.support.runner.TestRunChecks @@ -26,7 +27,6 @@ import org.jetbrains.kotlin.konan.blackboxtest.support.util.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.addRemoveModifier.addAnnotationEntry import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType import org.jetbrains.kotlin.resolve.ImportPath @@ -74,6 +74,7 @@ internal class ExtTestCaseGroupProvider : TestCaseGroupProvider, TestDisposable( generatedSources = settings.get(), customKlibs = settings.get(), pipelineType = settings.get(), + testMode = settings.get(), timeouts = settings.get(), ) @@ -99,6 +100,7 @@ private class ExtTestDataFile( private val generatedSources: GeneratedSources, private val customKlibs: CustomKlibs, private val pipelineType: PipelineType, + private val testMode: TestMode, private val timeouts: Timeouts, ) { private val structure by lazy { @@ -143,6 +145,9 @@ private class ExtTestDataFile( && INCOMPATIBLE_DIRECTIVES.none { it in structure.directives } && structure.directives[API_VERSION_DIRECTIVE] !in INCOMPATIBLE_API_VERSIONS && structure.directives[LANGUAGE_VERSION_DIRECTIVE] !in INCOMPATIBLE_LANGUAGE_VERSIONS + && !(testDataFileSettings.languageSettings.contains("+${LanguageFeature.MultiPlatformProjects.name}") + && pipelineType == PipelineType.K2 + && testMode == TestMode.ONE_STAGE_MULTI_MODULE) private fun isIgnoredTarget(pipelineType: PipelineType, testDataFile: File, backend: TargetBackend): Boolean { return when (pipelineType) {