Skip to content

Commit 79e3fa2

Browse files
authored
Merge pull request #829 from zacharee/extractingToTemp-fix
Work around `extractingToTemp` removal in Kotlin 2.2.0
2 parents 59ce226 + d1ebefb commit 79e3fa2

17 files changed

Lines changed: 112 additions & 98 deletions

File tree

resources-generator/src/main/kotlin/dev/icerock/gradle/MultiplatformResourcesPlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import dev.icerock.gradle.generator.platform.apple.setupAppleKLibResources
1414
import dev.icerock.gradle.generator.platform.apple.setupExecutableResources
1515
import dev.icerock.gradle.generator.platform.apple.setupFatFrameworkTasks
1616
import dev.icerock.gradle.generator.platform.apple.setupFrameworkResources
17-
import dev.icerock.gradle.generator.platform.apple.setupTestsResources
1817
import dev.icerock.gradle.generator.platform.js.setupJsKLibResources
1918
import dev.icerock.gradle.generator.platform.js.setupJsResourcesWithLinkTask
2019
import dev.icerock.gradle.tasks.GenerateMultiplatformResourcesTask
@@ -85,7 +84,6 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
8584
if (target is KotlinNativeTarget) {
8685
setupExecutableResources(target = target)
8786
setupFrameworkResources(target = target)
88-
setupTestsResources(target = target)
8987
}
9088

9189
if (target is KotlinJsIrTarget) {
@@ -186,6 +184,7 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
186184
sourceSet.resources.srcDir(genTaskProvider.map { it.outputResourcesDir })
187185
sourceSet.resources.srcDir(genTaskProvider.map { it.outputAssetsDir })
188186
}
187+
189188
KotlinPlatformType.androidJvm -> {
190189
// Fix: android sourceSets indexation in IDE
191190
// Usage of api of v2.model in AGP broken for IDE resources indexing
@@ -200,6 +199,7 @@ open class MultiplatformResourcesPlugin : Plugin<Project> {
200199
// see: dev.icerock.gradle.generator.platform.android.SetupAndroidUtilsKt.addGenerationTaskDependency
201200
// androidSourceSet.assets.srcDir(genTaskProvider.map { it.outputAssetsDir })
202201
}
202+
203203
KotlinPlatformType.common, KotlinPlatformType.native,
204204
KotlinPlatformType.wasm -> Unit
205205
}

resources-generator/src/main/kotlin/dev/icerock/gradle/actions/apple/CopyResourcesFromKLibsAction.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55
package dev.icerock.gradle.actions.apple
66

7+
import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
78
import dev.icerock.gradle.utils.klibs
89
import org.gradle.api.Action
910
import org.gradle.api.Task
1011
import org.gradle.api.logging.Logger
1112
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
1213
import org.jetbrains.kotlin.library.KotlinLibraryLayout
1314
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl
14-
import org.jetbrains.kotlin.library.impl.javaFile
1515
import java.io.File
1616

1717
internal abstract class CopyResourcesFromKLibsAction : Action<Task> {
@@ -71,7 +71,7 @@ internal abstract class CopyResourcesFromKLibsAction : Action<Task> {
7171
val layout: KotlinLibraryLayout = getKotlinLibraryLayout(klibFile)
7272
return layout.resourcesDir.listFilesOrEmpty
7373
.filter { it.isDirectory && it.extension == "bundle" }
74-
.map { it.javaFile() }
74+
.map { File(it.path) }
7575
}
7676

7777
private fun getKotlinLibraryLayout(file: File): KotlinLibraryLayout {
@@ -83,6 +83,6 @@ internal abstract class CopyResourcesFromKLibsAction : Action<Task> {
8383
// klib path, hash, resources count. to not extract klibs that we already know that not
8484
// contains any resources. BUT maybe extraction will be faster then hashing for this logic.
8585
// so this improvement should be checked in future
86-
return if (klib.isZipped) klib.extractingToTemp else klib
86+
return if (klib.isZipped) ExtractingBaseLibraryImpl(klib) else klib
8787
}
8888
}

resources-generator/src/main/kotlin/dev/icerock/gradle/actions/js/CopyResourcesToExecutableAction.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package dev.icerock.gradle.actions.js
66

7+
import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
78
import dev.icerock.gradle.utils.klibs
89
import org.gradle.api.Action
910
import org.gradle.api.logging.Logger
@@ -129,7 +130,7 @@ internal class CopyResourcesToExecutableAction(
129130
val klibKonan = org.jetbrains.kotlin.konan.file.File(inputFile.path)
130131
val klib = KotlinLibraryLayoutImpl(klib = klibKonan, component = "default")
131132
val layout: KotlinLibraryLayout = if (klib.isZipped) {
132-
klib.extractingToTemp
133+
ExtractingBaseLibraryImpl(klib)
133134
} else {
134135
klib
135136
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright 2025 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.icerock.gradle.data
6+
7+
import org.jetbrains.kotlin.konan.file.File
8+
import org.jetbrains.kotlin.konan.file.file
9+
import org.jetbrains.kotlin.konan.file.unzipTo
10+
import org.jetbrains.kotlin.konan.file.withZipFileSystem
11+
import org.jetbrains.kotlin.library.KotlinLibraryLayout
12+
import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl
13+
14+
/**
15+
* The code in this file is pulled from a previous version of Kotlin to replicate
16+
* removed functionality that MR relies on for extracting klibs.
17+
* https://github.com/JetBrains/kotlin/blob/00984f32ac1ebc2e7fb71b440c282be2a8b05f36/compiler/util-klib/src/org/jetbrains/kotlin/library/impl/KotlinLibraryLayoutImpl.kt
18+
*/
19+
20+
internal open class ExtractingKotlinLibraryLayout(zipped: KotlinLibraryLayoutImpl) : KotlinLibraryLayout {
21+
override val libFile: File get() = error("Extracting layout doesn't extract its own root")
22+
override val libraryName = zipped.libraryName
23+
override val component = zipped.component
24+
}
25+
26+
internal class ExtractingBaseLibraryImpl(zipped: KotlinLibraryLayoutImpl) : ExtractingKotlinLibraryLayout(zipped) {
27+
override val manifestFile: File by lazy { zipped.extract(zipped.manifestFile) }
28+
override val resourcesDir: File by lazy { zipped.extractDir(zipped.resourcesDir) }
29+
}
30+
31+
private fun KotlinLibraryLayoutImpl.extract(file: File): File = extract(this.klib, file)
32+
33+
private fun extract(zipFile: File, file: File) = zipFile.withZipFileSystem { zipFileSystem ->
34+
val temporary = org.jetbrains.kotlin.konan.file.createTempFile(file.name)
35+
zipFileSystem.file(file).copyTo(temporary)
36+
temporary.deleteOnExit()
37+
temporary
38+
}
39+
40+
private fun KotlinLibraryLayoutImpl.extractDir(directory: File): File = extractDir(this.klib, directory)
41+
42+
private fun extractDir(zipFile: File, directory: File): File {
43+
val temporary = org.jetbrains.kotlin.konan.file.createTempDir(directory.name)
44+
temporary.deleteOnExitRecursively()
45+
zipFile.unzipTo(temporary, fromSubdirectory = directory)
46+
return temporary
47+
}

resources-generator/src/main/kotlin/dev/icerock/gradle/generator/platform/apple/SetupAppleUtils.kt

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractExecutable
3737
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
3838
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
3939
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
40-
import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
4140
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.XCFrameworkTask
4241
import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask
4342
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
@@ -222,37 +221,39 @@ internal fun registerCopyXCFrameworkResourcesToAppTask(
222221
}
223222

224223
internal fun setupExecutableResources(target: KotlinNativeTarget) {
225-
val project: Project = target.project
226224
target.binaries.withType<AbstractExecutable>().configureEach { executable ->
227-
val copyTaskName: String =
228-
executable.linkTaskProvider.name.replace("link", "copyResources")
225+
setupExecutableGradleResources(executable)
226+
setupExecutableXcodeResources(executable)
227+
}
228+
}
229229

230-
project.tasks.register<CopyExecutableResourcesToApp>(copyTaskName) {
231-
dependsOn(executable.linkTaskProvider)
230+
internal fun setupExecutableXcodeResources(executable: AbstractExecutable) {
231+
val copyTaskName: String = executable.linkTaskProvider.name.replace("link", "copyResources")
232+
val project: Project = executable.project
232233

233-
klibs.from(executable.linkTaskProvider.map { it.klibs })
234+
project.tasks.register<CopyExecutableResourcesToApp>(copyTaskName) {
235+
dependsOn(executable.linkTaskProvider)
234236

235-
outputDirectory.set(
236-
project.layout.dir(
237-
project.provider {
238-
val buildProductsDir =
239-
project.property("moko.resources.BUILT_PRODUCTS_DIR") as String
240-
val contentsFolderPath =
241-
project.property("moko.resources.CONTENTS_FOLDER_PATH") as String
237+
klibs.from(executable.linkTaskProvider.map { it.klibs })
238+
239+
outputDirectory.set(
240+
project.layout.dir(
241+
project.provider {
242+
val buildProductsDir =
243+
project.property("moko.resources.BUILT_PRODUCTS_DIR") as String
244+
val contentsFolderPath =
245+
project.property("moko.resources.CONTENTS_FOLDER_PATH") as String
242246

243-
File("$buildProductsDir/$contentsFolderPath")
244-
}
245-
)
247+
File("$buildProductsDir/$contentsFolderPath")
248+
}
246249
)
247-
}
250+
)
248251
}
249252
}
250253

251-
internal fun setupTestsResources(target: KotlinNativeTarget) {
252-
target.binaries.withType<TestExecutable>().configureEach { executable ->
253-
executable.linkTaskProvider.configure { link ->
254-
link.doLast(CopyResourcesFromKLibsToExecutableAction())
255-
}
254+
internal fun setupExecutableGradleResources(executable: AbstractExecutable) {
255+
executable.linkTaskProvider.configure { link ->
256+
link.doLast(CopyResourcesFromKLibsToExecutableAction())
256257
}
257258
}
258259

resources-generator/src/main/kotlin/dev/icerock/gradle/tasks/CopyExecutableResourcesToApp.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package dev.icerock.gradle.tasks
66

7+
import dev.icerock.gradle.data.ExtractingBaseLibraryImpl
78
import dev.icerock.gradle.utils.toKonanFile
89
import org.gradle.api.DefaultTask
910
import org.gradle.api.file.ConfigurableFileCollection
@@ -40,7 +41,7 @@ abstract class CopyExecutableResourcesToApp : DefaultTask() {
4041
.forEach { inputFile ->
4142
val klibKonan: org.jetbrains.kotlin.konan.file.File = inputFile.toKonanFile()
4243
val klib = KotlinLibraryLayoutImpl(klib = klibKonan, component = "default")
43-
val layout: KotlinLibraryLayout = klib.extractingToTemp
44+
val layout: KotlinLibraryLayout = ExtractingBaseLibraryImpl(klib)
4445

4546
// extracting bundles
4647
layout

samples/compose-resources-gallery/macosApp/build.gradle.kts

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
2-
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
3-
import java.io.File
4-
51
plugins {
62
kotlin("multiplatform")
73
id("org.jetbrains.compose")
@@ -65,43 +61,3 @@ kotlin {
6561
multiplatformResources {
6662
resourcesPackage.set("dev.icerock.moko.resources.sample")
6763
}
68-
69-
// TODO move to moko-resources gradle plugin
70-
// copy .bundle from all .klib to .kexe
71-
tasks.withType<KotlinNativeLink>().configureEach {
72-
val linkTask: KotlinNativeLink = this
73-
val outputDir: File = this.outputFile.get().parentFile
74-
75-
@Suppress("ObjectLiteralToLambda") // lambda broke up-to-date
76-
val action = object : Action<Task> {
77-
override fun execute(t: Task) {
78-
(linkTask.libraries + linkTask.sources)
79-
.filter { library -> library.extension == "klib" }
80-
.filter(File::exists)
81-
.forEach { inputFile ->
82-
val klibKonan = org.jetbrains.kotlin.konan.file.File(inputFile.path)
83-
val klib = org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl(
84-
klib = klibKonan,
85-
component = "default"
86-
)
87-
val layout = klib.extractingToTemp
88-
89-
// extracting bundles
90-
layout
91-
.resourcesDir
92-
.absolutePath
93-
.let(::File)
94-
.listFiles { file: File -> file.extension == "bundle" }
95-
// copying bundles to app
96-
?.forEach {
97-
logger.info("${it.absolutePath} copying to $outputDir")
98-
it.copyRecursively(
99-
target = File(outputDir, it.name),
100-
overwrite = true
101-
)
102-
}
103-
}
104-
}
105-
}
106-
doLast(action)
107-
}

samples/kotlin-2-dynamic-sample/androidApp/build.gradle.kts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2+
13
plugins {
24
alias(libs.plugins.androidApplication)
35
alias(libs.plugins.kotlinAndroid)
@@ -6,7 +8,7 @@ plugins {
68

79
android {
810
namespace = "app.kotlin2sample.android"
9-
compileSdk = 34
11+
compileSdk = 36
1012
defaultConfig {
1113
applicationId = "app.kotlin2sample.android"
1214
minSdk = 26
@@ -28,11 +30,13 @@ android {
2830
}
2931
}
3032
compileOptions {
31-
sourceCompatibility = JavaVersion.VERSION_1_8
32-
targetCompatibility = JavaVersion.VERSION_1_8
33+
sourceCompatibility = JavaVersion.VERSION_17
34+
targetCompatibility = JavaVersion.VERSION_17
3335
}
34-
kotlinOptions {
35-
jvmTarget = "1.8"
36+
kotlin {
37+
compilerOptions {
38+
jvmTarget.set(JvmTarget.JVM_17)
39+
}
3640
}
3741
}
3842

samples/kotlin-2-dynamic-sample/extramodule/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ kotlin {
3030

3131
android {
3232
namespace = "app.kotlin2sample.extra"
33-
compileSdk = 34
33+
compileSdk = 36
3434
defaultConfig {
3535
minSdk = 26
3636
}

samples/kotlin-2-dynamic-sample/gradle/libs.versions.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
[versions]
2-
agp = "8.4.0"
3-
kotlin = "2.1.0"
4-
compose = "1.6.7"
5-
compose-material3 = "1.2.1"
6-
androidx-activityCompose = "1.9.0"
2+
agp = "8.11.0"
3+
kotlin = "2.2.0"
4+
compose = "1.8.3"
5+
compose-material3 = "1.3.2"
6+
androidx-activityCompose = "1.10.1"
77

88
[libraries]
99
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }

0 commit comments

Comments
 (0)