Merge rr/kishmakov/KT-30056 into master
This commit is contained in:
@@ -23,6 +23,7 @@ enum class Family(
|
|||||||
|
|
||||||
enum class Architecture(val bitness: Int) {
|
enum class Architecture(val bitness: Int) {
|
||||||
X64(64),
|
X64(64),
|
||||||
|
X86(32),
|
||||||
ARM64(64),
|
ARM64(64),
|
||||||
ARM32(32),
|
ARM32(32),
|
||||||
MIPS32(32),
|
MIPS32(32),
|
||||||
@@ -38,6 +39,7 @@ sealed class KonanTarget(override val name: String, val family: Family, val arch
|
|||||||
object IOS_X64 : KonanTarget("ios_x64", Family.IOS, Architecture.X64)
|
object IOS_X64 : KonanTarget("ios_x64", Family.IOS, Architecture.X64)
|
||||||
object LINUX_X64 : KonanTarget("linux_x64", Family.LINUX, Architecture.X64)
|
object LINUX_X64 : KonanTarget("linux_x64", Family.LINUX, Architecture.X64)
|
||||||
object MINGW_X64 : KonanTarget("mingw_x64", Family.MINGW, Architecture.X64)
|
object MINGW_X64 : KonanTarget("mingw_x64", Family.MINGW, Architecture.X64)
|
||||||
|
object MINGW_X86 : KonanTarget("mingw_x86", Family.MINGW, Architecture.X86)
|
||||||
object MACOS_X64 : KonanTarget("macos_x64", Family.OSX, Architecture.X64)
|
object MACOS_X64 : KonanTarget("macos_x64", Family.OSX, Architecture.X64)
|
||||||
object LINUX_ARM32_HFP : KonanTarget("linux_arm32_hfp", Family.LINUX, Architecture.ARM32)
|
object LINUX_ARM32_HFP : KonanTarget("linux_arm32_hfp", Family.LINUX, Architecture.ARM32)
|
||||||
object LINUX_MIPS32 : KonanTarget("linux_mips32", Family.LINUX, Architecture.MIPS32)
|
object LINUX_MIPS32 : KonanTarget("linux_mips32", Family.LINUX, Architecture.MIPS32)
|
||||||
@@ -58,7 +60,7 @@ object PredefinedKonanTargets {
|
|||||||
ANDROID_ARM32, ANDROID_ARM64,
|
ANDROID_ARM32, ANDROID_ARM64,
|
||||||
IOS_ARM32, IOS_ARM64, IOS_X64,
|
IOS_ARM32, IOS_ARM64, IOS_X64,
|
||||||
LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32,
|
LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32,
|
||||||
MINGW_X64,
|
MINGW_X64, MINGW_X86,
|
||||||
MACOS_X64,
|
MACOS_X64,
|
||||||
KonanTarget.WASM32
|
KonanTarget.WASM32
|
||||||
)
|
)
|
||||||
@@ -188,13 +190,18 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
|
|||||||
) + zephyrSubtargets,
|
) + zephyrSubtargets,
|
||||||
KonanTarget.MINGW_X64 to setOf(
|
KonanTarget.MINGW_X64 to setOf(
|
||||||
KonanTarget.MINGW_X64,
|
KonanTarget.MINGW_X64,
|
||||||
KonanTarget.WASM32
|
KonanTarget.WASM32,
|
||||||
|
KonanTarget.LINUX_X64,
|
||||||
|
KonanTarget.LINUX_ARM32_HFP,
|
||||||
|
KonanTarget.ANDROID_ARM32
|
||||||
) + zephyrSubtargets,
|
) + zephyrSubtargets,
|
||||||
KonanTarget.MACOS_X64 to setOf(
|
KonanTarget.MACOS_X64 to setOf(
|
||||||
KonanTarget.MACOS_X64,
|
KonanTarget.MACOS_X64,
|
||||||
KonanTarget.IOS_ARM32,
|
KonanTarget.IOS_ARM32,
|
||||||
KonanTarget.IOS_ARM64,
|
KonanTarget.IOS_ARM64,
|
||||||
KonanTarget.IOS_X64,
|
KonanTarget.IOS_X64,
|
||||||
|
KonanTarget.LINUX_X64,
|
||||||
|
KonanTarget.LINUX_ARM32_HFP,
|
||||||
KonanTarget.ANDROID_ARM32,
|
KonanTarget.ANDROID_ARM32,
|
||||||
KonanTarget.ANDROID_ARM64,
|
KonanTarget.ANDROID_ARM64,
|
||||||
KonanTarget.WASM32
|
KonanTarget.WASM32
|
||||||
|
|||||||
+47
-29
@@ -18,22 +18,44 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
|||||||
import org.jetbrains.kotlin.konan.target.HostManager
|
import org.jetbrains.kotlin.konan.target.HostManager
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import java.lang.StringBuilder
|
||||||
import java.util.jar.JarFile
|
import java.util.jar.JarFile
|
||||||
import java.util.zip.ZipFile
|
import java.util.zip.ZipFile
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFalse
|
import kotlin.test.assertFalse
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
class NewMultiplatformIT : BaseGradleIT() {
|
data class NativeTargets(val current: String, val supported: List<String>, val unsupported: List<String>)
|
||||||
val gradleVersion = GradleVersionRequired.AtLeast("4.7")
|
|
||||||
|
|
||||||
val nativeHostTargetName = when {
|
fun configure(): NativeTargets {
|
||||||
|
val all = listOf("linux64", "macos64", "mingw64", "wasm32")
|
||||||
|
|
||||||
|
val current = when {
|
||||||
HostManager.hostIsMingw -> "mingw64"
|
HostManager.hostIsMingw -> "mingw64"
|
||||||
HostManager.hostIsLinux -> "linux64"
|
HostManager.hostIsLinux -> "linux64"
|
||||||
HostManager.hostIsMac -> "macos64"
|
HostManager.hostIsMac -> "macos64"
|
||||||
else -> error("Unknown host")
|
else -> error("Unknown host")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val unsupported = when {
|
||||||
|
HostManager.hostIsMingw -> listOf("macos64")
|
||||||
|
HostManager.hostIsLinux -> listOf("macos64", "mingw64")
|
||||||
|
HostManager.hostIsMac -> listOf("mingw64")
|
||||||
|
else -> error("Unknown host")
|
||||||
|
}
|
||||||
|
|
||||||
|
val supported = all.filter { !unsupported.contains(it) }
|
||||||
|
|
||||||
|
return NativeTargets(current, supported, unsupported)
|
||||||
|
}
|
||||||
|
|
||||||
|
class NewMultiplatformIT : BaseGradleIT() {
|
||||||
|
val gradleVersion = GradleVersionRequired.AtLeast("4.7")
|
||||||
|
|
||||||
|
val nativeHostTargetName = configure().current
|
||||||
|
val supportedNativeTargets = configure().supported
|
||||||
|
val unsupportedNativeTargets = configure().unsupported
|
||||||
|
|
||||||
private fun Project.targetClassesDir(targetName: String, sourceSetName: String = "main") =
|
private fun Project.targetClassesDir(targetName: String, sourceSetName: String = "main") =
|
||||||
classesDir(sourceSet = "$targetName/$sourceSetName")
|
classesDir(sourceSet = "$targetName/$sourceSetName")
|
||||||
|
|
||||||
@@ -615,19 +637,21 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
projectDir.resolve("repo")
|
projectDir.resolve("repo")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val dependencies = buildString {
|
||||||
|
append("dependencies {\n")
|
||||||
|
append(" allJvmImplementation 'com.example:sample-lib-jvm6:1.0'\n")
|
||||||
|
append(" nodeJsMainImplementation 'com.example:sample-lib-nodejs:1.0'\n")
|
||||||
|
for (target in supportedNativeTargets) {
|
||||||
|
append(" ${target}MainImplementation 'com.example:sample-lib-$target:1.0'\n")
|
||||||
|
}
|
||||||
|
append("}")
|
||||||
|
}
|
||||||
|
|
||||||
with(Project("sample-app", gradleVersion, "new-mpp-lib-and-app")) {
|
with(Project("sample-app", gradleVersion, "new-mpp-lib-and-app")) {
|
||||||
setupWorkingDir()
|
setupWorkingDir()
|
||||||
gradleBuildScript().modify {
|
gradleBuildScript().modify {
|
||||||
it.replace("implementation 'com.example:sample-lib:1.0'", "implementation 'com.example:sample-lib-metadata:1.0'") + "\n" + """
|
it.replace("implementation 'com.example:sample-lib:1.0'", "implementation 'com.example:sample-lib-metadata:1.0'") +
|
||||||
repositories { maven { url '${repoDir.toURI()}' } }
|
"\nrepositories { maven { url '${repoDir.toURI()}' } }\n\n" + dependencies
|
||||||
|
|
||||||
dependencies {
|
|
||||||
allJvmImplementation 'com.example:sample-lib-jvm6:1.0'
|
|
||||||
nodeJsMainImplementation 'com.example:sample-lib-nodejs:1.0'
|
|
||||||
wasm32MainImplementation 'com.example:sample-lib-wasm32:1.0'
|
|
||||||
${nativeHostTargetName}MainImplementation 'com.example:sample-lib-${nativeHostTargetName.toLowerCase()}:1.0'
|
|
||||||
}
|
|
||||||
""".trimIndent()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
build("assemble") {
|
build("assemble") {
|
||||||
@@ -639,12 +663,8 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testPublishingOnlySupportedNativeTargets() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) {
|
fun testPublishingOnlySupportedNativeTargets() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) {
|
||||||
val (publishedVariant, nonPublishedVariant) = when {
|
val publishedVariant = nativeHostTargetName
|
||||||
HostManager.hostIsMac -> "macos64" to "linux64"
|
val nonPublishedVariant = unsupportedNativeTargets[0]
|
||||||
HostManager.hostIsLinux -> "linux64" to "macos64"
|
|
||||||
HostManager.hostIsMingw -> "mingw64" to "linux64"
|
|
||||||
else -> error("Unknown host")
|
|
||||||
}
|
|
||||||
|
|
||||||
build("publish") {
|
build("publish") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
@@ -1092,9 +1112,13 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val host = nativeHostTargetName
|
val host = nativeHostTargetName
|
||||||
|
|
||||||
|
val libraryCinteropTask = ":projectLibrary:cinteropStdio${host.capitalize()}"
|
||||||
|
val libraryCompileTask = ":projectLibrary:compileKotlin${host.capitalize()}"
|
||||||
|
|
||||||
build(":projectLibrary:build") {
|
build(":projectLibrary:build") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(":projectLibrary:cinteropStdio${host.capitalize()}")
|
assertTasksExecuted(libraryCinteropTask)
|
||||||
assertTrue(output.contains("Project test"), "No test output found")
|
assertTrue(output.contains("Project test"), "No test output found")
|
||||||
assertFileExists("projectLibrary/build/classes/kotlin/$host/main/projectLibrary-cinterop-stdio.klib")
|
assertFileExists("projectLibrary/build/classes/kotlin/$host/main/projectLibrary-cinterop-stdio.klib")
|
||||||
}
|
}
|
||||||
@@ -1116,18 +1140,12 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
// Check that changing the compiler version in properties causes interop reprocessing and source recompilation.
|
// Check that changing the compiler version in properties causes interop reprocessing and source recompilation.
|
||||||
build(":projectLibrary:build") {
|
build(":projectLibrary:build") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksUpToDate(
|
assertTasksUpToDate(libraryCinteropTask, libraryCompileTask)
|
||||||
":projectLibrary:cinteropStdio${host.capitalize()}",
|
|
||||||
":projectLibrary:compileKotlin${host.capitalize()}"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
build(":projectLibrary:build", "-Porg.jetbrains.kotlin.native.version=0.9.2") {
|
build(libraryCinteropTask, libraryCompileTask, "-Porg.jetbrains.kotlin.native.version=1.1.0") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(
|
assertTasksExecuted(libraryCinteropTask, libraryCompileTask)
|
||||||
":projectLibrary:cinteropStdio${host.capitalize()}",
|
|
||||||
":projectLibrary:compileKotlin${host.capitalize()}"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -212,6 +212,21 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
|
|||||||
fun mingwX64(name: String, configure: Closure<*>) = mingwX64(name) { ConfigureUtil.configure(configure, this) }
|
fun mingwX64(name: String, configure: Closure<*>) = mingwX64(name) { ConfigureUtil.configure(configure, this) }
|
||||||
fun mingwX64(configure: Closure<*>) = mingwX64 { ConfigureUtil.configure(configure, this) }
|
fun mingwX64(configure: Closure<*>) = mingwX64 { ConfigureUtil.configure(configure, this) }
|
||||||
|
|
||||||
|
fun mingwX86(
|
||||||
|
name: String = "mingwX86",
|
||||||
|
configure: KotlinNativeTarget.() -> Unit = { }
|
||||||
|
): KotlinNativeTarget =
|
||||||
|
configureOrCreate(
|
||||||
|
name,
|
||||||
|
presets.getByName("mingwX86") as KotlinNativeTargetPreset,
|
||||||
|
configure
|
||||||
|
)
|
||||||
|
|
||||||
|
fun mingwX86() = mingwX86("mingwX86") { }
|
||||||
|
fun mingwX86(name: String) = mingwX86(name) { }
|
||||||
|
fun mingwX86(name: String, configure: Closure<*>) = mingwX86(name) { ConfigureUtil.configure(configure, this) }
|
||||||
|
fun mingwX86(configure: Closure<*>) = mingwX86 { ConfigureUtil.configure(configure, this) }
|
||||||
|
|
||||||
fun macosX64(
|
fun macosX64(
|
||||||
name: String = "macosX64",
|
name: String = "macosX64",
|
||||||
configure: KotlinNativeTarget.() -> Unit = { }
|
configure: KotlinNativeTarget.() -> Unit = { }
|
||||||
|
|||||||
+1
-1
@@ -518,7 +518,7 @@ open class CInteropProcess : DefaultTask() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
libraries.files.filterExternalKlibs(project).forEach { library ->
|
libraries.files.filterExternalKlibs(project).forEach { library ->
|
||||||
addArg("-l", library.absolutePath)
|
addArg("-library", library.absolutePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
addArgs("-copt", allHeadersDirs.map { "-I${it.absolutePath}" })
|
addArgs("-copt", allHeadersDirs.map { "-I${it.absolutePath}" })
|
||||||
|
|||||||
Reference in New Issue
Block a user