[KLIB] Fix issues between directory and .klib modes

- use .klib extension explicitly
 - fix issue with `module.klib.klib` names
This commit is contained in:
Roman Artemev
2020-12-03 08:36:59 +03:00
parent 939da9dbc8
commit 37c7f60ae7
6 changed files with 35 additions and 33 deletions
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
import org.jetbrains.kotlin.ir.backend.js.* import org.jetbrains.kotlin.ir.backend.js.*
import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory
import org.jetbrains.kotlin.js.config.* import org.jetbrains.kotlin.js.config.*
import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -187,11 +188,9 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
} }
if (arguments.irProduceKlibDir || arguments.irProduceKlibFile) { if (arguments.irProduceKlibDir || arguments.irProduceKlibFile) {
val outputKlibPath = if (arguments.irProduceKlibFile) {
if (arguments.irProduceKlibDir) require(outputFile.extension == KLIB_FILE_EXTENSION) { "Please set up .klib file as output" }
File(outputFilePath).parent }
else
outputFilePath
try { try {
generateKLib( generateKLib(
@@ -202,7 +201,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
allDependencies = resolvedLibraries, allDependencies = resolvedLibraries,
friendDependencies = friendDependencies, friendDependencies = friendDependencies,
irFactory = PersistentIrFactory, irFactory = PersistentIrFactory,
outputKlibPath = outputKlibPath, outputKlibPath = outputFile.path,
nopack = arguments.irProduceKlibDir nopack = arguments.irProduceKlibDir
) )
} catch (e: JsIrCompilationError) { } catch (e: JsIrCompilationError) {
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.konan.util.KlibMetadataFactories import org.jetbrains.kotlin.konan.util.KlibMetadataFactories
import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.*
import org.jetbrains.kotlin.library.impl.BuiltInsPlatform import org.jetbrains.kotlin.library.impl.BuiltInsPlatform
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutForWriter
import org.jetbrains.kotlin.library.impl.KotlinLibraryWriterImpl import org.jetbrains.kotlin.library.impl.KotlinLibraryWriterImpl
import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer import org.jetbrains.kotlin.library.metadata.NativeTypeTransformer
import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer import org.jetbrains.kotlin.library.metadata.NullFlexibleTypeDeserializer
@@ -78,8 +79,10 @@ object KlibTestUtil {
val serializedMetadata = serializer.serializeModule(module) val serializedMetadata = serializer.serializeModule(module)
val unzippedDir = org.jetbrains.kotlin.konan.file.createTempDir(libraryName)
val layout = KotlinLibraryLayoutForWriter(KFile(klibFile.path), unzippedDir)
val library = KotlinLibraryWriterImpl( val library = KotlinLibraryWriterImpl(
libDir = KFile(klibFile.path.removeSuffix(KLIB_FILE_EXTENSION_WITH_DOT)),
moduleName = libraryName, moduleName = libraryName,
versions = KotlinLibraryVersioning( versions = KotlinLibraryVersioning(
libraryVersion = null, libraryVersion = null,
@@ -91,7 +94,8 @@ object KlibTestUtil {
builtInsPlatform = BuiltInsPlatform.COMMON, builtInsPlatform = BuiltInsPlatform.COMMON,
nativeTargets = emptyList(), nativeTargets = emptyList(),
nopack = false, nopack = false,
shortName = libraryName shortName = libraryName,
layout = layout
) )
library.addMetadata(serializedMetadata) library.addMetadata(serializedMetadata)
@@ -26,18 +26,18 @@ const val KLIB_IR_FOLDER_NAME = "ir"
* This scheme describes the Kotlin/Native Library (KLIB) layout. * This scheme describes the Kotlin/Native Library (KLIB) layout.
*/ */
interface KotlinLibraryLayout { interface KotlinLibraryLayout {
val libDir: File val libFile: File
val libraryName: String val libraryName: String
get() = libDir.path get() = libFile.path
val component: String? val component: String?
val componentDir: File val componentDir: File
get() = File(libDir, component!!) get() = File(libFile, component!!)
val manifestFile val manifestFile
get() = File(componentDir, KLIB_MANIFEST_FILE_NAME) get() = File(componentDir, KLIB_MANIFEST_FILE_NAME)
val resourcesDir val resourcesDir
get() = File(componentDir, "resources") get() = File(componentDir, "resources")
val pre_1_4_manifest: File val pre_1_4_manifest: File
get() = File(libDir, KLIB_MANIFEST_FILE_NAME) get() = File(libFile, KLIB_MANIFEST_FILE_NAME)
} }
interface MetadataKotlinLibraryLayout : KotlinLibraryLayout { interface MetadataKotlinLibraryLayout : KotlinLibraryLayout {
@@ -30,7 +30,7 @@ open class BaseKotlinLibraryImpl(
private val componentListAndHasPre14Manifest by lazy { private val componentListAndHasPre14Manifest by lazy {
access.inPlace { layout -> access.inPlace { layout ->
val listFiles = layout.libDir.listFiles val listFiles = layout.libFile.listFiles
listFiles listFiles
.filter { it.isDirectory } .filter { it.isDirectory }
.filter { it.listFiles.map { it.name }.contains(KLIB_MANIFEST_FILE_NAME) } .filter { it.listFiles.map { it.name }.contains(KLIB_MANIFEST_FILE_NAME) }
@@ -14,14 +14,14 @@ open class KotlinLibraryLayoutImpl(val klib: File, override val component: Strin
if (isZipped) zippedKotlinLibraryChecks(klib) if (isZipped) zippedKotlinLibraryChecks(klib)
} }
override val libDir = if (isZipped) File("/") else klib override val libFile = if (isZipped) File("/") else klib
override val libraryName override val libraryName
get() = get() =
if (isZipped) if (isZipped)
klib.path.removeSuffixIfPresent(KLIB_FILE_EXTENSION_WITH_DOT) klib.path.removeSuffixIfPresent(KLIB_FILE_EXTENSION_WITH_DOT)
else else
libDir.path libFile.path
open val extractingToTemp: KotlinLibraryLayout by lazy { open val extractingToTemp: KotlinLibraryLayout by lazy {
ExtractingBaseLibraryImpl(this) ExtractingBaseLibraryImpl(this)
@@ -84,7 +84,7 @@ open class FromZipBaseLibraryImpl(zipped: KotlinLibraryLayoutImpl, zipFileSystem
KotlinLibraryLayout { KotlinLibraryLayout {
override val libraryName = zipped.libraryName override val libraryName = zipped.libraryName
override val libDir = zipFileSystem.file(zipped.libDir) override val libFile = zipFileSystem.file(zipped.libFile)
override val component = zipped.component override val component = zipped.component
} }
@@ -113,7 +113,7 @@ fun KotlinLibraryLayoutImpl.extractDir(directory: File): File = this.klib.withZi
} }
open class ExtractingKotlinLibraryLayout(zipped: KotlinLibraryLayoutImpl) : KotlinLibraryLayout { open class ExtractingKotlinLibraryLayout(zipped: KotlinLibraryLayoutImpl) : KotlinLibraryLayout {
override val libDir: File get() = error("Extracting layout doesn't extract its own root") override val libFile: File get() = error("Extracting layout doesn't extract its own root")
override val libraryName = zipped.libraryName override val libraryName = zipped.libraryName
override val component = zipped.component override val component = zipped.component
} }
@@ -14,9 +14,13 @@ import org.jetbrains.kotlin.library.*
const val KLIB_DEFAULT_COMPONENT_NAME = "default" const val KLIB_DEFAULT_COMPONENT_NAME = "default"
open class KotlinLibraryLayoutForWriter( open class KotlinLibraryLayoutForWriter(
override val libDir: File, override val libFile: File,
val unzippedDir: File,
override val component: String = KLIB_DEFAULT_COMPONENT_NAME override val component: String = KLIB_DEFAULT_COMPONENT_NAME
) : KotlinLibraryLayout, MetadataKotlinLibraryLayout, IrKotlinLibraryLayout ) : KotlinLibraryLayout, MetadataKotlinLibraryLayout, IrKotlinLibraryLayout {
override val componentDir: File
get() = File(unzippedDir, component)
}
open class BaseWriterImpl( open class BaseWriterImpl(
val libraryLayout: KotlinLibraryLayoutForWriter, val libraryLayout: KotlinLibraryLayoutForWriter,
@@ -28,14 +32,12 @@ open class BaseWriterImpl(
val shortName: String? = null val shortName: String? = null
) : BaseWriter { ) : BaseWriter {
val klibFile = File("${libraryLayout.libDir.path}.$KLIB_FILE_EXTENSION") val klibFile = libraryLayout.libFile
val manifestProperties = Properties() val manifestProperties = Properties()
init { init {
// TODO: figure out the proper policy here. // TODO: figure out the proper policy here.
libraryLayout.libDir.deleteRecursively()
klibFile.delete() klibFile.delete()
libraryLayout.libDir.mkdirs()
libraryLayout.resourcesDir.mkdirs() libraryLayout.resourcesDir.mkdirs()
// TODO: <name>:<hash> will go somewhere around here. // TODO: <name>:<hash> will go somewhere around here.
manifestProperties.setProperty(KLIB_PROPERTY_UNIQUE_NAME, moduleName) manifestProperties.setProperty(KLIB_PROPERTY_UNIQUE_NAME, moduleName)
@@ -76,8 +78,8 @@ open class BaseWriterImpl(
override fun commit() { override fun commit() {
manifestProperties.saveToFile(libraryLayout.manifestFile) manifestProperties.saveToFile(libraryLayout.manifestFile)
if (!nopack) { if (!nopack) {
libraryLayout.libDir.zipDirAs(klibFile) libraryLayout.unzippedDir.zipDirAs(klibFile)
libraryLayout.libDir.deleteRecursively() libraryLayout.unzippedDir.deleteRecursively()
} }
} }
} }
@@ -86,16 +88,13 @@ open class BaseWriterImpl(
* Requires non-null [target]. * Requires non-null [target].
*/ */
class KotlinLibraryWriterImpl( class KotlinLibraryWriterImpl(
libDir: File,
moduleName: String, moduleName: String,
versions: KotlinLibraryVersioning, versions: KotlinLibraryVersioning,
builtInsPlatform: BuiltInsPlatform, builtInsPlatform: BuiltInsPlatform,
nativeTargets: List<String>, nativeTargets: List<String>,
nopack: Boolean = false, nopack: Boolean = false,
shortName: String? = null, shortName: String? = null,
val layout: KotlinLibraryLayoutForWriter,
val layout: KotlinLibraryLayoutForWriter = KotlinLibraryLayoutForWriter(libDir),
val base: BaseWriter = BaseWriterImpl(layout, moduleName, versions, builtInsPlatform, nativeTargets, nopack, shortName), val base: BaseWriter = BaseWriterImpl(layout, moduleName, versions, builtInsPlatform, nativeTargets, nopack, shortName),
metadata: MetadataWriter = MetadataWriterImpl(layout), metadata: MetadataWriter = MetadataWriterImpl(layout),
ir: IrWriter = IrMonoliticWriterImpl(layout) ir: IrWriter = IrMonoliticWriterImpl(layout)
@@ -118,11 +117,11 @@ fun buildKotlinLibrary(
nativeTargets: List<String> = emptyList() nativeTargets: List<String> = emptyList()
): KotlinLibraryLayout { ): KotlinLibraryLayout {
val klibDirectory = File(output) val klibFile = File(output)
val layout = KotlinLibraryLayoutForWriter(klibDirectory) val unzippedKlibDir = if (nopack) klibFile.also { it.isDirectory } else org.jetbrains.kotlin.konan.file.createTempDir(moduleName)
val layout = KotlinLibraryLayoutForWriter(klibFile, unzippedKlibDir)
val irWriter = if (perFile) IrPerFileWriterImpl(layout) else IrMonoliticWriterImpl(layout) val irWriter = if (perFile) IrPerFileWriterImpl(layout) else IrMonoliticWriterImpl(layout)
val library = KotlinLibraryWriterImpl( val library = KotlinLibraryWriterImpl(
klibDirectory,
moduleName, moduleName,
versions, versions,
builtInsPlatform, builtInsPlatform,
@@ -158,9 +157,9 @@ class KotlinLibraryOnlyIrWriter(output: String, moduleName: String, versions: Ko
nativeTargets: List<String>, nativeTargets: List<String>,
directory: File directory: File
): KotlinLibraryWriterImpl { ): KotlinLibraryWriterImpl {
val layout = KotlinLibraryLayoutForWriter(directory) val layout = KotlinLibraryLayoutForWriter(directory, directory)
val irWriter = if (perFile) IrPerFileWriterImpl(layout) else IrMonoliticWriterImpl(layout) val irWriter = if (perFile) IrPerFileWriterImpl(layout) else IrMonoliticWriterImpl(layout)
return KotlinLibraryWriterImpl(directory, moduleName, versions, platform, nativeTargets, nopack = true, layout = layout, ir = irWriter) return KotlinLibraryWriterImpl(moduleName, versions, platform, nativeTargets, nopack = true, layout = layout, ir = irWriter)
} }
fun invalidate() { fun invalidate() {