From c3e6ec731d28259285dd6efb0578ff4a1ddcb281 Mon Sep 17 00:00:00 2001 From: SvyatoslavScherbina Date: Mon, 13 May 2019 18:33:09 +0300 Subject: [PATCH] Implement -Xframework-import-header compiler flag (#2952) To be used to add imports to framework header to workaround missing imports issues. --- .../cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt | 1 + .../jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt | 7 +++++++ .../kotlin/backend/konan/KonanConfigurationKeys.kt | 2 ++ .../backend/konan/objcexport/ObjCExportHeaderGenerator.kt | 5 +++++ .../konan/objcexport/ObjCExportHeaderGeneratorImpl.kt | 4 ++++ 5 files changed, 19 insertions(+) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt index f4cf5c1331a..507e443a119 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2Native.kt @@ -194,6 +194,7 @@ class K2Native : CLICompiler() { put(FRIEND_MODULES, arguments.friendModules!!.split(File.pathSeparator).filterNot(String::isEmpty)) put(EXPORTED_LIBRARIES, selectExportedLibraries(configuration, arguments, outputKind)) + put(FRAMEWORK_IMPORT_HEADERS, arguments.frameworkImportHeaders.toNonNullList()) put(BITCODE_EMBEDDING_MODE, selectBitcodeEmbeddingMode(this, arguments, outputKind)) put(DEBUG_INFO_VERSION, arguments.debugInfoFormatVersion.toInt()) diff --git a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt index 052eae1c515..cdb0e404297 100644 --- a/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt +++ b/backend.native/cli.bc/src/org/jetbrains/kotlin/cli/bc/K2NativeCompilerArguments.kt @@ -119,6 +119,13 @@ class K2NativeCompilerArguments : CommonCompilerArguments() { ) var exportedLibraries: Array? = null + @Argument( + value = "-Xframework-import-header", + valueDescription = "
", + description = "Add additional header import to framework header" + ) + var frameworkImportHeaders: Array? = null + @Argument(value = "-Xprint-bitcode", deprecatedName = "--print_bitcode", description = "Print llvm bitcode") var printBitCode: Boolean = false diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt index 4604acabbe9..39c82184752 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/KonanConfigurationKeys.kt @@ -30,6 +30,8 @@ class KonanConfigKeys { = CompilerConfigurationKey.create("fully qualified main() name") val EXPORTED_LIBRARIES: CompilerConfigurationKey> = CompilerConfigurationKey.create>("libraries included into produced framework API") + val FRAMEWORK_IMPORT_HEADERS: CompilerConfigurationKey> + = CompilerConfigurationKey.create>("headers imported to framework header") val FRIEND_MODULES: CompilerConfigurationKey> = CompilerConfigurationKey.create>("friend module paths") val GENERATE_TEST_RUNNER: CompilerConfigurationKey diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt index 114d31359e3..44c1022a2d2 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGenerator.kt @@ -715,6 +715,9 @@ abstract class ObjCExportHeaderGenerator internal constructor( add("#import ") add("#import ") add("#import ") + getAdditionalImports().forEach { + add("#import <$it>") + } add("") if (classForwardDeclarations.isNotEmpty()) { @@ -747,6 +750,8 @@ abstract class ObjCExportHeaderGenerator internal constructor( protected abstract fun reportWarning(method: FunctionDescriptor, text: String) + protected open fun getAdditionalImports(): List = emptyList() + fun translateModule(): List> { // TODO: make the translation order stable diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt index 8ef5a3cb710..38b2cf9456f 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExportHeaderGeneratorImpl.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.konan.objcexport import org.jetbrains.kotlin.backend.konan.Context +import org.jetbrains.kotlin.backend.konan.KonanConfigKeys import org.jetbrains.kotlin.backend.konan.reportCompilationWarning import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.MessageUtil @@ -36,4 +37,7 @@ internal class ObjCExportHeaderGeneratorImpl( context.messageCollector.report(CompilerMessageSeverity.WARNING, text, location) } + + override fun getAdditionalImports(): List = + context.config.configuration.getNotNull(KonanConfigKeys.FRAMEWORK_IMPORT_HEADERS) }