Skip to content
This repository has been archived by the owner on Aug 10, 2021. It is now read-only.

Commit

Permalink
[Interop] Add dependency on kotlinx-metadata-klib
Browse files Browse the repository at this point in the history
  • Loading branch information
sbogolepov committed Dec 3, 2019
1 parent f25b4bf commit 2e22d5a
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 10 deletions.
1 change: 1 addition & 0 deletions Interop/StubGenerator/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -218,6 +219,8 @@ private fun processCLib(args: Array<String>, additionalArgs: Map<String, Any> =

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.
Expand Down Expand Up @@ -260,7 +263,7 @@ private fun processCLib(args: Array<String>, additionalArgs: Map<String, Any> =
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()
}
Expand All @@ -272,9 +275,10 @@ private fun processCLib(args: Array<String>, additionalArgs: Map<String, Any> =
_, 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()
Expand Down Expand Up @@ -310,8 +314,8 @@ private fun processCLib(args: Array<String>, additionalArgs: Map<String, Any> =
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,
Expand Down
10 changes: 9 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ allprojects {
maven {
url kotlinCompilerRepo
}
maven {
url "https://dl.bintray.com/kotlin/kotlin-dev"
}
}

setupHostAndTarget()
Expand Down Expand Up @@ -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"
Expand All @@ -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"
Expand Down
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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')
}
}
}
Expand Down

0 comments on commit 2e22d5a

Please sign in to comment.