Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@

package dev.icerock.gradle.actions.apple

import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
import dev.icerock.gradle.utils.klibs
import org.gradle.api.Action
import org.gradle.api.Task
import org.gradle.api.logging.Logger
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.library.KotlinLibraryLayout
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl
import org.jetbrains.kotlin.library.impl.javaFile
import java.io.File

internal abstract class CopyResourcesFromKLibsAction : Action<Task> {
Expand Down Expand Up @@ -71,7 +71,7 @@ internal abstract class CopyResourcesFromKLibsAction : Action<Task> {
val layout: KotlinLibraryLayout = getKotlinLibraryLayout(klibFile)
return layout.resourcesDir.listFilesOrEmpty
.filter { it.isDirectory && it.extension == "bundle" }
.map { it.javaFile() }
.map { File(it.path) }
Comment thread
Alex009 marked this conversation as resolved.
}

private fun getKotlinLibraryLayout(file: File): KotlinLibraryLayout {
Expand All @@ -83,6 +83,6 @@ internal abstract class CopyResourcesFromKLibsAction : Action<Task> {
// klib path, hash, resources count. to not extract klibs that we already know that not
// contains any resources. BUT maybe extraction will be faster then hashing for this logic.
// so this improvement should be checked in future
return if (klib.isZipped) klib.extractingToTemp else klib
return if (klib.isZipped) ExtractingBaseLibraryImpl(klib) else klib
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

package dev.icerock.gradle.actions.js

import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
import dev.icerock.gradle.utils.klibs
import org.gradle.api.Action
import org.gradle.api.logging.Logger
Expand Down Expand Up @@ -129,7 +130,7 @@ internal class CopyResourcesToExecutableAction(
val klibKonan = org.jetbrains.kotlin.konan.file.File(inputFile.path)
val klib = KotlinLibraryLayoutImpl(klib = klibKonan, component = "default")
val layout: KotlinLibraryLayout = if (klib.isZipped) {
klib.extractingToTemp
ExtractingBaseLibraryImpl(klib)
} else {
klib
}
Expand Down
Comment thread
Alex009 marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.gradle.data

import org.jetbrains.kotlin.konan.file.File
import org.jetbrains.kotlin.konan.file.file
import org.jetbrains.kotlin.konan.file.unzipTo
import org.jetbrains.kotlin.konan.file.withZipFileSystem
import org.jetbrains.kotlin.library.KotlinLibraryLayout
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl

open class ExtractingKotlinLibraryLayout(zipped: KotlinLibraryLayoutImpl) : KotlinLibraryLayout {
Comment thread
Alex009 marked this conversation as resolved.
Outdated
override val libFile: File get() = error("Extracting layout doesn't extract its own root")
override val libraryName = zipped.libraryName
override val component = zipped.component
}

class ExtractingBaseLibraryImpl(zipped: KotlinLibraryLayoutImpl) : ExtractingKotlinLibraryLayout(zipped) {
Comment thread
Alex009 marked this conversation as resolved.
Outdated
override val manifestFile: File by lazy { zipped.extract(zipped.manifestFile) }
override val resourcesDir: File by lazy { zipped.extractDir(zipped.resourcesDir) }
}

fun KotlinLibraryLayoutImpl.extract(file: File): File = extract(this.klib, file)
Comment thread
zacharee marked this conversation as resolved.
Outdated

private fun extract(zipFile: File, file: File) = zipFile.withZipFileSystem { zipFileSystem ->
val temporary = org.jetbrains.kotlin.konan.file.createTempFile(file.name)
zipFileSystem.file(file).copyTo(temporary)
temporary.deleteOnExit()
temporary
}

fun KotlinLibraryLayoutImpl.extractDir(directory: File): File = extractDir(this.klib, directory)
Comment thread
zacharee marked this conversation as resolved.
Outdated

private fun extractDir(zipFile: File, directory: File): File {
val temporary = org.jetbrains.kotlin.konan.file.createTempDir(directory.name)
temporary.deleteOnExitRecursively()
zipFile.unzipTo(temporary, fromSubdirectory = directory)
return temporary
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

package dev.icerock.gradle.tasks

import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
import dev.icerock.gradle.utils.toKonanFile
import org.gradle.api.DefaultTask
import org.gradle.api.file.ConfigurableFileCollection
Expand Down Expand Up @@ -40,7 +41,7 @@ abstract class CopyExecutableResourcesToApp : DefaultTask() {
.forEach { inputFile ->
val klibKonan: org.jetbrains.kotlin.konan.file.File = inputFile.toKonanFile()
val klib = KotlinLibraryLayoutImpl(klib = klibKonan, component = "default")
val layout: KotlinLibraryLayout = klib.extractingToTemp
val layout: KotlinLibraryLayout = ExtractingBaseLibraryImpl(klib)

// extracting bundles
layout
Expand Down
3 changes: 2 additions & 1 deletion samples/compose-resources-gallery/macosApp/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@

import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import java.io.File

Expand Down Expand Up @@ -84,7 +85,7 @@ tasks.withType<KotlinNativeLink>().configureEach {
klib = klibKonan,
component = "default"
)
val layout = klib.extractingToTemp
val layout = ExtractingBaseLibraryImpl(klib)

// extracting bundles
layout
Expand Down
Loading