Splitted library writer into kotlin and konan parts
Moved to util-io and util-klib for klib code commonization Moved the common writer to Kotlin workspace
This commit is contained in:
committed by
alexander-gorshenev
parent
63d763338d
commit
df02804be1
@@ -113,6 +113,8 @@ configurations {
|
|||||||
kotlin_reflect_jar
|
kotlin_reflect_jar
|
||||||
kotlin_script_runtime_jar
|
kotlin_script_runtime_jar
|
||||||
kotlin_native_utils_jar
|
kotlin_native_utils_jar
|
||||||
|
kotlin_util_io_jar
|
||||||
|
kotlin_util_klib_jar
|
||||||
trove4j_jar
|
trove4j_jar
|
||||||
kotlinCommonSources
|
kotlinCommonSources
|
||||||
|
|
||||||
@@ -133,6 +135,8 @@ dependencies {
|
|||||||
kotlin_reflect_jar "$kotlinReflectModule@jar"
|
kotlin_reflect_jar "$kotlinReflectModule@jar"
|
||||||
kotlin_script_runtime_jar "$kotlinScriptRuntimeModule@jar"
|
kotlin_script_runtime_jar "$kotlinScriptRuntimeModule@jar"
|
||||||
kotlin_native_utils_jar "$kotlinNativeUtilsModule@jar"
|
kotlin_native_utils_jar "$kotlinNativeUtilsModule@jar"
|
||||||
|
kotlin_util_io_jar "$kotlinUtilIoModule@jar"
|
||||||
|
kotlin_util_klib_jar "$kotlinUtilKlibModule@jar"
|
||||||
|
|
||||||
[kotlinCommonStdlibModule, kotlinTestCommonModule, kotlinTestAnnotationsCommonModule].each {
|
[kotlinCommonStdlibModule, kotlinTestCommonModule, kotlinTestAnnotationsCommonModule].each {
|
||||||
kotlinCommonSources(it) { transitive = false }
|
kotlinCommonSources(it) { transitive = false }
|
||||||
@@ -234,7 +238,7 @@ jar {
|
|||||||
dependsOn ':runtime:hostRuntime', 'external_jars'
|
dependsOn ':runtime:hostRuntime', 'external_jars'
|
||||||
}
|
}
|
||||||
|
|
||||||
def externalJars = ['compiler', 'stdlib', 'reflect', 'script_runtime', 'native_utils']
|
def externalJars = ['compiler', 'stdlib', 'reflect', 'script_runtime', 'native_utils', 'util_io', 'util_klib']
|
||||||
|
|
||||||
task trove4jCopy(type: Copy) {
|
task trove4jCopy(type: Copy) {
|
||||||
from configurations.getByName("trove4j_jar") {
|
from configurations.getByName("trove4j_jar") {
|
||||||
@@ -285,4 +289,4 @@ task debugCompiler(type: JavaExec) {
|
|||||||
"-Djava.library.path=${distDir.canonicalPath}/konan/nativelib"
|
"-Djava.library.path=${distDir.canonicalPath}/konan/nativelib"
|
||||||
enableAssertions = true
|
enableAssertions = true
|
||||||
args = findProperty("konan.debug.args").toString().tokenize() ?: []
|
args = findProperty("konan.debug.args").toString().tokenize() ?: []
|
||||||
}
|
}
|
||||||
|
|||||||
+13
-6
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.backend.konan.library.impl.buildLibrary
|
|||||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.Llvm
|
import org.jetbrains.kotlin.backend.konan.llvm.Llvm
|
||||||
import org.jetbrains.kotlin.konan.CURRENT
|
import org.jetbrains.kotlin.konan.CURRENT
|
||||||
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.KonanVersion
|
||||||
import org.jetbrains.kotlin.konan.file.isBitcode
|
import org.jetbrains.kotlin.konan.file.isBitcode
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibraryVersioning
|
import org.jetbrains.kotlin.library.*
|
||||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||||
import org.jetbrains.kotlin.konan.target.Family
|
import org.jetbrains.kotlin.konan.target.Family
|
||||||
|
|
||||||
@@ -89,10 +89,14 @@ internal fun produceOutput(context: Context) {
|
|||||||
val output = context.config.outputFiles.outputName
|
val output = context.config.outputFiles.outputName
|
||||||
val libraryName = context.config.moduleId
|
val libraryName = context.config.moduleId
|
||||||
val neededLibraries = context.librariesWithDependencies
|
val neededLibraries = context.librariesWithDependencies
|
||||||
val abiVersion = KonanAbiVersion.CURRENT
|
val abiVersion = KotlinAbiVersion.CURRENT
|
||||||
val compilerVersion = KonanVersion.CURRENT
|
val compilerVersion = KonanVersion.CURRENT
|
||||||
val libraryVersion = config.get(KonanConfigKeys.LIBRARY_VERSION)
|
val libraryVersion = config.get(KonanConfigKeys.LIBRARY_VERSION)
|
||||||
val versions = KonanLibraryVersioning(abiVersion = abiVersion, libraryVersion = libraryVersion, compilerVersion = compilerVersion)
|
val versions = KonanLibraryVersioning(
|
||||||
|
abiVersion = abiVersion,
|
||||||
|
libraryVersion = libraryVersion,
|
||||||
|
compilerVersion = compilerVersion
|
||||||
|
)
|
||||||
val target = context.config.target
|
val target = context.config.target
|
||||||
val nopack = config.getBoolean(KonanConfigKeys.NOPACK)
|
val nopack = config.getBoolean(KonanConfigKeys.NOPACK)
|
||||||
val manifestProperties = context.config.manifestProperties
|
val manifestProperties = context.config.manifestProperties
|
||||||
@@ -101,7 +105,10 @@ internal fun produceOutput(context: Context) {
|
|||||||
context.config.nativeLibraries,
|
context.config.nativeLibraries,
|
||||||
context.config.includeBinaries,
|
context.config.includeBinaries,
|
||||||
neededLibraries,
|
neededLibraries,
|
||||||
context.serializedLinkData!!,
|
context.serializedMetadata!!,
|
||||||
|
// During serializer and library commonizations we've got duplicate SerializedIr in
|
||||||
|
// two different packages. TODO: Eliminate them eventually.
|
||||||
|
SerializedIr(context.serializedIr!!.module, context.serializedIr!!.combinedDeclarationFilePath),
|
||||||
versions,
|
versions,
|
||||||
target,
|
target,
|
||||||
output,
|
output,
|
||||||
@@ -148,4 +155,4 @@ private fun embedAppleLinkerOptionsToBitcode(llvm: Llvm, config: KonanConfig) {
|
|||||||
llvm.nativeDependenciesToLink.flatMap { findEmbeddableOptions(it.linkerOpts) }
|
llvm.nativeDependenciesToLink.flatMap { findEmbeddableOptions(it.linkerOpts) }
|
||||||
|
|
||||||
embedLlvmLinkOptions(llvm.llvmModule, optionsToEmbed)
|
embedLlvmLinkOptions(llvm.llvmModule, optionsToEmbed)
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-4
@@ -13,7 +13,8 @@ import org.jetbrains.kotlin.backend.common.descriptors.WrappedTypeParameterDescr
|
|||||||
import org.jetbrains.kotlin.backend.common.validateIrModule
|
import org.jetbrains.kotlin.backend.common.validateIrModule
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.*
|
import org.jetbrains.kotlin.backend.konan.descriptors.*
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.KonanIr
|
import org.jetbrains.kotlin.backend.konan.ir.KonanIr
|
||||||
import org.jetbrains.kotlin.backend.konan.library.LinkData
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter
|
||||||
|
import org.jetbrains.kotlin.library.SerializedMetadata
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD
|
import org.jetbrains.kotlin.backend.konan.lower.DECLARATION_ORIGIN_BRIDGE_METHOD
|
||||||
import org.jetbrains.kotlin.backend.konan.optimizations.Devirtualization
|
import org.jetbrains.kotlin.backend.konan.optimizations.Devirtualization
|
||||||
@@ -49,10 +50,12 @@ import kotlin.LazyThreadSafetyMode.PUBLICATION
|
|||||||
import kotlin.reflect.KProperty
|
import kotlin.reflect.KProperty
|
||||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.KotlinMangler
|
import org.jetbrains.kotlin.backend.common.serialization.KotlinMangler
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.SerializedIr
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport
|
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.coverage.CoverageManager
|
import org.jetbrains.kotlin.backend.konan.llvm.coverage.CoverageManager
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.konan.library.KonanLibraryLayout
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Offset for synthetic elements created by lowerings and not attributable to other places in the source code.
|
* Offset for synthetic elements created by lowerings and not attributable to other places in the source code.
|
||||||
@@ -264,11 +267,11 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
ClassLayoutBuilder(irClass, this)
|
ClassLayoutBuilder(irClass, this)
|
||||||
}
|
}
|
||||||
|
|
||||||
// We serialize untouched descriptor tree and inline IR bodies
|
// We serialize untouched descriptor tree and IR.
|
||||||
// right after the frontend.
|
|
||||||
// But we have to wait until the code generation phase,
|
// But we have to wait until the code generation phase,
|
||||||
// to dump this information into generated file.
|
// to dump this information into generated file.
|
||||||
var serializedLinkData: LinkData? = null
|
var serializedMetadata: SerializedMetadata? = null
|
||||||
|
var serializedIr: SerializedIr? = null
|
||||||
var dataFlowGraph: ByteArray? = null
|
var dataFlowGraph: ByteArray? = null
|
||||||
|
|
||||||
val librariesWithDependencies by lazy {
|
val librariesWithDependencies by lazy {
|
||||||
@@ -322,6 +325,7 @@ internal class Context(config: KonanConfig) : KonanBackendContext(config) {
|
|||||||
val llvmImports: LlvmImports = Llvm.ImportsImpl(this)
|
val llvmImports: LlvmImports = Llvm.ImportsImpl(this)
|
||||||
lateinit var llvmDeclarations: LlvmDeclarations
|
lateinit var llvmDeclarations: LlvmDeclarations
|
||||||
lateinit var bitcodeFileName: String
|
lateinit var bitcodeFileName: String
|
||||||
|
lateinit var library: KonanLibraryLayout
|
||||||
|
|
||||||
val cStubsManager = CStubsManager(config.target)
|
val cStubsManager = CStubsManager(config.target)
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -22,9 +22,10 @@ import org.jetbrains.kotlin.konan.library.libraryResolver
|
|||||||
import org.jetbrains.kotlin.konan.properties.loadProperties
|
import org.jetbrains.kotlin.konan.properties.loadProperties
|
||||||
import org.jetbrains.kotlin.konan.target.*
|
import org.jetbrains.kotlin.konan.target.*
|
||||||
import org.jetbrains.kotlin.konan.library.resolver.TopologicalLibraryOrder
|
import org.jetbrains.kotlin.konan.library.resolver.TopologicalLibraryOrder
|
||||||
import org.jetbrains.kotlin.konan.library.toUnresolvedLibraries
|
|
||||||
import org.jetbrains.kotlin.konan.util.Logger
|
import org.jetbrains.kotlin.konan.util.Logger
|
||||||
import kotlin.system.exitProcess
|
import kotlin.system.exitProcess
|
||||||
|
import org.jetbrains.kotlin.library.toUnresolvedLibraries
|
||||||
|
import org.jetbrains.kotlin.konan.KonanVersion
|
||||||
|
|
||||||
class KonanConfig(val project: Project, val configuration: CompilerConfiguration) {
|
class KonanConfig(val project: Project, val configuration: CompilerConfiguration) {
|
||||||
|
|
||||||
|
|||||||
+7
-11
@@ -1,29 +1,26 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan
|
package org.jetbrains.kotlin.backend.konan
|
||||||
|
|
||||||
import llvm.LLVMWriteBitcodeToFile
|
|
||||||
import org.jetbrains.kotlin.backend.common.LoggingContext
|
import org.jetbrains.kotlin.backend.common.LoggingContext
|
||||||
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.*
|
import org.jetbrains.kotlin.backend.common.phaser.*
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isForwardDeclarationModule
|
import org.jetbrains.kotlin.backend.konan.descriptors.isForwardDeclarationModule
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary
|
import org.jetbrains.kotlin.backend.konan.descriptors.konanLibrary
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
|
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.*
|
import org.jetbrains.kotlin.backend.konan.llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier
|
import org.jetbrains.kotlin.backend.konan.lower.ExpectToActualDefaultValueCopier
|
||||||
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport
|
import org.jetbrains.kotlin.backend.konan.objcexport.ObjCExport
|
||||||
import org.jetbrains.kotlin.backend.konan.serialization.*
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanDeclarationTable
|
||||||
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanIrLinker
|
||||||
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanIrModuleSerializer
|
||||||
|
import org.jetbrains.kotlin.backend.konan.serialization.KonanSerializationUtil
|
||||||
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable
|
|
||||||
import org.jetbrains.kotlin.backend.konan.library.impl.buildLibrary
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
import org.jetbrains.kotlin.ir.util.patchDeclarationParents
|
||||||
import org.jetbrains.kotlin.konan.CURRENT
|
|
||||||
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibraryVersioning
|
|
||||||
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
||||||
@@ -181,10 +178,9 @@ internal val patchDeclarationParents0Phase = konanUnitPhase(
|
|||||||
internal val serializerPhase = konanUnitPhase(
|
internal val serializerPhase = konanUnitPhase(
|
||||||
op = {
|
op = {
|
||||||
val declarationTable = KonanDeclarationTable(irModule!!.irBuiltins, DescriptorTable())
|
val declarationTable = KonanDeclarationTable(irModule!!.irBuiltins, DescriptorTable())
|
||||||
val serializedIr = KonanIrModuleSerializer(this, declarationTable).serializedIrModule(irModule!!)
|
serializedIr = KonanIrModuleSerializer(this, declarationTable).serializedIrModule(irModule!!)
|
||||||
val serializer = KonanSerializationUtil(this, config.configuration.get(CommonConfigurationKeys.METADATA_VERSION)!!, declarationTable)
|
val serializer = KonanSerializationUtil(this, config.configuration.get(CommonConfigurationKeys.METADATA_VERSION)!!, declarationTable)
|
||||||
serializedLinkData =
|
serializedMetadata = serializer.serializeModule(moduleDescriptor)
|
||||||
serializer.serializeModule(moduleDescriptor, /*if (!config.isInteropStubs) serializedIr else null*/ serializedIr)
|
|
||||||
},
|
},
|
||||||
name = "Serializer",
|
name = "Serializer",
|
||||||
description = "Serialize descriptor tree and inline IR bodies"
|
description = "Serialize descriptor tree and inline IR bodies"
|
||||||
|
|||||||
+9
-23
@@ -6,31 +6,17 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.library
|
package org.jetbrains.kotlin.backend.konan.library
|
||||||
|
|
||||||
import llvm.LLVMModuleRef
|
import llvm.LLVMModuleRef
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.SerializedIr
|
import org.jetbrains.kotlin.library.BaseWriter
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
import org.jetbrains.kotlin.library.IrWriter
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibraryVersioning
|
import org.jetbrains.kotlin.library.MetadataWriter
|
||||||
import org.jetbrains.kotlin.konan.properties.Properties
|
|
||||||
|
|
||||||
interface KonanLibraryWriter {
|
interface TargetedWriter {
|
||||||
val versions: KonanLibraryVersioning
|
|
||||||
fun addLinkData(linkData: LinkData)
|
|
||||||
fun addNativeBitcode(library: String)
|
|
||||||
fun addIncludedBinary(library: String)
|
fun addIncludedBinary(library: String)
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BitcodeWriter : TargetedWriter {
|
||||||
fun addKotlinBitcode(llvmModule: LLVMModuleRef)
|
fun addKotlinBitcode(llvmModule: LLVMModuleRef)
|
||||||
fun addLinkDependencies(libraries: List<KonanLibrary>)
|
fun addNativeBitcode(library: String)
|
||||||
fun addManifestAddend(properties: Properties)
|
|
||||||
fun addDataFlowGraph(dataFlowGraph: ByteArray)
|
|
||||||
val mainBitcodeFileName: String
|
|
||||||
fun commit()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class LinkData(
|
interface KonanLibraryWriter : MetadataWriter, BaseWriter, IrWriter, BitcodeWriter
|
||||||
val module: ByteArray,
|
|
||||||
val fragments: List<List<ByteArray>>,
|
|
||||||
val fragmentNames: List<String>,
|
|
||||||
val ir: SerializedIr? = null
|
|
||||||
)
|
|
||||||
|
|
||||||
interface MetadataWriter {
|
|
||||||
fun addLinkData(linkData: LinkData)
|
|
||||||
}
|
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the LICENSE file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.backend.konan.library.impl
|
||||||
|
|
||||||
|
import llvm.LLVMModuleRef
|
||||||
|
import llvm.LLVMWriteBitcodeToFile
|
||||||
|
import org.jetbrains.kotlin.backend.konan.library.BitcodeWriter
|
||||||
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
|
import org.jetbrains.kotlin.konan.library.BitcodeKotlinLibraryLayout
|
||||||
|
import org.jetbrains.kotlin.konan.library.TargetedKotlinLibraryLayout
|
||||||
|
|
||||||
|
open class TargetedWriterImpl(val targetLayout: TargetedKotlinLibraryLayout) {
|
||||||
|
init {
|
||||||
|
targetLayout.targetDir.mkdirs()
|
||||||
|
targetLayout.includedDir.mkdirs()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addIncludedBinary(library: String) {
|
||||||
|
val basename = File(library).name
|
||||||
|
File(library).copyTo(File(targetLayout.includedDir, basename))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class BitcodeWriterImpl(
|
||||||
|
libraryLayout: BitcodeKotlinLibraryLayout
|
||||||
|
) : BitcodeWriter, TargetedWriterImpl(libraryLayout) {
|
||||||
|
|
||||||
|
val bitcodeLayout = libraryLayout
|
||||||
|
|
||||||
|
init {
|
||||||
|
bitcodeLayout.kotlinDir.mkdirs()
|
||||||
|
bitcodeLayout.nativeDir.mkdirs()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addNativeBitcode(library: String) {
|
||||||
|
val basename = File(library).name
|
||||||
|
File(library).copyTo(File(bitcodeLayout.nativeDir, basename))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun addKotlinBitcode(llvmModule: LLVMModuleRef) {
|
||||||
|
//libraryLayout.llvmModule = llvmModule
|
||||||
|
LLVMWriteBitcodeToFile(llvmModule, bitcodeLayout.mainBitcodeFileName)
|
||||||
|
}
|
||||||
|
}
|
||||||
+48
-112
@@ -6,130 +6,67 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.library.impl
|
package org.jetbrains.kotlin.backend.konan.library.impl
|
||||||
|
|
||||||
import llvm.LLVMModuleRef
|
import llvm.LLVMModuleRef
|
||||||
import llvm.LLVMWriteBitcodeToFile
|
import org.jetbrains.kotlin.library.SerializedIr
|
||||||
|
import org.jetbrains.kotlin.backend.konan.library.BitcodeWriter
|
||||||
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter
|
import org.jetbrains.kotlin.backend.konan.library.KonanLibraryWriter
|
||||||
import org.jetbrains.kotlin.backend.konan.library.LinkData
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.file.*
|
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||||
import org.jetbrains.kotlin.konan.library.*
|
import org.jetbrains.kotlin.konan.library.KonanLibraryLayout
|
||||||
import org.jetbrains.kotlin.konan.library.KLIB_FILE_EXTENSION
|
import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
import org.jetbrains.kotlin.konan.properties.*
|
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
import org.jetbrains.kotlin.library.*
|
||||||
|
import org.jetbrains.kotlin.library.impl.BaseWriterImpl
|
||||||
|
import org.jetbrains.kotlin.library.impl.IrWriterImpl
|
||||||
|
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutForWriter
|
||||||
|
import org.jetbrains.kotlin.library.impl.MetadataWriterImpl
|
||||||
|
|
||||||
|
class KonanLibraryLayoutForWriter(
|
||||||
|
override val libDir: File,
|
||||||
|
override val target: KonanTarget
|
||||||
|
) : KonanLibraryLayout, KotlinLibraryLayoutForWriter(libDir)
|
||||||
|
|
||||||
abstract class FileBasedLibraryWriter (val file: File): KonanLibraryWriter
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires non-null [target].
|
* Requires non-null [target].
|
||||||
*/
|
*/
|
||||||
class LibraryWriterImpl(
|
class KonanLibraryWriterImpl(
|
||||||
override val libDir: File,
|
libDir: File,
|
||||||
moduleName: String,
|
moduleName: String,
|
||||||
override val versions: KonanLibraryVersioning,
|
versions: KonanLibraryVersioning,
|
||||||
override val target: KonanTarget,
|
target: KonanTarget,
|
||||||
val nopack: Boolean = false
|
nopack: Boolean = false,
|
||||||
): FileBasedLibraryWriter(libDir), KonanLibraryLayout {
|
|
||||||
|
|
||||||
constructor(path: String, moduleName: String, versions: KonanLibraryVersioning, target: KonanTarget, nopack: Boolean):
|
val layout: KonanLibraryLayoutForWriter = KonanLibraryLayoutForWriter(libDir, target),
|
||||||
this(File(path), moduleName, versions, target, nopack)
|
|
||||||
|
|
||||||
override val libraryName = libDir.path
|
base: BaseWriter = BaseWriterImpl(layout, moduleName, versions, nopack),
|
||||||
val klibFile
|
bitcode: BitcodeWriter = BitcodeWriterImpl(layout),
|
||||||
get() = File("${libDir.path}.$KLIB_FILE_EXTENSION")
|
metadata: MetadataWriter = MetadataWriterImpl(layout),
|
||||||
|
ir: IrWriter = IrWriterImpl(layout)
|
||||||
|
|
||||||
// TODO: Experiment with separate bitcode files.
|
) : BaseWriter by base, BitcodeWriter by bitcode, MetadataWriter by metadata, IrWriter by ir, KonanLibraryWriter
|
||||||
// Per package or per class.
|
|
||||||
val mainBitcodeFile = File(kotlinDir, "program.kt.bc")
|
|
||||||
override val mainBitcodeFileName = mainBitcodeFile.path
|
|
||||||
val manifestProperties = Properties()
|
|
||||||
|
|
||||||
init {
|
|
||||||
// TODO: figure out the proper policy here.
|
|
||||||
libDir.deleteRecursively()
|
|
||||||
klibFile.delete()
|
|
||||||
libDir.mkdirs()
|
|
||||||
linkdataDir.mkdirs()
|
|
||||||
targetDir.mkdirs()
|
|
||||||
kotlinDir.mkdirs()
|
|
||||||
nativeDir.mkdirs()
|
|
||||||
includedDir.mkdirs()
|
|
||||||
resourcesDir.mkdirs()
|
|
||||||
irDir.mkdirs()
|
|
||||||
// TODO: <name>:<hash> will go somewhere around here.
|
|
||||||
manifestProperties.setProperty(KLIB_PROPERTY_UNIQUE_NAME, moduleName)
|
|
||||||
manifestProperties.writeKonanLibraryVersioning(versions)
|
|
||||||
}
|
|
||||||
|
|
||||||
var llvmModule: LLVMModuleRef? = null
|
|
||||||
|
|
||||||
override fun addKotlinBitcode(llvmModule: LLVMModuleRef) {
|
|
||||||
this.llvmModule = llvmModule
|
|
||||||
LLVMWriteBitcodeToFile(llvmModule, mainBitcodeFileName)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addLinkData(linkData: LinkData) {
|
|
||||||
MetadataWriterImpl(this).addLinkData(linkData)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addNativeBitcode(library: String) {
|
|
||||||
val basename = File(library).name
|
|
||||||
File(library).copyTo(File(nativeDir, basename))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addIncludedBinary(library: String) {
|
|
||||||
val basename = File(library).name
|
|
||||||
File(library).copyTo(File(includedDir, basename))
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addLinkDependencies(libraries: List<KonanLibrary>) {
|
|
||||||
if (libraries.isEmpty()) {
|
|
||||||
manifestProperties.remove(KLIB_PROPERTY_DEPENDS)
|
|
||||||
// make sure there are no leftovers from the .def file.
|
|
||||||
return
|
|
||||||
} else {
|
|
||||||
val newValue = libraries.joinToString(" ") { it.uniqueName }
|
|
||||||
manifestProperties.setProperty(KLIB_PROPERTY_DEPENDS, newValue)
|
|
||||||
libraries.forEach { it ->
|
|
||||||
if (it.versions.libraryVersion != null) {
|
|
||||||
manifestProperties.setProperty("${KLIB_PROPERTY_DEPENDENCY_VERSION}_${it.uniqueName}", it.versions.libraryVersion)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addManifestAddend(properties: Properties) {
|
|
||||||
manifestProperties.putAll(properties)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addDataFlowGraph(dataFlowGraph: ByteArray) {
|
|
||||||
dataFlowGraphFile.writeBytes(dataFlowGraph)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun commit() {
|
|
||||||
manifestProperties.saveToFile(manifestFile)
|
|
||||||
if (!nopack) {
|
|
||||||
libDir.zipDirAs(klibFile)
|
|
||||||
libDir.deleteRecursively()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal fun buildLibrary(
|
internal fun buildLibrary(
|
||||||
natives: List<String>,
|
natives: List<String>,
|
||||||
included: List<String>,
|
included: List<String>,
|
||||||
linkDependencies: List<KonanLibrary>,
|
linkDependencies: List<KonanLibrary>,
|
||||||
linkData: LinkData,
|
metadata: SerializedMetadata,
|
||||||
versions: KonanLibraryVersioning,
|
ir: SerializedIr,
|
||||||
target: KonanTarget,
|
versions: KonanLibraryVersioning,
|
||||||
output: String,
|
target: KonanTarget,
|
||||||
moduleName: String,
|
output: String,
|
||||||
llvmModule: LLVMModuleRef?,
|
moduleName: String,
|
||||||
nopack: Boolean,
|
llvmModule: LLVMModuleRef?,
|
||||||
manifestProperties: Properties?,
|
nopack: Boolean,
|
||||||
dataFlowGraph: ByteArray?): KonanLibraryWriter {
|
manifestProperties: Properties?,
|
||||||
|
dataFlowGraph: ByteArray?
|
||||||
|
): KonanLibraryLayout {
|
||||||
|
|
||||||
val library = LibraryWriterImpl(File(output), moduleName, versions, target, nopack)
|
val library = KonanLibraryWriterImpl(File(output), moduleName, versions, target, nopack)
|
||||||
|
|
||||||
llvmModule?.let { library.addKotlinBitcode(it) }
|
llvmModule?.let { library.addKotlinBitcode(it) }
|
||||||
library.addLinkData(linkData)
|
library.addMetadata(metadata)
|
||||||
|
library.addIr(ir)
|
||||||
|
|
||||||
natives.forEach {
|
natives.forEach {
|
||||||
library.addNativeBitcode(it)
|
library.addNativeBitcode(it)
|
||||||
}
|
}
|
||||||
@@ -141,6 +78,5 @@ internal fun buildLibrary(
|
|||||||
dataFlowGraph?.let { library.addDataFlowGraph(it) }
|
dataFlowGraph?.let { library.addDataFlowGraph(it) }
|
||||||
|
|
||||||
library.commit()
|
library.commit()
|
||||||
return library
|
return library.layout
|
||||||
}
|
}
|
||||||
|
|
||||||
-34
@@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
|
||||||
* that can be found in the LICENSE file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.backend.konan.library.impl
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.backend.konan.library.LinkData
|
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibraryLayout
|
|
||||||
|
|
||||||
internal class MetadataWriterImpl(libraryLayout: KonanLibraryLayout): KonanLibraryLayout by libraryLayout {
|
|
||||||
|
|
||||||
fun addLinkData(linkData: LinkData) {
|
|
||||||
moduleHeaderFile.writeBytes(linkData.module)
|
|
||||||
linkData.ir?.let { irHeader.writeBytes(it.module) }
|
|
||||||
linkData.fragments.forEachIndexed { index, it ->
|
|
||||||
val packageFqName = linkData.fragmentNames[index]
|
|
||||||
val shortName = packageFqName.substringAfterLast(".")
|
|
||||||
val dir = packageFragmentsDir(packageFqName)
|
|
||||||
dir.deleteRecursively()
|
|
||||||
dir.mkdirs()
|
|
||||||
val numCount = it.size.toString().length
|
|
||||||
fun withLeadingZeros(i: Int) = String.format("%0${numCount}d", i)
|
|
||||||
for ((i, fragment) in it.withIndex()) {
|
|
||||||
packageFragmentFile(packageFqName, "${withLeadingZeros(i)}_$shortName").writeBytes(fragment)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
linkData.ir?.combinedDeclarationFilePath?.let {
|
|
||||||
// TODO: use Files.move.
|
|
||||||
File(it).copyTo(irFile)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+8
-8
@@ -6,30 +6,30 @@
|
|||||||
package org.jetbrains.kotlin.backend.konan.llvm
|
package org.jetbrains.kotlin.backend.konan.llvm
|
||||||
|
|
||||||
import llvm.LLVMTypeRef
|
import llvm.LLVMTypeRef
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.KotlinMangler
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.KotlinManglerImpl
|
import org.jetbrains.kotlin.backend.common.serialization.KotlinManglerImpl
|
||||||
import org.jetbrains.kotlin.backend.konan.*
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.externalSymbolOrThrow
|
import org.jetbrains.kotlin.backend.konan.descriptors.externalSymbolOrThrow
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationValue
|
import org.jetbrains.kotlin.backend.konan.descriptors.getAnnotationValue
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract
|
import org.jetbrains.kotlin.backend.konan.descriptors.isAbstract
|
||||||
import org.jetbrains.kotlin.backend.konan.ir.*
|
import org.jetbrains.kotlin.backend.konan.ir.allParameters
|
||||||
|
import org.jetbrains.kotlin.backend.konan.ir.getObjCMethodInfo
|
||||||
|
import org.jetbrains.kotlin.backend.konan.ir.isObjCClassMethod
|
||||||
|
import org.jetbrains.kotlin.backend.konan.ir.isUnit
|
||||||
import org.jetbrains.kotlin.backend.konan.llvm.KonanMangler.isExported
|
import org.jetbrains.kotlin.backend.konan.llvm.KonanMangler.isExported
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
|
||||||
import org.jetbrains.kotlin.backend.konan.optimizations.DataFlowIR
|
import org.jetbrains.kotlin.backend.konan.optimizations.DataFlowIR
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
|
||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
|
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
|
||||||
|
import org.jetbrains.kotlin.ir.types.getClass
|
||||||
|
import org.jetbrains.kotlin.ir.util.fqNameSafe
|
||||||
import org.jetbrains.kotlin.ir.util.isSuspend
|
import org.jetbrains.kotlin.ir.util.isSuspend
|
||||||
import org.jetbrains.kotlin.ir.util.isVararg
|
import org.jetbrains.kotlin.ir.util.isVararg
|
||||||
import org.jetbrains.kotlin.konan.library.uniqueName
|
|
||||||
import org.jetbrains.kotlin.backend.konan.isInlinedNative
|
import org.jetbrains.kotlin.backend.konan.isInlinedNative
|
||||||
|
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||||
|
import org.jetbrains.kotlin.library.uniqueName
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
|
|
||||||
|
|
||||||
// This file describes the ABI for Kotlin descriptors of exported declarations.
|
// This file describes the ABI for Kotlin descriptors of exported declarations.
|
||||||
|
|||||||
-3
@@ -9,8 +9,6 @@ import kotlinx.cinterop.allocArrayOf
|
|||||||
import kotlinx.cinterop.memScoped
|
import kotlinx.cinterop.memScoped
|
||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.backend.konan.*
|
import org.jetbrains.kotlin.backend.konan.*
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|
||||||
import org.jetbrains.kotlin.builtins.UnsignedType
|
|
||||||
import org.jetbrains.kotlin.builtins.UnsignedTypes
|
import org.jetbrains.kotlin.builtins.UnsignedTypes
|
||||||
import org.jetbrains.kotlin.ir.SourceManager.FileEntry
|
import org.jetbrains.kotlin.ir.SourceManager.FileEntry
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
@@ -20,7 +18,6 @@ import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
|||||||
import org.jetbrains.kotlin.konan.CURRENT
|
import org.jetbrains.kotlin.konan.CURRENT
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.KonanVersion
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
|
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeUtils
|
import org.jetbrains.kotlin.types.TypeUtils
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -15,6 +15,10 @@ import org.jetbrains.kotlin.ir.declarations.*
|
|||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
||||||
|
import org.jetbrains.kotlin.ir.util.fqNameSafe
|
||||||
|
import org.jetbrains.kotlin.ir.util.isAnnotationClass
|
||||||
|
import org.jetbrains.kotlin.ir.util.isInterface
|
||||||
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
|
||||||
internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
||||||
@@ -90,7 +94,7 @@ internal class RTTIGenerator(override val context: Context) : ContextUtils {
|
|||||||
|
|
||||||
extendedInfo,
|
extendedInfo,
|
||||||
|
|
||||||
Int32(KonanAbiVersion.CURRENT.version),
|
Int32(KotlinAbiVersion.CURRENT.version),
|
||||||
|
|
||||||
Int32(size),
|
Int32(size),
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.backend.common.serialization.SerializedIr
|
|||||||
import org.jetbrains.kotlin.backend.konan.Context
|
import org.jetbrains.kotlin.backend.konan.Context
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
|
import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember
|
||||||
import org.jetbrains.kotlin.backend.konan.descriptors.isSerializableExpectClass
|
import org.jetbrains.kotlin.backend.konan.descriptors.isSerializableExpectClass
|
||||||
import org.jetbrains.kotlin.backend.konan.library.LinkData
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
import org.jetbrains.kotlin.backend.common.serialization.DeclarationTable
|
||||||
|
import org.jetbrains.kotlin.library.SerializedMetadata
|
||||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||||
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
||||||
import org.jetbrains.kotlin.metadata.konan.KonanProtoBuf
|
import org.jetbrains.kotlin.metadata.konan.KonanProtoBuf
|
||||||
@@ -207,7 +207,7 @@ internal class KonanSerializationUtil(val context: Context, val metadataVersion:
|
|||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun serializeModule(moduleDescriptor: ModuleDescriptor, serializedIr: SerializedIr?): LinkData {
|
internal fun serializeModule(moduleDescriptor: ModuleDescriptor): SerializedMetadata {
|
||||||
val libraryProto = KonanProtoBuf.LinkDataLibrary.newBuilder()
|
val libraryProto = KonanProtoBuf.LinkDataLibrary.newBuilder()
|
||||||
libraryProto.moduleName = moduleDescriptor.name.asString()
|
libraryProto.moduleName = moduleDescriptor.name.asString()
|
||||||
val fragments = mutableListOf<List<ByteArray>>()
|
val fragments = mutableListOf<List<ByteArray>>()
|
||||||
@@ -233,7 +233,7 @@ internal class KonanSerializationUtil(val context: Context, val metadataVersion:
|
|||||||
}
|
}
|
||||||
|
|
||||||
val libraryAsByteArray = libraryProto.build().toByteArray()
|
val libraryAsByteArray = libraryProto.build().toByteArray()
|
||||||
return LinkData(libraryAsByteArray, fragments, fragmentNames, serializedIr)
|
return SerializedMetadata(libraryAsByteArray, fragments, fragmentNames)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,6 +59,8 @@ ext {
|
|||||||
kotlinReflectModule="org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}"
|
kotlinReflectModule="org.jetbrains.kotlin:kotlin-reflect:${kotlinVersion}"
|
||||||
kotlinScriptRuntimeModule="org.jetbrains.kotlin:kotlin-script-runtime:${kotlinVersion}"
|
kotlinScriptRuntimeModule="org.jetbrains.kotlin:kotlin-script-runtime:${kotlinVersion}"
|
||||||
kotlinNativeUtilsModule="org.jetbrains.kotlin:kotlin-native-utils:${kotlinVersion}"
|
kotlinNativeUtilsModule="org.jetbrains.kotlin:kotlin-native-utils:${kotlinVersion}"
|
||||||
|
kotlinUtilIoModule="org.jetbrains.kotlin:kotlin-util-io:${kotlinVersion}"
|
||||||
|
kotlinUtilKlibModule="org.jetbrains.kotlin:kotlin-util-klib:${kotlinVersion}"
|
||||||
|
|
||||||
konanVersionFull = KonanVersionGeneratedKt.getCurrentKonanVersion()
|
konanVersionFull = KonanVersionGeneratedKt.getCurrentKonanVersion()
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -2,7 +2,7 @@ package org.jetbrains.kotlin.konan.library.resolver
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
import org.jetbrains.kotlin.konan.library.KonanLibrary
|
||||||
import org.jetbrains.kotlin.konan.library.SearchPathResolverWithTarget
|
import org.jetbrains.kotlin.konan.library.SearchPathResolverWithTarget
|
||||||
import org.jetbrains.kotlin.konan.library.UnresolvedLibrary
|
import org.jetbrains.kotlin.library.UnresolvedLibrary
|
||||||
|
|
||||||
interface KonanLibraryResolver {
|
interface KonanLibraryResolver {
|
||||||
|
|
||||||
@@ -13,9 +13,9 @@ interface KonanLibraryResolver {
|
|||||||
* resolves libraries and evaluates dependencies between them.
|
* resolves libraries and evaluates dependencies between them.
|
||||||
*/
|
*/
|
||||||
fun resolveWithDependencies(
|
fun resolveWithDependencies(
|
||||||
unresolvedLibraries: List<UnresolvedLibrary>,
|
unresolvedLibraries: List<UnresolvedLibrary>,
|
||||||
noStdLib: Boolean = false,
|
noStdLib: Boolean = false,
|
||||||
noDefaultLibs: Boolean = false
|
noDefaultLibs: Boolean = false
|
||||||
): KonanLibraryResolveResult
|
): KonanLibraryResolveResult
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -20,15 +20,17 @@ import org.jetbrains.kotlin.konan.file.File
|
|||||||
import org.jetbrains.kotlin.konan.library.*
|
import org.jetbrains.kotlin.konan.library.*
|
||||||
import org.jetbrains.kotlin.konan.library.resolver.*
|
import org.jetbrains.kotlin.konan.library.resolver.*
|
||||||
import org.jetbrains.kotlin.konan.util.WithLogger
|
import org.jetbrains.kotlin.konan.util.WithLogger
|
||||||
|
import org.jetbrains.kotlin.library.UnresolvedLibrary
|
||||||
|
import org.jetbrains.kotlin.library.unresolvedDependencies
|
||||||
|
|
||||||
internal class KonanLibraryResolverImpl(
|
internal class KonanLibraryResolverImpl(
|
||||||
override val searchPathResolver: SearchPathResolverWithTarget
|
override val searchPathResolver: SearchPathResolverWithTarget
|
||||||
): KonanLibraryResolver, WithLogger by searchPathResolver {
|
): KonanLibraryResolver, WithLogger by searchPathResolver {
|
||||||
|
|
||||||
override fun resolveWithDependencies(
|
override fun resolveWithDependencies(
|
||||||
unresolvedLibraries: List<UnresolvedLibrary>,
|
unresolvedLibraries: List<UnresolvedLibrary>,
|
||||||
noStdLib: Boolean,
|
noStdLib: Boolean,
|
||||||
noDefaultLibs: Boolean
|
noDefaultLibs: Boolean
|
||||||
) = findLibraries(unresolvedLibraries, noStdLib, noDefaultLibs)
|
) = findLibraries(unresolvedLibraries, noStdLib, noDefaultLibs)
|
||||||
.leaveDistinct()
|
.leaveDistinct()
|
||||||
.resolveDependencies()
|
.resolveDependencies()
|
||||||
|
|||||||
@@ -27,3 +27,7 @@ konanVersion=1.3.50
|
|||||||
org.gradle.jvmargs='-Dfile.encoding=UTF-8'
|
org.gradle.jvmargs='-Dfile.encoding=UTF-8'
|
||||||
org.gradle.workers.max=4
|
org.gradle.workers.max=4
|
||||||
#kotlinProjectPath=/Users/jetbrains/IdeaProjects/kotlin
|
#kotlinProjectPath=/Users/jetbrains/IdeaProjects/kotlin
|
||||||
|
#sharedProjectPath=/Users/jetbrains/IdeaProjects/kotlin-native-shared
|
||||||
|
kotlinProjectPath=/Users/jetbrains/kotlin-native/kotlin
|
||||||
|
#sharedProjectPath=/Users/jetbrains/kotlin-native/kotlin-native-shared/kotlin-native-shared
|
||||||
|
|
||||||
|
|||||||
@@ -12,14 +12,12 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
|
|||||||
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
import org.jetbrains.kotlin.descriptors.konan.isKonanStdlib
|
import org.jetbrains.kotlin.descriptors.konan.isKonanStdlib
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.KLIB_FILE_EXTENSION_WITH_DOT
|
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION_WITH_DOT
|
||||||
import org.jetbrains.kotlin.konan.library.createKonanLibrary
|
|
||||||
import org.jetbrains.kotlin.konan.library.resolverByName
|
import org.jetbrains.kotlin.konan.library.resolverByName
|
||||||
import org.jetbrains.kotlin.konan.target.Distribution
|
import org.jetbrains.kotlin.konan.target.Distribution
|
||||||
import org.jetbrains.kotlin.konan.target.PlatformManager
|
import org.jetbrains.kotlin.konan.target.PlatformManager
|
||||||
import org.jetbrains.kotlin.konan.util.DependencyProcessor
|
import org.jetbrains.kotlin.konan.util.DependencyProcessor
|
||||||
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
import org.jetbrains.kotlin.library.unpackZippedKonanLibraryTo
|
||||||
import org.jetbrains.kotlin.konan.library.unpackZippedKonanLibraryTo
|
|
||||||
import org.jetbrains.kotlin.konan.utils.KonanFactories.DefaultDeserializedDescriptorFactory
|
import org.jetbrains.kotlin.konan.utils.KonanFactories.DefaultDeserializedDescriptorFactory
|
||||||
import org.jetbrains.kotlin.konan.util.Logger
|
import org.jetbrains.kotlin.konan.util.Logger
|
||||||
import org.jetbrains.kotlin.metadata.konan.KonanProtoBuf
|
import org.jetbrains.kotlin.metadata.konan.KonanProtoBuf
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ if (hasProperty("kotlinProjectPath")) {
|
|||||||
substitute module('org.jetbrains.kotlin:kotlin-compiler') with project(':include:kotlin-compiler')
|
substitute module('org.jetbrains.kotlin:kotlin-compiler') with project(':include:kotlin-compiler')
|
||||||
substitute module("org.jetbrains.kotlin:kotlin-stdlib-common:$kotlinVersion") with project(':include:kotlin-stdlib-common-sources')
|
substitute module("org.jetbrains.kotlin:kotlin-stdlib-common:$kotlinVersion") with project(':include:kotlin-stdlib-common-sources')
|
||||||
substitute module("org.jetbrains.kotlin:kotlin-stdlib-gen:$kotlinVersion") with project(':tools:kotlin-stdlib-gen')
|
substitute module("org.jetbrains.kotlin:kotlin-stdlib-gen:$kotlinVersion") with project(':tools:kotlin-stdlib-gen')
|
||||||
|
substitute module("org.jetbrains.kotlin:kotlin-util-io:$kotlinVersion") with project(':kotlin-util-io')
|
||||||
|
substitute module("org.jetbrains.kotlin:kotlin-util-klib:$kotlinVersion") with project(':kotlin-util-klib')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,4 +63,6 @@ jar {
|
|||||||
dependencies {
|
dependencies {
|
||||||
compile "org.jetbrains.kotlin:kotlin-stdlib:$buildKotlinVersion"
|
compile "org.jetbrains.kotlin:kotlin-stdlib:$buildKotlinVersion"
|
||||||
compile "org.jetbrains.kotlin:kotlin-native-utils:$kotlinVersion"
|
compile "org.jetbrains.kotlin:kotlin-native-utils:$kotlinVersion"
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-util-io:$kotlinVersion"
|
||||||
|
compile "org.jetbrains.kotlin:kotlin-util-klib:$kotlinVersion"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,63 +3,30 @@ package org.jetbrains.kotlin.konan.library
|
|||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.properties.Properties
|
import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
import org.jetbrains.kotlin.konan.properties.propertyList
|
import org.jetbrains.kotlin.konan.properties.propertyList
|
||||||
|
import org.jetbrains.kotlin.library.*
|
||||||
|
|
||||||
const val KLIB_PROPERTY_ABI_VERSION = "abi_version"
|
|
||||||
const val KLIB_PROPERTY_COMPILER_VERSION = "compiler_version"
|
|
||||||
const val KLIB_PROPERTY_DEPENDENCY_VERSION = "dependency_version"
|
|
||||||
const val KLIB_PROPERTY_LIBRARY_VERSION = "library_version"
|
|
||||||
const val KLIB_PROPERTY_UNIQUE_NAME = "unique_name"
|
|
||||||
const val KLIB_PROPERTY_LINKED_OPTS = "linkerOpts"
|
const val KLIB_PROPERTY_LINKED_OPTS = "linkerOpts"
|
||||||
const val KLIB_PROPERTY_DEPENDS = "depends"
|
|
||||||
const val KLIB_PROPERTY_INTEROP = "interop"
|
const val KLIB_PROPERTY_INTEROP = "interop"
|
||||||
const val KLIB_PROPERTY_PACKAGE = "package"
|
|
||||||
const val KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS = "exportForwardDeclarations"
|
const val KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS = "exportForwardDeclarations"
|
||||||
const val KLIB_PROPERTY_INCLUDED_HEADERS = "includedHeaders"
|
const val KLIB_PROPERTY_INCLUDED_HEADERS = "includedHeaders"
|
||||||
|
|
||||||
/**
|
interface TargetedLibrary {
|
||||||
* An abstraction for getting access to the information stored inside of Kotlin/Native library.
|
|
||||||
*/
|
|
||||||
interface KonanLibrary {
|
|
||||||
|
|
||||||
val libraryName: String
|
|
||||||
val libraryFile: File
|
|
||||||
|
|
||||||
// Whether this library is default (provided by Kotlin/Native distribution)?
|
|
||||||
val isDefault: Boolean
|
|
||||||
|
|
||||||
// Properties:
|
|
||||||
val manifestProperties: Properties
|
|
||||||
val linkerOpts: List<String>
|
|
||||||
|
|
||||||
// Paths:
|
|
||||||
val bitcodePaths: List<String>
|
|
||||||
val includedPaths: List<String>
|
|
||||||
|
|
||||||
val targetList: List<String>
|
val targetList: List<String>
|
||||||
val versions: KonanLibraryVersioning
|
val includedPaths: List<String>
|
||||||
|
|
||||||
val dataFlowGraph: ByteArray?
|
|
||||||
val moduleHeaderData: ByteArray
|
|
||||||
fun packageMetadataParts(fqName: String): Set<String>
|
|
||||||
fun packageMetadata(fqName: String, partName: String): ByteArray
|
|
||||||
|
|
||||||
val irHeader: ByteArray?
|
|
||||||
fun irDeclaration(index: Long, isLocal: Boolean): ByteArray
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val KonanLibrary.uniqueName
|
interface BitcodeLibrary : TargetedLibrary {
|
||||||
get() = manifestProperties.getProperty(KLIB_PROPERTY_UNIQUE_NAME)!!
|
val bitcodePaths: List<String>
|
||||||
|
}
|
||||||
|
|
||||||
val KonanLibrary.unresolvedDependencies: List<UnresolvedLibrary>
|
interface KonanLibrary : BitcodeLibrary, KotlinLibrary {
|
||||||
get() = manifestProperties.propertyList(KLIB_PROPERTY_DEPENDS, escapeInQuotes = true)
|
val linkerOpts: List<String>
|
||||||
.map {
|
}
|
||||||
UnresolvedLibrary(it, manifestProperties.getProperty("dependency_version_$it"))
|
|
||||||
}
|
|
||||||
|
|
||||||
val KonanLibrary.isInterop
|
val KonanLibrary.isInterop
|
||||||
get() = manifestProperties.getProperty(KLIB_PROPERTY_INTEROP) == "true"
|
get() = manifestProperties.getProperty(KLIB_PROPERTY_INTEROP) == "true"
|
||||||
|
|
||||||
val KonanLibrary.packageFqName
|
val KonanLibrary.packageFqName: String?
|
||||||
get() = manifestProperties.getProperty(KLIB_PROPERTY_PACKAGE)
|
get() = manifestProperties.getProperty(KLIB_PROPERTY_PACKAGE)
|
||||||
|
|
||||||
val KonanLibrary.exportForwardDeclarations
|
val KonanLibrary.exportForwardDeclarations
|
||||||
|
|||||||
+16
-37
@@ -18,55 +18,34 @@ package org.jetbrains.kotlin.konan.library
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
|
import org.jetbrains.kotlin.library.IrKotlinLibraryLayout
|
||||||
|
import org.jetbrains.kotlin.library.KotlinLibraryLayout
|
||||||
|
import org.jetbrains.kotlin.library.MetadataKotlinLibraryLayout
|
||||||
|
|
||||||
/**
|
|
||||||
* This scheme describes the Kotlin/Native Library (KLIB) layout.
|
|
||||||
*/
|
|
||||||
interface KonanLibraryLayout {
|
|
||||||
|
|
||||||
val libraryName: String
|
interface TargetedKotlinLibraryLayout : KotlinLibraryLayout {
|
||||||
|
|
||||||
val libDir: File
|
|
||||||
val target: KonanTarget?
|
val target: KonanTarget?
|
||||||
// This is a default implementation. Can't make it an assignment.
|
// This is a default implementation. Can't make it an assignment.
|
||||||
get() = null
|
get() = null
|
||||||
|
|
||||||
val manifestFile
|
|
||||||
get() = File(libDir, "manifest")
|
|
||||||
val resourcesDir
|
|
||||||
get() = File(libDir, "resources")
|
|
||||||
|
|
||||||
val targetsDir
|
val targetsDir
|
||||||
get() = File(libDir, "targets")
|
get() = File(libDir, "targets")
|
||||||
val targetDir
|
val targetDir
|
||||||
get() = File(targetsDir, target!!.visibleName)
|
get() = File(targetsDir, target!!.visibleName)
|
||||||
|
val includedDir
|
||||||
|
get() = File(targetDir, "included")
|
||||||
|
}
|
||||||
|
|
||||||
|
interface BitcodeKotlinLibraryLayout : TargetedKotlinLibraryLayout, KotlinLibraryLayout {
|
||||||
val kotlinDir
|
val kotlinDir
|
||||||
get() = File(targetDir, "kotlin")
|
get() = File(targetDir, "kotlin")
|
||||||
val nativeDir
|
val nativeDir
|
||||||
get() = File(targetDir, "native")
|
get() = File(targetDir, "native")
|
||||||
val includedDir
|
// TODO: Experiment with separate bitcode files.
|
||||||
get() = File(targetDir, "included")
|
// Per package or per class.
|
||||||
|
val mainBitcodeFile
|
||||||
val linkdataDir
|
get() = File(kotlinDir, "program.kt.bc")
|
||||||
get() = File(libDir, "linkdata")
|
val mainBitcodeFileName
|
||||||
val moduleHeaderFile
|
get() = mainBitcodeFile.path
|
||||||
get() = File(linkdataDir, "module")
|
|
||||||
val dataFlowGraphFile
|
|
||||||
get() = File(linkdataDir, "module_data_flow_graph")
|
|
||||||
|
|
||||||
fun packageFragmentsDir(packageName: String)
|
|
||||||
= File(linkdataDir, if (packageName == "") "root_package" else "package_$packageName")
|
|
||||||
|
|
||||||
fun packageFragmentFile(packageFqName: String, partName: String) =
|
|
||||||
File(packageFragmentsDir(packageFqName), "$partName$KLIB_METADATA_FILE_EXTENSION_WITH_DOT")
|
|
||||||
val irDir
|
|
||||||
get() = File(libDir, "ir")
|
|
||||||
val irFile
|
|
||||||
get() = File(irDir, "irCombined.knd")
|
|
||||||
val irHeader
|
|
||||||
get() = File(irDir, "irHeaders.kni")
|
|
||||||
val irIndex: File
|
|
||||||
get() = File(irDir, "uniqIdTableDump.txt")
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface KonanLibraryLayout : MetadataKotlinLibraryLayout, BitcodeKotlinLibraryLayout, IrKotlinLibraryLayout
|
||||||
|
|||||||
@@ -1,49 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.konan.library
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
|
||||||
import org.jetbrains.kotlin.konan.file.file
|
|
||||||
import org.jetbrains.kotlin.konan.file.withMutableZipFileSystem
|
|
||||||
import org.jetbrains.kotlin.konan.library.impl.DefaultMetadataReaderImpl
|
|
||||||
import org.jetbrains.kotlin.konan.library.impl.KonanLibraryImpl
|
|
||||||
import org.jetbrains.kotlin.konan.library.impl.zippedKonanLibraryChecks
|
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
|
||||||
|
|
||||||
const val KLIB_FILE_EXTENSION = "klib"
|
|
||||||
const val KLIB_FILE_EXTENSION_WITH_DOT = ".$KLIB_FILE_EXTENSION"
|
|
||||||
|
|
||||||
const val KLIB_METADATA_FILE_EXTENSION = "knm"
|
|
||||||
const val KLIB_METADATA_FILE_EXTENSION_WITH_DOT = ".$KLIB_METADATA_FILE_EXTENSION"
|
|
||||||
|
|
||||||
fun File.unpackZippedKonanLibraryTo(newDir: File) {
|
|
||||||
|
|
||||||
// First, run validity checks for the given KLIB file.
|
|
||||||
zippedKonanLibraryChecks(this)
|
|
||||||
|
|
||||||
if (newDir.exists) {
|
|
||||||
if (newDir.isDirectory)
|
|
||||||
newDir.deleteRecursively()
|
|
||||||
else
|
|
||||||
newDir.delete()
|
|
||||||
}
|
|
||||||
|
|
||||||
this.withMutableZipFileSystem {
|
|
||||||
it.file("/").recursiveCopyTo(newDir)
|
|
||||||
}
|
|
||||||
check(newDir.exists) { "Could not unpack $this as $newDir." }
|
|
||||||
}
|
|
||||||
|
|
||||||
val List<String>.toUnresolvedLibraries
|
|
||||||
get() = this.map {
|
|
||||||
|
|
||||||
val version = it.substringAfterLast('@', "")
|
|
||||||
.let { if (it.isEmpty()) null else it}
|
|
||||||
val name = it.substringBeforeLast('@')
|
|
||||||
UnresolvedLibrary(name, version)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun createKonanLibrary(
|
|
||||||
libraryFile: File,
|
|
||||||
target: KonanTarget? = null,
|
|
||||||
isDefault: Boolean = false,
|
|
||||||
metadataReader: MetadataReader = DefaultMetadataReaderImpl
|
|
||||||
): KonanLibrary = KonanLibraryImpl(libraryFile, target, isDefault, metadataReader)
|
|
||||||
-28
@@ -1,28 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.konan.library
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
|
||||||
import org.jetbrains.kotlin.konan.parseKonanVersion
|
|
||||||
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
|
||||||
import org.jetbrains.kotlin.konan.properties.Properties
|
|
||||||
import org.jetbrains.kotlin.konan.parseKonanAbiVersion
|
|
||||||
|
|
||||||
|
|
||||||
data class KonanLibraryVersioning(
|
|
||||||
val libraryVersion: String?,
|
|
||||||
val compilerVersion: KonanVersion?,
|
|
||||||
val abiVersion: KonanAbiVersion?
|
|
||||||
)
|
|
||||||
|
|
||||||
fun Properties.writeKonanLibraryVersioning(versions: KonanLibraryVersioning) {
|
|
||||||
versions.abiVersion ?. let { this.setProperty(KLIB_PROPERTY_ABI_VERSION, it.toString()) }
|
|
||||||
versions.libraryVersion ?. let { this.setProperty(KLIB_PROPERTY_LIBRARY_VERSION, it) }
|
|
||||||
versions.compilerVersion ?. let { this.setProperty(KLIB_PROPERTY_COMPILER_VERSION, "${versions.compilerVersion.toString(true, true)}") }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun Properties.readKonanLibraryVersioning(): KonanLibraryVersioning {
|
|
||||||
val abiVersion = this.getProperty(KLIB_PROPERTY_ABI_VERSION)?.parseKonanAbiVersion()
|
|
||||||
val libraryVersion = this.getProperty(KLIB_PROPERTY_LIBRARY_VERSION)
|
|
||||||
val compilerVersion = this.getProperty(KLIB_PROPERTY_COMPILER_VERSION)?.parseKonanVersion()
|
|
||||||
|
|
||||||
return KonanLibraryVersioning(abiVersion = abiVersion, libraryVersion = libraryVersion, compilerVersion = compilerVersion)
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.konan.library
|
|
||||||
|
|
||||||
interface MetadataReader {
|
|
||||||
fun loadSerializedModule(libraryLayout: KonanLibraryLayout): ByteArray
|
|
||||||
fun loadSerializedPackageFragment(libraryLayout: KonanLibraryLayout, fqName: String, partName: String): ByteArray
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
package org.jetbrains.kotlin.konan.library
|
package org.jetbrains.kotlin.konan.library
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.KonanAbiVersion
|
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.KonanVersion
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.impl.KonanLibraryImpl
|
import org.jetbrains.kotlin.konan.library.impl.KonanLibraryImpl
|
||||||
|
import org.jetbrains.kotlin.konan.library.impl.createKonanLibrary
|
||||||
import org.jetbrains.kotlin.konan.target.Distribution
|
import org.jetbrains.kotlin.konan.target.Distribution
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.konan.util.*
|
import org.jetbrains.kotlin.konan.util.*
|
||||||
import kotlin.system.exitProcess
|
import kotlin.system.exitProcess
|
||||||
|
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION_WITH_DOT
|
||||||
|
import org.jetbrains.kotlin.library.KotlinAbiVersion
|
||||||
|
import org.jetbrains.kotlin.library.UnresolvedLibrary
|
||||||
|
import org.jetbrains.kotlin.library.uniqueName
|
||||||
|
|
||||||
// FIXME(ddol): KLIB-REFACTORING-CLEANUP: remove the constants below:
|
// FIXME(ddol): KLIB-REFACTORING-CLEANUP: remove the constants below:
|
||||||
const val KONAN_STDLIB_NAME = "stdlib"
|
const val KONAN_STDLIB_NAME = "stdlib"
|
||||||
@@ -24,7 +28,7 @@ interface SearchPathResolver : WithLogger {
|
|||||||
// FIXME(ddol): KLIB-REFACTORING-CLEANUP: remove this interface!
|
// FIXME(ddol): KLIB-REFACTORING-CLEANUP: remove this interface!
|
||||||
interface SearchPathResolverWithTarget: SearchPathResolver {
|
interface SearchPathResolverWithTarget: SearchPathResolver {
|
||||||
val target: KonanTarget
|
val target: KonanTarget
|
||||||
val knownAbiVersions: List<KonanAbiVersion>?
|
val knownAbiVersions: List<KotlinAbiVersion>?
|
||||||
val knownCompilerVersions: List<KonanVersion>?
|
val knownCompilerVersions: List<KonanVersion>?
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +51,7 @@ fun defaultResolver(
|
|||||||
repositories,
|
repositories,
|
||||||
directLibs,
|
directLibs,
|
||||||
target,
|
target,
|
||||||
listOf(KonanAbiVersion.CURRENT),
|
listOf(KotlinAbiVersion.CURRENT),
|
||||||
compatibleCompilerVersions,
|
compatibleCompilerVersions,
|
||||||
distribution.klib,
|
distribution.klib,
|
||||||
distribution.localKonanDir.absolutePath,
|
distribution.localKonanDir.absolutePath,
|
||||||
@@ -179,7 +183,7 @@ internal class KonanLibraryProperResolver(
|
|||||||
repositories: List<String>,
|
repositories: List<String>,
|
||||||
directLibs: List<String>,
|
directLibs: List<String>,
|
||||||
override val target: KonanTarget,
|
override val target: KonanTarget,
|
||||||
override val knownAbiVersions: List<KonanAbiVersion>?,
|
override val knownAbiVersions: List<KotlinAbiVersion>?,
|
||||||
override val knownCompilerVersions: List<KonanVersion>?,
|
override val knownCompilerVersions: List<KonanVersion>?,
|
||||||
distributionKlib: String?,
|
distributionKlib: String?,
|
||||||
localKonanDir: String?,
|
localKonanDir: String?,
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.konan.library
|
|
||||||
|
|
||||||
data class UnresolvedLibrary(
|
|
||||||
val path: String,
|
|
||||||
val libraryVersion: String?) {
|
|
||||||
|
|
||||||
fun substitutePath(newPath: String): UnresolvedLibrary {
|
|
||||||
return UnresolvedLibrary(newPath, libraryVersion)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-94
@@ -1,94 +0,0 @@
|
|||||||
/**
|
|
||||||
* Copyright 2010-2019 JetBrains s.r.o.
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.konan.library.impl
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.file.File
|
|
||||||
import java.io.RandomAccessFile
|
|
||||||
import java.nio.channels.FileChannel
|
|
||||||
|
|
||||||
data class DeclarationId(val id: Long, val isLocal: Boolean)
|
|
||||||
|
|
||||||
class CombinedIrFileReader(file: File) {
|
|
||||||
private val buffer = file.map(FileChannel.MapMode.READ_ONLY)
|
|
||||||
private val declarationToOffsetSize = mutableMapOf<DeclarationId, Pair<Int, Int>>()
|
|
||||||
|
|
||||||
init {
|
|
||||||
val declarationsCount = buffer.int
|
|
||||||
for (i in 0 until declarationsCount) {
|
|
||||||
val id = buffer.long
|
|
||||||
val isLocal = buffer.int != 0
|
|
||||||
val offset = buffer.int
|
|
||||||
val size = buffer.int
|
|
||||||
declarationToOffsetSize[DeclarationId(id, isLocal)] = offset to size
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun declarationBytes(id: DeclarationId): ByteArray {
|
|
||||||
val offsetSize = declarationToOffsetSize[id] ?: throw Error("No declaration with $id here")
|
|
||||||
val result = ByteArray(offsetSize.second)
|
|
||||||
buffer.position(offsetSize.first)
|
|
||||||
buffer.get(result, 0, offsetSize.second)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private const val SINGLE_INDEX_RECORD_SIZE = 20 // sizeof(Long) + 3 * sizeof(Int).
|
|
||||||
private const val INDEX_HEADER_SIZE = 4 // sizeof(Int).
|
|
||||||
|
|
||||||
class CombinedIrFileWriter(val declarationCount: Int) {
|
|
||||||
private var currentDeclaration = 0
|
|
||||||
private var currentPosition = 0
|
|
||||||
private val file = org.jetbrains.kotlin.konan.file.createTempFile("ir").deleteOnExit()
|
|
||||||
private val randomAccessFile = RandomAccessFile(file.path, "rw")
|
|
||||||
|
|
||||||
init {
|
|
||||||
randomAccessFile.writeInt(declarationCount)
|
|
||||||
assert(randomAccessFile.filePointer.toInt() == INDEX_HEADER_SIZE)
|
|
||||||
for (i in 0 until declarationCount) {
|
|
||||||
randomAccessFile.writeLong(-1) // id
|
|
||||||
randomAccessFile.writeInt(-1) // isLocal
|
|
||||||
randomAccessFile.writeInt(-1) // offset
|
|
||||||
randomAccessFile.writeInt(-1) // size
|
|
||||||
}
|
|
||||||
currentPosition = randomAccessFile.filePointer.toInt()
|
|
||||||
assert(currentPosition == INDEX_HEADER_SIZE + SINGLE_INDEX_RECORD_SIZE * declarationCount)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun skipDeclaration() {
|
|
||||||
currentDeclaration++
|
|
||||||
}
|
|
||||||
|
|
||||||
fun addDeclaration(id: DeclarationId, bytes: ByteArray) {
|
|
||||||
randomAccessFile.seek((currentDeclaration * SINGLE_INDEX_RECORD_SIZE + INDEX_HEADER_SIZE).toLong())
|
|
||||||
randomAccessFile.writeLong(id.id)
|
|
||||||
randomAccessFile.writeInt(if (id.isLocal) 1 else 0)
|
|
||||||
randomAccessFile.writeInt(currentPosition)
|
|
||||||
randomAccessFile.writeInt(bytes.size)
|
|
||||||
randomAccessFile.seek(currentPosition.toLong())
|
|
||||||
randomAccessFile.write(bytes)
|
|
||||||
assert(randomAccessFile.filePointer < Int.MAX_VALUE.toLong())
|
|
||||||
currentPosition = randomAccessFile.filePointer.toInt()
|
|
||||||
currentDeclaration++
|
|
||||||
}
|
|
||||||
|
|
||||||
fun finishWriting(): File {
|
|
||||||
assert(currentDeclaration == declarationCount)
|
|
||||||
randomAccessFile.close()
|
|
||||||
return file
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-14
@@ -1,14 +0,0 @@
|
|||||||
package org.jetbrains.kotlin.konan.library.impl
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibraryLayout
|
|
||||||
import org.jetbrains.kotlin.konan.library.MetadataReader
|
|
||||||
|
|
||||||
internal object DefaultMetadataReaderImpl : MetadataReader {
|
|
||||||
|
|
||||||
override fun loadSerializedModule(libraryLayout: KonanLibraryLayout): ByteArray =
|
|
||||||
libraryLayout.moduleHeaderFile.readBytes()
|
|
||||||
|
|
||||||
override fun loadSerializedPackageFragment(libraryLayout: KonanLibraryLayout, fqName: String, partName: String): ByteArray =
|
|
||||||
libraryLayout.packageFragmentFile(fqName, partName).readBytes()
|
|
||||||
|
|
||||||
}
|
|
||||||
+65
-67
@@ -24,82 +24,80 @@ import org.jetbrains.kotlin.konan.properties.propertyList
|
|||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.konan.util.defaultTargetSubstitutions
|
import org.jetbrains.kotlin.konan.util.defaultTargetSubstitutions
|
||||||
import org.jetbrains.kotlin.konan.util.substitute
|
import org.jetbrains.kotlin.konan.util.substitute
|
||||||
|
import org.jetbrains.kotlin.library.*
|
||||||
|
import org.jetbrains.kotlin.library.impl.*
|
||||||
|
|
||||||
class KonanLibraryImpl(
|
open class TargetedLibraryImpl(
|
||||||
override val libraryFile: File,
|
private val access: TargetedLibraryAccess<TargetedKotlinLibraryLayout>,
|
||||||
internal val target: KonanTarget?,
|
private val base: BaseKotlinLibrary
|
||||||
override val isDefault: Boolean,
|
) : TargetedLibrary, BaseKotlinLibrary by base {
|
||||||
private val metadataReader: MetadataReader
|
|
||||||
) : KonanLibrary {
|
|
||||||
|
|
||||||
// For the zipped libraries inPlace gives files from zip file system
|
private val target: KonanTarget? get() = access.target
|
||||||
// whereas realFiles extracts them to /tmp.
|
|
||||||
// For unzipped libraries inPlace and realFiles are the same
|
|
||||||
// providing files in the library directory.
|
|
||||||
|
|
||||||
private val layout = createKonanLibraryLayout(libraryFile, target)
|
override val targetList by lazy {
|
||||||
|
access.inPlace { it: TargetedKotlinLibraryLayout ->
|
||||||
override val libraryName: String by lazy { layout.inPlace { it.libraryName } }
|
it.targetsDir.listFiles.map {
|
||||||
|
it.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override val manifestProperties: Properties by lazy {
|
override val manifestProperties: Properties by lazy {
|
||||||
val properties = layout.inPlace { it.manifestFile.loadProperties() }
|
val properties = access.inPlace {
|
||||||
if (target != null) substitute(properties, defaultTargetSubstitutions(target))
|
it.manifestFile.loadProperties()
|
||||||
|
}
|
||||||
|
target?.let { substitute(properties, defaultTargetSubstitutions(it)) }
|
||||||
properties
|
properties
|
||||||
}
|
}
|
||||||
|
|
||||||
override val versions: KonanLibraryVersioning
|
override val includedPaths: List<String>
|
||||||
get() = manifestProperties.readKonanLibraryVersioning()
|
get() = access.realFiles {
|
||||||
|
it.includedDir.listFilesOrEmpty.map { it.absolutePath }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class BitcodeLibraryImpl(
|
||||||
|
private val access: BitcodeLibraryAccess<BitcodeKotlinLibraryLayout>,
|
||||||
|
targeted: TargetedLibrary
|
||||||
|
) : BitcodeLibrary, TargetedLibrary by targeted {
|
||||||
|
override val bitcodePaths: List<String>
|
||||||
|
get() = access.realFiles { it: BitcodeKotlinLibraryLayout ->
|
||||||
|
(it.kotlinDir.listFilesOrEmpty + it.nativeDir.listFilesOrEmpty).map { it.absolutePath }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class KonanLibraryImpl(
|
||||||
|
targeted: TargetedLibraryImpl,
|
||||||
|
metadata: MetadataLibraryImpl,
|
||||||
|
ir: IrLibraryImpl,
|
||||||
|
bitcode: BitcodeLibraryImpl
|
||||||
|
) : KonanLibrary,
|
||||||
|
BaseKotlinLibrary by targeted,
|
||||||
|
MetadataLibrary by metadata,
|
||||||
|
IrLibrary by ir,
|
||||||
|
BitcodeLibrary by bitcode {
|
||||||
|
|
||||||
override val linkerOpts: List<String>
|
override val linkerOpts: List<String>
|
||||||
get() = manifestProperties.propertyList(KLIB_PROPERTY_LINKED_OPTS, escapeInQuotes = true)
|
get() = manifestProperties.propertyList(KLIB_PROPERTY_LINKED_OPTS, escapeInQuotes = true)
|
||||||
|
|
||||||
override val bitcodePaths: List<String>
|
|
||||||
get() = layout.realFiles { (it.kotlinDir.listFilesOrEmpty + it.nativeDir.listFilesOrEmpty).map { it.absolutePath } }
|
|
||||||
|
|
||||||
override val includedPaths: List<String>
|
|
||||||
get() = layout.realFiles { it.includedDir.listFilesOrEmpty.map { it.absolutePath } }
|
|
||||||
|
|
||||||
override val targetList by lazy { layout.inPlace { it.targetsDir.listFiles.map { it.name } } }
|
|
||||||
|
|
||||||
override val dataFlowGraph by lazy { layout.inPlace { it.dataFlowGraphFile.let { if (it.exists) it.readBytes() else null } } }
|
|
||||||
|
|
||||||
override val moduleHeaderData: ByteArray by lazy { layout.inPlace { metadataReader.loadSerializedModule(it) } }
|
|
||||||
|
|
||||||
override fun packageMetadata(packageFqName: String, partName: String) =
|
|
||||||
layout.inPlace { metadataReader.loadSerializedPackageFragment(it, packageFqName, partName) }
|
|
||||||
|
|
||||||
override fun packageMetadataParts(fqName: String): Set<String> =
|
|
||||||
layout.inPlace { inPlaceLayout ->
|
|
||||||
val fileList =
|
|
||||||
inPlaceLayout.packageFragmentsDir(fqName)
|
|
||||||
.listFiles
|
|
||||||
.mapNotNull {
|
|
||||||
it.name
|
|
||||||
.substringBeforeLast(KLIB_METADATA_FILE_EXTENSION_WITH_DOT, missingDelimiterValue = "")
|
|
||||||
.takeIf { it.isNotEmpty() }
|
|
||||||
}
|
|
||||||
|
|
||||||
fileList.toSortedSet().also {
|
|
||||||
require(it.size == fileList.size) { "Duplicated names: ${fileList.groupingBy { it }.eachCount().filter { (_, count) -> count > 1 }}" }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override val irHeader: ByteArray? by lazy { layout.inPlace { library -> library.irHeader.let {
|
|
||||||
if (it.exists) loadIrHeader() else null }
|
|
||||||
}}
|
|
||||||
|
|
||||||
override fun irDeclaration(index: Long, isLocal: Boolean) = loadIrDeclaraton(index, isLocal)
|
|
||||||
|
|
||||||
override fun toString() = "$libraryName[default=$isDefault]"
|
|
||||||
|
|
||||||
private val combinedDeclarations: CombinedIrFileReader by lazy {
|
|
||||||
CombinedIrFileReader(layout.realFiles {
|
|
||||||
it.irFile
|
|
||||||
})
|
|
||||||
}
|
|
||||||
private fun loadIrHeader(): ByteArray =
|
|
||||||
layout.inPlace { it.irHeader.readBytes() }
|
|
||||||
|
|
||||||
private fun loadIrDeclaraton(index: Long, isLocal: Boolean) =
|
|
||||||
combinedDeclarations.declarationBytes(DeclarationId(index, isLocal))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun createKonanLibrary(
|
||||||
|
libraryFile: File,
|
||||||
|
target: KonanTarget? = null,
|
||||||
|
isDefault: Boolean = false
|
||||||
|
): KonanLibrary {
|
||||||
|
val baseAccess = BaseLibraryAccess<KotlinLibraryLayout>(libraryFile)
|
||||||
|
val targetedAccess = TargetedLibraryAccess<TargetedKotlinLibraryLayout>(libraryFile, target)
|
||||||
|
val metadataAccess = MetadataLibraryAccess<MetadataKotlinLibraryLayout>(libraryFile)
|
||||||
|
val irAccess = IrLibraryAccess<IrKotlinLibraryLayout>(libraryFile)
|
||||||
|
val bitcodeAccess = BitcodeLibraryAccess<BitcodeKotlinLibraryLayout>(libraryFile, target)
|
||||||
|
|
||||||
|
val base = BaseKotlinLibraryImpl(baseAccess, isDefault)
|
||||||
|
val targeted = TargetedLibraryImpl(targetedAccess, base)
|
||||||
|
val metadata = MetadataLibraryImpl(metadataAccess)
|
||||||
|
val ir = IrLibraryImpl(irAccess)
|
||||||
|
val bitcode = BitcodeLibraryImpl(bitcodeAccess, targeted)
|
||||||
|
|
||||||
|
return KonanLibraryImpl(targeted, metadata, ir, bitcode)
|
||||||
|
}
|
||||||
+47
-79
@@ -1,93 +1,61 @@
|
|||||||
package org.jetbrains.kotlin.konan.library.impl
|
package org.jetbrains.kotlin.konan.library.impl
|
||||||
|
|
||||||
import org.jetbrains.kotlin.konan.file.*
|
import org.jetbrains.kotlin.konan.file.File
|
||||||
import org.jetbrains.kotlin.konan.library.KLIB_FILE_EXTENSION
|
import org.jetbrains.kotlin.konan.library.*
|
||||||
import org.jetbrains.kotlin.konan.library.KLIB_FILE_EXTENSION_WITH_DOT
|
|
||||||
import org.jetbrains.kotlin.konan.library.KonanLibraryLayout
|
|
||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.konan.util.removeSuffixIfPresent
|
import org.jetbrains.kotlin.library.*
|
||||||
|
import org.jetbrains.kotlin.library.impl.*
|
||||||
import java.nio.file.FileSystem
|
import java.nio.file.FileSystem
|
||||||
|
|
||||||
interface KonanLibraryLayoutImpl: KonanLibraryLayout {
|
open class TargetedLibraryLayoutImpl(klib: File, override val target: KonanTarget?) :
|
||||||
fun <T> inPlace(action: (KonanLibraryLayout) -> T): T
|
KotlinLibraryLayoutImpl(klib), TargetedKotlinLibraryLayout {
|
||||||
fun <T> realFiles (action: (KonanLibraryLayout) -> T): T
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ZippedKonanLibraryLayout(val klibFile: File, override val target: KonanTarget?): KonanLibraryLayoutImpl {
|
override val extractingToTemp: TargetedKotlinLibraryLayout by lazy {
|
||||||
|
ExtractingTargetedLibraryImpl(this)
|
||||||
init { zippedKonanLibraryChecks(klibFile) }
|
|
||||||
|
|
||||||
override val libraryName = klibFile.path.removeSuffixIfPresent(KLIB_FILE_EXTENSION_WITH_DOT)
|
|
||||||
|
|
||||||
override val libDir = File("/")
|
|
||||||
|
|
||||||
override fun <T> realFiles(action: (KonanLibraryLayout) -> T): T {
|
|
||||||
return action(FileExtractor(this))!!
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun <T> inPlace(action: (KonanLibraryLayout) -> T): T {
|
override fun directlyFromZip(zipFileSystem: FileSystem): TargetedKotlinLibraryLayout =
|
||||||
return klibFile.withZipFileSystem { zipFileSystem ->
|
FromZipTargetedLibraryImpl(this, zipFileSystem)
|
||||||
action(DirectFromZip(this, zipFileSystem))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun zippedKonanLibraryChecks(klibFile: File) {
|
class BitcodeLibraryLayoutImpl(klib: File, target: KonanTarget?) : TargetedLibraryLayoutImpl(klib, target),
|
||||||
check(klibFile.exists) { "Could not find $klibFile." }
|
BitcodeKotlinLibraryLayout {
|
||||||
check(klibFile.isFile) { "Expected $klibFile to be a regular file." }
|
override val extractingToTemp: BitcodeKotlinLibraryLayout by lazy {
|
||||||
|
ExtractingBitcodeLibraryImpl(this)
|
||||||
val extension = klibFile.extension
|
|
||||||
check(extension.isEmpty() || extension == KLIB_FILE_EXTENSION) {
|
|
||||||
"KLIB path has unexpected extension: $klibFile"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class UnzippedKonanLibraryLayout(override val libDir: File, override val target: KonanTarget?): KonanLibraryLayoutImpl {
|
|
||||||
override val libraryName = libDir.path
|
|
||||||
|
|
||||||
override fun <T> inPlace(action: (KonanLibraryLayout) -> T): T = action(this)
|
|
||||||
override fun <T> realFiles (action: (KonanLibraryLayout) -> T): T = inPlace(action)
|
|
||||||
}
|
|
||||||
|
|
||||||
private class DirectFromZip(zippedLayout: ZippedKonanLibraryLayout, val zipFileSystem: FileSystem): KonanLibraryLayout {
|
|
||||||
override val libraryName = zippedLayout.libraryName
|
|
||||||
override val libDir = zipFileSystem.file(zippedLayout.libDir)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class automatically extracts pieces of the library on first access. Use it if you need
|
|
||||||
* to pass extracted files to an external tool. Otherwise, stick to [DirectFromZip].
|
|
||||||
*/
|
|
||||||
private class FileExtractor(val zippedLibraryLayout: ZippedKonanLibraryLayout): KonanLibraryLayout by zippedLibraryLayout {
|
|
||||||
|
|
||||||
override val manifestFile: File by lazy { extract(super.manifestFile) }
|
|
||||||
|
|
||||||
override val resourcesDir: File by lazy { extractDir(super.resourcesDir) }
|
|
||||||
|
|
||||||
override val includedDir: File by lazy { extractDir(super.includedDir) }
|
|
||||||
|
|
||||||
override val kotlinDir: File by lazy { extractDir(super.kotlinDir) }
|
|
||||||
|
|
||||||
override val nativeDir: File by lazy { extractDir(super.nativeDir) }
|
|
||||||
|
|
||||||
override val linkdataDir: File by lazy { extractDir(super.linkdataDir) }
|
|
||||||
|
|
||||||
override val irFile: File by lazy { extract(super.irFile) }
|
|
||||||
|
|
||||||
fun extract(file: File): File = zippedLibraryLayout.klibFile.withZipFileSystem { zipFileSystem ->
|
|
||||||
val temporary = createTempFile(file.name)
|
|
||||||
zipFileSystem.file(file).copyTo(temporary)
|
|
||||||
temporary.deleteOnExit()
|
|
||||||
temporary
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun extractDir(directory: File): File = zippedLibraryLayout.klibFile.withZipFileSystem { zipFileSystem ->
|
override fun directlyFromZip(zipFileSystem: FileSystem): BitcodeKotlinLibraryLayout =
|
||||||
val temporary = createTempDir(directory.name)
|
FromZipBitcodeLibraryImpl(this, zipFileSystem)
|
||||||
zipFileSystem.file(directory).recursiveCopyTo(temporary)
|
|
||||||
temporary.deleteOnExitRecursively()
|
|
||||||
temporary
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun createKonanLibraryLayout(klib: File, target: KonanTarget? = null) =
|
open class TargetedLibraryAccess<L : KotlinLibraryLayout>(klib: File, val target: KonanTarget?) :
|
||||||
if (klib.isFile) ZippedKonanLibraryLayout(klib, target) else UnzippedKonanLibraryLayout(klib, target)
|
BaseLibraryAccess<L>(klib) {
|
||||||
|
override val layout = TargetedLibraryLayoutImpl(klib, target)
|
||||||
|
}
|
||||||
|
|
||||||
|
open class BitcodeLibraryAccess<L : KotlinLibraryLayout>(klib: File, target: KonanTarget?) :
|
||||||
|
TargetedLibraryAccess<L>(klib, target) {
|
||||||
|
override val layout = BitcodeLibraryLayoutImpl(klib, target)
|
||||||
|
}
|
||||||
|
|
||||||
|
private open class FromZipTargetedLibraryImpl(zipped: TargetedLibraryLayoutImpl, zipFileSystem: FileSystem) :
|
||||||
|
FromZipBaseLibraryImpl(zipped, zipFileSystem), TargetedKotlinLibraryLayout
|
||||||
|
|
||||||
|
private class FromZipBitcodeLibraryImpl(zipped: BitcodeLibraryLayoutImpl, zipFileSystem: FileSystem) :
|
||||||
|
FromZipTargetedLibraryImpl(zipped, zipFileSystem), BitcodeKotlinLibraryLayout
|
||||||
|
|
||||||
|
open class ExtractingTargetedLibraryImpl(zipped: TargetedLibraryLayoutImpl) :
|
||||||
|
KotlinLibraryExtractor(zipped),
|
||||||
|
TargetedKotlinLibraryLayout by zipped {
|
||||||
|
|
||||||
|
override val includedDir: File by lazy { extractDir(zipped.includedDir) }
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExtractingBitcodeLibraryImpl(zipped: BitcodeLibraryLayoutImpl) :
|
||||||
|
ExtractingTargetedLibraryImpl(zipped), BitcodeKotlinLibraryLayout {
|
||||||
|
|
||||||
|
override val kotlinDir: File by lazy { extractDir(zipped.kotlinDir) }
|
||||||
|
override val nativeDir: File by lazy { extractDir(zipped.nativeDir) }
|
||||||
|
}
|
||||||
|
|||||||
@@ -104,6 +104,7 @@ dependencies {
|
|||||||
bundleDependencies "org.jetbrains.kotlin:kotlin-gradle-plugin-api:$kotlinVersion"
|
bundleDependencies "org.jetbrains.kotlin:kotlin-gradle-plugin-api:$kotlinVersion"
|
||||||
bundleDependencies "org.jetbrains.kotlin:kotlin-native-utils:$kotlinVersion"
|
bundleDependencies "org.jetbrains.kotlin:kotlin-native-utils:$kotlinVersion"
|
||||||
bundleDependencies "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
bundleDependencies "org.jetbrains.kotlin:kotlin-native-shared:$konanVersion"
|
||||||
|
bundleDependencies "org.jetbrains.kotlin:kotlin-util-io:$kotlinVersion"
|
||||||
|
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
testImplementation "org.jetbrains.kotlin:kotlin-test:$buildKotlinVersion"
|
testImplementation "org.jetbrains.kotlin:kotlin-test:$buildKotlinVersion"
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ import org.gradle.api.tasks.InputFiles
|
|||||||
import org.gradle.api.tasks.Internal
|
import org.gradle.api.tasks.Internal
|
||||||
import org.jetbrains.kotlin.gradle.plugin.tasks.KonanArtifactWithLibrariesTask
|
import org.jetbrains.kotlin.gradle.plugin.tasks.KonanArtifactWithLibrariesTask
|
||||||
import org.jetbrains.kotlin.gradle.plugin.tasks.KonanBuildingTask
|
import org.jetbrains.kotlin.gradle.plugin.tasks.KonanBuildingTask
|
||||||
import org.jetbrains.kotlin.konan.CURRENT
|
import org.jetbrains.kotlin.konan.*
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.KonanVersion
|
||||||
import org.jetbrains.kotlin.konan.library.SearchPathResolver
|
import org.jetbrains.kotlin.konan.library.SearchPathResolver
|
||||||
import org.jetbrains.kotlin.konan.library.defaultResolver
|
import org.jetbrains.kotlin.konan.library.defaultResolver
|
||||||
|
|||||||
+1
-1
@@ -91,7 +91,7 @@ internal val Project.konanHome: String
|
|||||||
|
|
||||||
internal val Project.konanVersion: KonanVersion
|
internal val Project.konanVersion: KonanVersion
|
||||||
get() = project.findProperty(KonanPlugin.ProjectProperty.KONAN_VERSION)
|
get() = project.findProperty(KonanPlugin.ProjectProperty.KONAN_VERSION)
|
||||||
?.toString()?.parseKonanVersion()
|
?.toString()?.let { KonanVersion.fromString(it) }
|
||||||
?: KonanVersion.CURRENT
|
?: KonanVersion.CURRENT
|
||||||
|
|
||||||
internal val Project.konanBuildRoot get() = buildDir.resolve("konan")
|
internal val Project.konanBuildRoot get() = buildDir.resolve("konan")
|
||||||
|
|||||||
+5
-5
@@ -100,11 +100,11 @@ object KonanToolingModelBuilder : ToolingModelBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal data class KonanModelImpl(
|
internal data class KonanModelImpl(
|
||||||
override val artifacts: List<KonanModelArtifact>,
|
override val artifacts: List<KonanModelArtifact>,
|
||||||
override val konanHome: File,
|
override val konanHome: File,
|
||||||
override val konanVersion: KonanVersion,
|
override val konanVersion: KonanVersion,
|
||||||
override val languageVersion: String?,
|
override val languageVersion: String?,
|
||||||
override val apiVersion: String?
|
override val apiVersion: String?
|
||||||
) : KonanModel
|
) : KonanModel
|
||||||
|
|
||||||
internal data class KonanModelArtifactImpl(
|
internal data class KonanModelArtifactImpl(
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ import org.jetbrains.kotlin.konan.target.PlatformManager
|
|||||||
import org.jetbrains.kotlin.konan.library.*
|
import org.jetbrains.kotlin.konan.library.*
|
||||||
import org.jetbrains.kotlin.konan.target.Distribution
|
import org.jetbrains.kotlin.konan.target.Distribution
|
||||||
import org.jetbrains.kotlin.native.interop.gen.jvm.interop
|
import org.jetbrains.kotlin.native.interop.gen.jvm.interop
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
|
||||||
import org.jetbrains.kliopt.ArgParser
|
import org.jetbrains.kliopt.ArgParser
|
||||||
import org.jetbrains.kotlin.konan.CURRENT
|
import org.jetbrains.kotlin.konan.CURRENT
|
||||||
import org.jetbrains.kotlin.konan.KonanVersion
|
import org.jetbrains.kotlin.konan.KonanVersion
|
||||||
|
import org.jetbrains.kotlin.library.toUnresolvedLibraries
|
||||||
import org.jetbrains.kotlin.native.interop.tool.*
|
import org.jetbrains.kotlin.native.interop.tool.*
|
||||||
|
|
||||||
// TODO: this function should eventually be eliminated from 'utilities'.
|
// TODO: this function should eventually be eliminated from 'utilities'.
|
||||||
|
|||||||
Reference in New Issue
Block a user