From 2e22d5a38962dfc4253637d21d5811d68c7a1137 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Thu, 14 Nov 2019 18:56:04 +0700 Subject: [PATCH] [Interop] Add dependency on `kotlinx-metadata-klib` --- Interop/StubGenerator/build.gradle | 1 + .../kotlin/native/interop/gen/StubIrDriver.kt | 6 +++--- .../interop/gen/jvm/InteropLibraryCreation.kt | 15 +++++++++++++-- .../kotlin/native/interop/gen/jvm/main.kt | 12 ++++++++---- build.gradle | 10 +++++++++- settings.gradle | 1 + 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/Interop/StubGenerator/build.gradle b/Interop/StubGenerator/build.gradle index e2ca7f99d57..9488cd8ddf1 100644 --- a/Interop/StubGenerator/build.gradle +++ b/Interop/StubGenerator/build.gradle @@ -35,6 +35,7 @@ dependencies { compile project(':Interop:Indexer') compile "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion" compile project(path: ":endorsedLibraries:kotlinx.cli", configuration: "jvmRuntimeElements") + compile "org.jetbrains.kotlinx:kotlinx-metadata-klib:0.0.1-dev-4" testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$buildKotlinVersion" diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt index 7c56697ce4c..726dd175b09 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/StubIrDriver.kt @@ -4,6 +4,7 @@ */ package org.jetbrains.kotlin.native.interop.gen +import kotlinx.metadata.klib.KlibModuleMetadata import org.jetbrains.kotlin.native.interop.gen.jvm.GenerationMode import org.jetbrains.kotlin.native.interop.gen.jvm.InteropConfiguration import org.jetbrains.kotlin.native.interop.gen.jvm.KotlinPlatform @@ -101,8 +102,7 @@ class StubIrDriver( sealed class Result { object SourceCode : Result() - // Will contain Km* objects. - class Metadata(): Result() + class Metadata(val metadata: KlibModuleMetadata): Result() } fun run(): Result { @@ -133,7 +133,7 @@ class StubIrDriver( } private fun emitMetadata(builderResult: StubIrBuilderResult): Result.Metadata { - return Result.Metadata() + return Result.Metadata(KlibModuleMetadata("test", emptyList(), emptyList())) } private fun emitCFile(context: StubIrContext, cFile: Appendable, entryPoint: String?, nativeBridges: NativeBridges) { diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt index 4111729cc5e..944c6beb996 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/InteropLibraryCreation.kt @@ -4,18 +4,22 @@ */ package org.jetbrains.kotlin.native.interop.gen.jvm +import kotlinx.metadata.klib.KlibModuleMetadata import org.jetbrains.kotlin.backend.common.serialization.KlibIrVersion import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion -import org.jetbrains.kotlin.konan.CompilerVersion import org.jetbrains.kotlin.konan.CURRENT +import org.jetbrains.kotlin.konan.CompilerVersion import org.jetbrains.kotlin.konan.file.File import org.jetbrains.kotlin.konan.library.impl.KonanLibraryWriterImpl import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.library.KotlinLibraryVersioning import org.jetbrains.kotlin.library.KotlinAbiVersion +import org.jetbrains.kotlin.library.SerializedMetadata +import org.jetbrains.kotlin.util.removeSuffixIfPresent import java.util.* data class LibraryCreationArguments( + val metadata: KlibModuleMetadata, val outputPath: String, val moduleName: String, val nativeBitcodePath: String, @@ -31,9 +35,16 @@ fun createInteropLibrary(arguments: LibraryCreationArguments) { metadataVersion = KlibMetadataVersion.INSTANCE.toString(), irVersion = KlibIrVersion.INSTANCE.toString() ) + val outputPathWithoutExtension = arguments.outputPath.removeSuffixIfPresent(".klib") KonanLibraryWriterImpl( - File(arguments.outputPath),arguments.moduleName, version, arguments.target + File(outputPathWithoutExtension), + arguments.moduleName, + version, + arguments.target ).apply { + // TODO: Add write strategy that splits big fragments. + val metadata = arguments.metadata.write() + addMetadata(SerializedMetadata(metadata.header, metadata.fragments, metadata.fragmentNames)) addNativeBitcode(arguments.nativeBitcodePath) addManifestAddend(arguments.manifest) commit() diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt index 066eaee18bd..fa54ba52aa9 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/main.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.native.interop.gen.wasm.processIdlLib import org.jetbrains.kotlin.native.interop.indexer.* import org.jetbrains.kotlin.native.interop.tool.* import kotlinx.cli.ArgParser +import org.jetbrains.kotlin.konan.library.KLIB_INTEROP_IR_PROVIDER_IDENTIFIER import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File import java.lang.IllegalArgumentException @@ -218,6 +219,8 @@ private fun processCLib(args: Array, additionalArgs: Map = val (nativeIndex, compilation) = buildNativeIndex(library, verbose) + val moduleName = File(cinteropArguments.output).nameWithoutExtension + // Our current approach to arm64_32 support is to compile armv7k version of bitcode // for arm64_32. That's the reason for this substitution. // TODO: Add proper support with the next LLVM update. @@ -260,7 +263,7 @@ private fun processCLib(args: Array, additionalArgs: Map = file.parentFile.mkdirs() file } - val driverOptions = StubIrDriver.DriverOptions(mode, entryPoint, File(outCFile.absolutePath), outKtFileCreator) + val driverOptions = StubIrDriver.DriverOptions(mode, entryPoint, moduleName, File(outCFile.absolutePath), outKtFileCreator) val stubIrDriver = StubIrDriver(stubIrContext, driverOptions) stubIrDriver.run() } @@ -272,9 +275,10 @@ private fun processCLib(args: Array, additionalArgs: Map = _, oldValue, newValue -> warn("The package value `$oldValue` specified in .def file is overridden with explicit $newValue") } - def.manifestAddendProperties["interop"] = "true" - + if (stubIrOutput is StubIrDriver.Result.Metadata) { + def.manifestAddendProperties["ir_provider"] = KLIB_INTEROP_IR_PROVIDER_IDENTIFIER + } stubIrContext.addManifestProperties(def.manifestAddendProperties) manifestAddend?.parentFile?.mkdirs() @@ -310,8 +314,8 @@ private fun processCLib(args: Array, additionalArgs: Map = argsToCompiler(staticLibraries, libraryPaths) } is StubIrDriver.Result.Metadata -> { - val moduleName = File(cinteropArguments.output).nameWithoutExtension val args = LibraryCreationArguments( + metadata = stubIrOutput.metadata, nativeBitcodePath = nativeOutputPath, target = tool.target, moduleName = moduleName, diff --git a/build.gradle b/build.gradle index 88d26d15729..c4bd2204dd0 100644 --- a/build.gradle +++ b/build.gradle @@ -102,6 +102,9 @@ allprojects { maven { url kotlinCompilerRepo } + maven { + url "https://dl.bintray.com/kotlin/kotlin-dev" + } } setupHostAndTarget() @@ -266,6 +269,11 @@ task detectJarCollision(type: CollisionDetector) { resolvingRules["META-INF/metadata.kotlin_module"] = "kotlin-compiler" resolvingRules["META-INF/type-system.kotlin_module"] = "kotlin-compiler" resolvingRules["META-INF/util.runtime.kotlin_module"] = "kotlin-compiler" + + // These collisions are introduced by kotlinx-metadata-klib. + resolvingRules["META-INF/serialization.kotlin_module"] = "kotlin-compiler" + resolvingRules["META-INF/kotlin-util-klib-metadata.kotlin_module"] = "kotlin-compiler" + resolvingRules["kotlin/annotation/annotation.kotlin_builtins"] = "kotlin-compiler" resolvingRules["kotlin/collections/collections.kotlin_builtins"] = "kotlin-compiler" resolvingRules["kotlin/coroutines/coroutines.kotlin_builtins"] = "kotlin-compiler" @@ -275,7 +283,7 @@ task detectJarCollision(type: CollisionDetector) { resolvingRules["kotlin/reflect/reflect.kotlin_builtins"] = "kotlin-compiler" resolvingRules["META-INF/maven/com.google.protobuf/protobuf-java/pom.properties"] = "kotlin-compiler" resolvingRules["META-INF/maven/com.google.protobuf/protobuf-java/pom.xml"] = "kotlin-compiler" - librariesWithIgnoredClassCollisions.addAll(["kotlin-util-klib", "kotlin-util-io"]) + librariesWithIgnoredClassCollisions.addAll(["kotlin-util-klib", "kotlin-util-io", "kotlinx-metadata-klib"]) if (project.hasProperty('kotlinProjectPath')) { resolvingRulesWithRegexes[new Regex("META-INF/.+\\.kotlin_module")] = "kotlin-compiler" resolvingRules["META-INF/extensions/compiler.xml"] = "kotlin-compiler" diff --git a/settings.gradle b/settings.gradle index 860ba643b7a..39da97c5543 100644 --- a/settings.gradle +++ b/settings.gradle @@ -63,6 +63,7 @@ if (hasProperty("kotlinProjectPath")) { substitute module("org.jetbrains.kotlin:kotlin-util-klib-metadata:$kotlinVersion") with project(':kotlin-util-klib-metadata') substitute module("org.jetbrains.kotlin:kotlin-native-utils:$kotlinVersion") with project(':kotlin-native:kotlin-native-utils') substitute module("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion") with project(':kotlin-reflect') + substitute module("org.jetbrains.kotlinx:kotlinx-metadata-klib") with project(':kotlinx-metadata-klib') } } }