Foundations(iOS Sourceset): - Fix test resource loading for iOS targets(using Gradle env. variables).

- Bring in the SwiftPackageManager for KMP plugin, to use Swift libraries for iOS implementations(and configure accordingly).
  - Bring in cachemap dependency(for iOS LargeCache implementation).
This commit is contained in:
KotlinGeekDev
2026-01-12 14:52:12 +01:00
parent 086e929e32
commit b94f8c9083
3 changed files with 50 additions and 16 deletions
+4 -1
View File
@@ -27,4 +27,7 @@ android.nonFinalResIds=false
kotlin.daemon.jvmargs=-Xmx12g -XX:MaxMetaspaceSize=3g kotlin.daemon.jvmargs=-Xmx12g -XX:MaxMetaspaceSize=3g
# because we use a custom jvmAndroid target # because we use a custom jvmAndroid target
kotlin.mpp.applyDefaultHierarchyTemplate=false kotlin.mpp.applyDefaultHierarchyTemplate=false
# This is needed for the Swift bridge to work.
kotlin.mpp.enableCInteropCommonization=true
+40 -1
View File
@@ -1,11 +1,17 @@
@file:OptIn(ExperimentalSpmForKmpFeature::class)
import com.vanniktech.maven.publish.KotlinMultiplatform import com.vanniktech.maven.publish.KotlinMultiplatform
import io.github.frankois944.spmForKmp.swiftPackageConfig
import io.github.frankois944.spmForKmp.utils.ExperimentalSpmForKmpFeature
import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest
plugins { plugins {
alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.androidLibrary) alias(libs.plugins.androidLibrary)
alias(libs.plugins.serialization) alias(libs.plugins.serialization)
alias(libs.plugins.vanniktech.mavenPublish) alias(libs.plugins.vanniktech.mavenPublish)
id("io.github.frankois944.spmForKmp") version "1.4.0"
} }
android { android {
@@ -74,6 +80,27 @@ kotlin {
// https://developer.android.com/kotlin/multiplatform/migrate // https://developer.android.com/kotlin/multiplatform/migrate
val xcfName = "quartz-kmpKit" val xcfName = "quartz-kmpKit"
listOf(
iosArm64(),
iosX64(),
iosSimulatorArm64()
).forEach { target ->
target.swiftPackageConfig(cinteropName = "swiftbridge") {
minIos = "17"
minMacos = "14"
dependency {
remotePackageVersion(
url = uri("https://github.com/swift-standards/swift-rfc-3986.git"),
packageName = "swift-rfc-3986",
products = {
add("RFC 3986")
},
version = "0.1.0"
)
}
}
}
iosX64 { iosX64 {
binaries.framework { binaries.framework {
@@ -92,6 +119,18 @@ kotlin {
baseName = xcfName baseName = xcfName
} }
} }
//This makes sure that the resource file directory is visible for iOS tests.
val rootDir = "${rootProject.rootDir.path}/quartz/src/iosTest/resources"
tasks.withType<Test>().configureEach {
environment("TEST_RESOURCES_ROOT", rootDir)
}
tasks.withType<KotlinNativeTest>().configureEach {
environment("TEST_RESOURCES_ROOT", rootDir)
// This is necessary to have the variable propagated on iOS
environment("SIMCTL_CHILD_TEST_RESOURCES_ROOT", rootDir)
}
// Source set declarations. // Source set declarations.
// Declaring a target automatically creates a source set with the same name. By default, the // Declaring a target automatically creates a source set with the same name. By default, the
@@ -211,7 +250,7 @@ kotlin {
iosMain { iosMain {
dependsOn(commonMain.get()) dependsOn(commonMain.get())
dependencies { dependencies {
implementation("io.github.charlietap:cachemap:0.2.4")
} }
} }
@@ -20,26 +20,18 @@
*/ */
package com.vitorpamplona.quartz package com.vitorpamplona.quartz
import kotlinx.cinterop.BetaInteropApi
import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.ExperimentalForeignApi
import platform.Foundation.NSBundle import kotlinx.cinterop.toKString
import platform.Foundation.NSString import platform.Foundation.NSString
import platform.Foundation.NSUTF8StringEncoding import platform.Foundation.NSUTF8StringEncoding
import platform.Foundation.stringWithContentsOfFile import platform.Foundation.stringWithContentsOfFile
import platform.darwin.NSObject import platform.posix.getenv
import platform.darwin.NSObjectMeta
actual class TestResourceLoader { actual class TestResourceLoader {
@OptIn(ExperimentalForeignApi::class, BetaInteropApi::class) @OptIn(ExperimentalForeignApi::class)
actual fun loadString(file: String): String { actual fun loadString(file: String): String {
val bundle = NSBundle.bundleForClass(BundleMarker) val resourceDir = getenv("TEST_RESOURCES_ROOT")?.toKString()
val path = val filePath = "$resourceDir/$file"
bundle.pathForResource(file, ofType = null) return NSString.stringWithContentsOfFile(filePath, encoding = NSUTF8StringEncoding, error = null) as String
?: throw IllegalArgumentException("Resource not found: $file")
return NSString.stringWithContentsOfFile(path, encoding = NSUTF8StringEncoding, error = null)!!
}
private class BundleMarker : NSObject() {
companion object : NSObjectMeta()
} }
} }