Кросс-компиляция Kotlin для нескольких целей за один запуск сборки

#kotlin #cross-compiling #kotlin-native

#kotlin #кросс-компиляция #kotlin-native

Вопрос:

Стандартная конфигурация Kotlin native project gradle выглядит следующим образом:

 plugins {
    kotlin("multiplatform") version "1.4.10"
}
group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}
kotlin {
    val hostOs = System.getProperty("os.name")
    val isMingwX64 = hostOs.startsWith("Windows")
    val nativeTarget = when {
        hostOs == "Mac OS X" -> macosX64("native")
        hostOs == "Linux" -> linuxX64("native")
        isMingwX64 -> mingwX64("native")
        else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
    }

    nativeTarget.apply {
        binaries {
            executable {
                entryPoint = "main"
            }
        }
    }
    sourceSets {
        val nativeMain by getting
        val nativeTest by getting
    }
}
  

Такая конфигурация может создавать двоичные файлы только для одной цели. Как можно настроить конфигурацию так, чтобы одна сборка создавала 3 двоичных файла для всех упомянутых целей: Windows, Linux и macOS?

Ответ №1:

Вы можете просто задать несколько целей, а затем выполнить assemble задачу, чтобы создать двоичные файлы для всех доступных на вашем хост-компьютере. Это важно, поскольку двоичный файл для macOS нельзя создать нигде, кроме как на хосте macOS, Windows target также имеет некоторые сложные приготовления (см. Этот выпуск ). Кроме того, могут возникнуть некоторые проблемы с исходными наборами — если их содержимое идентично, возможно, стоит подключить их, как в примере ниже:

 kotlin {
    macosX64("nativeMac")
    linuxX64("nativeLin")
    mingwX64("nativeWin")

     targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
        binaries {
            executable {
                entryPoint = "main"
            }
        }
    }

    sourceSets {
        val nativeMacMain by getting //let's assume that you work on Mac and so put all the code here
        val nativeLinMain by getting {
            dependsOn(nativeMacMain)
        }
    }
}