Kotlin在一次构建运行中交叉编译多个目标

问题描述

认的Kotlin本机项目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
    }
}

这种配置只能为单个目标生成二进制文件。如何调整配置,以使单一构建会为所有提到的目标(Windows,Linux和MacOS)生成3个二进制文件

解决方法

您可以只设置多个目标,然后运行assemble任务将为主机上所有可用的二进制文件生成二进制文件。这很重要,因为除了在macOS主机上之外,无法在任何地方为macOS创建二进制文件,Windows目标也有一些复杂的准备工作(请参见this issue)。另外,源集可能存在一些问题-如果它们的内容相同,则可能值得将它们连接起来,如下例所示:

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)
        }
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...