@@ -9,14 +9,19 @@ import com.squareup.kotlinpoet.CodeBlock
99import com.squareup.kotlinpoet.KModifier
1010import com.squareup.kotlinpoet.PropertySpec
1111import com.squareup.kotlinpoet.TypeSpec
12+ import dev.icerock.gradle.MultiplatformResourcesPluginExtension
1213import dev.icerock.gradle.generator.MRGenerator
14+ import dev.icerock.gradle.tasks.CopyFrameworkResourcesToAppEntryPointTask
15+ import dev.icerock.gradle.tasks.CopyFrameworkResourcesToAppTask
1316import org.gradle.api.Project
1417import org.gradle.api.Task
1518import org.gradle.kotlin.dsl.support.unzipTo
1619import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinNativeCompilation
1720import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
1821import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
22+ import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
1923import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
24+ import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
2025import org.jetbrains.kotlin.konan.file.zipDirAs
2126import org.jetbrains.kotlin.library.impl.KotlinLibraryLayoutImpl
2227import java.io.File
@@ -65,6 +70,7 @@ class IosMRGenerator(
6570 override fun apply (generationTask : Task , project : Project ) {
6671 setupKLibResources(generationTask)
6772 setupFrameworkResources()
73+ setupTestsResources()
6874 }
6975
7076 override fun beforeMRGeneration () {
@@ -131,6 +137,7 @@ class IosMRGenerator(
131137
132138 private fun setupFrameworkResources () {
133139 val kotlinNativeTarget = compilation.target as KotlinNativeTarget
140+ val project = kotlinNativeTarget.project
134141
135142 kotlinNativeTarget.binaries
136143 .matching { it is Framework && it.compilation == compilation }
@@ -140,17 +147,90 @@ class IosMRGenerator(
140147 val linkTask = framework.linkTask
141148
142149 linkTask.doLast {
143- linkTask.libraries
144- .plus(linkTask.intermediateLibrary.get())
145- .filter { it.extension == " klib" }
146- .forEach {
147- project.logger.info(" copy resources from $it " )
148- val klibKonan = org.jetbrains.kotlin.konan.file.File (it.path)
149- val klib = KotlinLibraryLayoutImpl (klibKonan)
150- val layout = klib.extractingToTemp
151-
152- File (layout.resourcesDir.path).copyRecursively(framework.outputFile, overwrite = true )
153- }
150+ copyKlibsResourcesIntoFramework(linkTask)
151+ }
152+
153+ if (framework.isStatic) {
154+ val resourcesExtension =
155+ project.extensions.getByType(MultiplatformResourcesPluginExtension ::class .java)
156+ if (resourcesExtension.disableStaticFrameworkWarning.not ()) {
157+ project.logger.warn(" $linkTask produces static framework, Xcode should have Build Phase with copyFrameworkResourcesToApp gradle task call. Please read readme on https://github.com/icerockdev/moko-resources" )
158+ }
159+ createCopyFrameworkResourcesTask(linkTask)
160+ }
161+ }
162+ }
163+
164+ private fun copyKlibsResourcesIntoFramework (linkTask : KotlinNativeLink ) {
165+ val project = linkTask.project
166+ val framework = linkTask.binary as Framework
167+
168+ copyResourcesFromLibraries(
169+ linkTask = linkTask,
170+ project = project,
171+ outputDir = framework.outputFile
172+ )
173+ }
174+
175+ private fun copyResourcesFromLibraries (
176+ linkTask : KotlinNativeLink ,
177+ project : Project ,
178+ outputDir : File
179+ ) {
180+ linkTask.libraries
181+ .plus(linkTask.intermediateLibrary.get())
182+ .filter { it.extension == " klib" }
183+ .forEach {
184+ project.logger.info(" copy resources from $it into $outputDir " )
185+ val klibKonan = org.jetbrains.kotlin.konan.file.File (it.path)
186+ val klib = KotlinLibraryLayoutImpl (klibKonan)
187+ val layout = klib.extractingToTemp
188+
189+ File (layout.resourcesDir.path).copyRecursively(
190+ target = outputDir,
191+ overwrite = true
192+ )
193+ }
194+ }
195+
196+ private fun createCopyFrameworkResourcesTask (linkTask : KotlinNativeLink ) {
197+ val framework = linkTask.binary as Framework
198+ val project = linkTask.project
199+ val taskName = linkTask.name.replace(" link" , " copyResources" )
200+
201+ val copyTask = project.tasks.create(taskName, CopyFrameworkResourcesToAppTask ::class .java) {
202+ this .framework = framework
203+ }
204+ copyTask.dependsOn(linkTask)
205+
206+ val xcodeTask = project.tasks.maybeCreate(
207+ " copyFrameworkResourcesToApp" ,
208+ CopyFrameworkResourcesToAppEntryPointTask ::class .java
209+ )
210+
211+ if (framework.target.konanTarget == xcodeTask.konanTarget &&
212+ framework.buildType.getName() == xcodeTask.configuration
213+ ) {
214+ xcodeTask.dependsOn(copyTask)
215+ }
216+ }
217+
218+ private fun setupTestsResources () {
219+ val kotlinNativeTarget = compilation.target as KotlinNativeTarget
220+ val project = kotlinNativeTarget.project
221+
222+ kotlinNativeTarget.binaries
223+ .matching { it is TestExecutable && it.compilation.associateWith.contains(compilation) }
224+ .configureEach {
225+ val executable = this as TestExecutable
226+
227+ val linkTask = executable.linkTask
228+ linkTask.doLast {
229+ copyResourcesFromLibraries(
230+ linkTask = linkTask,
231+ project = project,
232+ outputDir = executable.outputDirectory
233+ )
154234 }
155235 }
156236 }
0 commit comments