Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin build FatFramework with defined minimum iOS version

I want to deploy my multiplatform project to .framework with supported iOS architecture using FatFramework using this gradle configuration. It's work but I founded in info.plist that it have default MinimumOSVersion to iOS 9 so I can't used my library below that version.

Is there any way / possible to configure the minimum iOS version for my lib ?

import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask

    plugins {
        id("org.jetbrains.kotlin.multiplatform") version "1.3.61"
        id("maven-publish")
        id("com.jfrog.bintray") version "1.8.4"
        id("org.jetbrains.dokka") version "0.10.0"
    }

    group = "com.example.lib"
    version = "1.0.0"


    repositories {
        mavenCentral()
        jcenter()
    }


    kotlin {
        jvm()
        val iosX64 = iosX64("ios")
        val iosArm64 = iosArm64("iosArm64")
        val iosArm32 = iosArm32("iosArm32")

        val frameworkName = "EXAMPLE-LIB"

        configure(listOf(iosX64, iosArm64, iosArm32)) {
            binaries.framework {
                baseName = frameworkName
            }
        }

        sourceSets {
            named("commonMain") {
                dependencies {
                    implementation(kotlin("stdlib-common"))
                    implementation(kotlin("stdlib-jdk7"))
                    implementation(kotlin("stdlib-jdk8"))
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-common:1.3.0-RC")
                    implementation(kotlin("reflect"))
                }
            }
            named("commonTest") {
                dependencies {
                    implementation(kotlin("test-common"))
                    implementation(kotlin("test-annotations-common"))
                    implementation(kotlin("reflect"))
                }
            }
            named("jvmMain") {
                dependencies {
                    implementation(kotlin("stdlib-jdk8"))
                }
            }
            named("jvmTest") {
                dependencies {
                    implementation(kotlin("test"))
                    implementation(kotlin("test-junit"))
                }
            }
            val iosMain by getting {
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.0-RC")
                    implementation("io.ktor:ktor-client-ios:1.2.6")
                }
            }
            val iosArm64Main by getting {
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.0-RC")
                    implementation("io.ktor:ktor-client-ios:1.2.6")
                }
            }
            val iosArm32Main by getting {
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:1.3.0-RC")
                    implementation("io.ktor:ktor-client-ios:1.2.6")
                }
            }
        }

        val debugFatFramework by tasks.creating(FatFrameworkTask::class) {
            baseName = frameworkName
            from(
                iosArm32.binaries.getFramework("debug"),
                iosArm64.binaries.getFramework("debug"),
                iosX64.binaries.getFramework("debug")
            )
            destinationDir = buildDir.resolve("fat-framework/debug")
            group = "Universal framework"
            description = "Builds a debug universal (fat) framework"
        }

        val releaseFatFramework by tasks.creating(FatFrameworkTask::class) {
            baseName = frameworkName
            from(
                iosArm32.binaries.getFramework("release"),
                iosArm64.binaries.getFramework("release"),
                iosX64.binaries.getFramework("release")
            )
            destinationDir = buildDir.resolve("fat-framework/release")
            group = "Universal framework"
            description = "Builds a release universal (fat) framework"
        }

        val zipDebugFatFramework by tasks.creating(Zip::class) {
            dependsOn(debugFatFramework)
            from(debugFatFramework)
            from("LICENSE.md")
        }

        val zipReleaseFatFramework by tasks.creating(Zip::class) {
            dependsOn(releaseFatFramework)
            from(releaseFatFramework)
            from("LICENSE.md")
        }


    }

    tasks.register<Exec>("generateThriftModels") {
        executable = "java"
        args(
            "-jar", "thrifty-compiler.jar",
            "--lang", "kotlin",
            "--omit-generated-annotations",
            "--list-type=kotlin.collections.ArrayList",
            "--set-type=kotlin.collections.LinkedHashSet",
            "--out", "src/commonMain/kotlin",
            "--path", "./thrift/",
            "./thrift/nativeapp.thrift"
        )
    }
like image 591
Davin Reinaldo Gozali Avatar asked Nov 29 '25 20:11

Davin Reinaldo Gozali


1 Answers

This parameter is derived from the Kotlin/Native's compiler properties list. It can be found there:~/.konan/kotlin-native-prebuilt-<hostname>-<version>/konan/konan.properties. The value responsible for the MinimumOSVersion is the osVersionMin.<target_name>. This should be set per target. It can be changed manually, and this new value will be used by all your projects.

Also, after 1.4.30 there is a new way to specify compiler properties. See in this document for example. I would recommend using it as follows:

...    
        configure(listOf(iosX64, iosArm64, iosArm32)) {
            binaries.framework {
                freeCompilerArgs += listOf("-Xoverride-konan-properties=osVersionMin.ios_arm32=7;osVersionMin.ios_arm64=7;osVersionMin.ios_x64=7")
            }
        }
...
like image 111
Artyom Degtyarev Avatar answered Dec 02 '25 05:12

Artyom Degtyarev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!