Merge rr/kishmakov/KT-30056 into master

This commit is contained in:
Kirill.Shmakov
2019-02-25 11:45:55 +00:00
4 changed files with 87 additions and 47 deletions
@@ -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
@@ -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()}"
)
} }
} }
} }
@@ -26,7 +26,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("jvm") as KotlinJvmTargetPreset, presets.getByName("jvm") as KotlinJvmTargetPreset,
configure configure
) )
fun jvm() = jvm("jvm") { } fun jvm() = jvm("jvm") { }
fun jvm(name: String) = jvm(name) { } fun jvm(name: String) = jvm(name) { }
fun jvm(name: String, configure: Closure<*>) = jvm(name) { ConfigureUtil.configure(configure, this) } fun jvm(name: String, configure: Closure<*>) = jvm(name) { ConfigureUtil.configure(configure, this) }
@@ -41,7 +41,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("js") as KotlinJsTargetPreset, presets.getByName("js") as KotlinJsTargetPreset,
configure configure
) )
fun js() = js("js") { } fun js() = js("js") { }
fun js(name: String) = js(name) { } fun js(name: String) = js(name) { }
fun js(name: String, configure: Closure<*>) = js(name) { ConfigureUtil.configure(configure, this) } fun js(name: String, configure: Closure<*>) = js(name) { ConfigureUtil.configure(configure, this) }
@@ -56,7 +56,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("android") as KotlinAndroidTargetPreset, presets.getByName("android") as KotlinAndroidTargetPreset,
configure configure
) )
fun android() = android("android") { } fun android() = android("android") { }
fun android(name: String) = android(name) { } fun android(name: String) = android(name) { }
fun android(name: String, configure: Closure<*>) = android(name) { ConfigureUtil.configure(configure, this) } fun android(name: String, configure: Closure<*>) = android(name) { ConfigureUtil.configure(configure, this) }
@@ -71,7 +71,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("androidNativeArm32") as KotlinNativeTargetPreset, presets.getByName("androidNativeArm32") as KotlinNativeTargetPreset,
configure configure
) )
fun androidNativeArm32() = androidNativeArm32("androidNativeArm32") { } fun androidNativeArm32() = androidNativeArm32("androidNativeArm32") { }
fun androidNativeArm32(name: String) = androidNativeArm32(name) { } fun androidNativeArm32(name: String) = androidNativeArm32(name) { }
fun androidNativeArm32(name: String, configure: Closure<*>) = androidNativeArm32(name) { ConfigureUtil.configure(configure, this) } fun androidNativeArm32(name: String, configure: Closure<*>) = androidNativeArm32(name) { ConfigureUtil.configure(configure, this) }
@@ -86,7 +86,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("androidNativeArm64") as KotlinNativeTargetPreset, presets.getByName("androidNativeArm64") as KotlinNativeTargetPreset,
configure configure
) )
fun androidNativeArm64() = androidNativeArm64("androidNativeArm64") { } fun androidNativeArm64() = androidNativeArm64("androidNativeArm64") { }
fun androidNativeArm64(name: String) = androidNativeArm64(name) { } fun androidNativeArm64(name: String) = androidNativeArm64(name) { }
fun androidNativeArm64(name: String, configure: Closure<*>) = androidNativeArm64(name) { ConfigureUtil.configure(configure, this) } fun androidNativeArm64(name: String, configure: Closure<*>) = androidNativeArm64(name) { ConfigureUtil.configure(configure, this) }
@@ -101,7 +101,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("iosArm32") as KotlinNativeTargetPreset, presets.getByName("iosArm32") as KotlinNativeTargetPreset,
configure configure
) )
fun iosArm32() = iosArm32("iosArm32") { } fun iosArm32() = iosArm32("iosArm32") { }
fun iosArm32(name: String) = iosArm32(name) { } fun iosArm32(name: String) = iosArm32(name) { }
fun iosArm32(name: String, configure: Closure<*>) = iosArm32(name) { ConfigureUtil.configure(configure, this) } fun iosArm32(name: String, configure: Closure<*>) = iosArm32(name) { ConfigureUtil.configure(configure, this) }
@@ -116,7 +116,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("iosArm64") as KotlinNativeTargetPreset, presets.getByName("iosArm64") as KotlinNativeTargetPreset,
configure configure
) )
fun iosArm64() = iosArm64("iosArm64") { } fun iosArm64() = iosArm64("iosArm64") { }
fun iosArm64(name: String) = iosArm64(name) { } fun iosArm64(name: String) = iosArm64(name) { }
fun iosArm64(name: String, configure: Closure<*>) = iosArm64(name) { ConfigureUtil.configure(configure, this) } fun iosArm64(name: String, configure: Closure<*>) = iosArm64(name) { ConfigureUtil.configure(configure, this) }
@@ -131,7 +131,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("iosX64") as KotlinNativeTargetPreset, presets.getByName("iosX64") as KotlinNativeTargetPreset,
configure configure
) )
fun iosX64() = iosX64("iosX64") { } fun iosX64() = iosX64("iosX64") { }
fun iosX64(name: String) = iosX64(name) { } fun iosX64(name: String) = iosX64(name) { }
fun iosX64(name: String, configure: Closure<*>) = iosX64(name) { ConfigureUtil.configure(configure, this) } fun iosX64(name: String, configure: Closure<*>) = iosX64(name) { ConfigureUtil.configure(configure, this) }
@@ -146,7 +146,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxX64") as KotlinNativeTargetPreset, presets.getByName("linuxX64") as KotlinNativeTargetPreset,
configure configure
) )
fun linuxX64() = linuxX64("linuxX64") { } fun linuxX64() = linuxX64("linuxX64") { }
fun linuxX64(name: String) = linuxX64(name) { } fun linuxX64(name: String) = linuxX64(name) { }
fun linuxX64(name: String, configure: Closure<*>) = linuxX64(name) { ConfigureUtil.configure(configure, this) } fun linuxX64(name: String, configure: Closure<*>) = linuxX64(name) { ConfigureUtil.configure(configure, this) }
@@ -161,7 +161,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxArm32Hfp") as KotlinNativeTargetPreset, presets.getByName("linuxArm32Hfp") as KotlinNativeTargetPreset,
configure configure
) )
fun linuxArm32Hfp() = linuxArm32Hfp("linuxArm32Hfp") { } fun linuxArm32Hfp() = linuxArm32Hfp("linuxArm32Hfp") { }
fun linuxArm32Hfp(name: String) = linuxArm32Hfp(name) { } fun linuxArm32Hfp(name: String) = linuxArm32Hfp(name) { }
fun linuxArm32Hfp(name: String, configure: Closure<*>) = linuxArm32Hfp(name) { ConfigureUtil.configure(configure, this) } fun linuxArm32Hfp(name: String, configure: Closure<*>) = linuxArm32Hfp(name) { ConfigureUtil.configure(configure, this) }
@@ -176,7 +176,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxMips32") as KotlinNativeTargetPreset, presets.getByName("linuxMips32") as KotlinNativeTargetPreset,
configure configure
) )
fun linuxMips32() = linuxMips32("linuxMips32") { } fun linuxMips32() = linuxMips32("linuxMips32") { }
fun linuxMips32(name: String) = linuxMips32(name) { } fun linuxMips32(name: String) = linuxMips32(name) { }
fun linuxMips32(name: String, configure: Closure<*>) = linuxMips32(name) { ConfigureUtil.configure(configure, this) } fun linuxMips32(name: String, configure: Closure<*>) = linuxMips32(name) { ConfigureUtil.configure(configure, this) }
@@ -191,7 +191,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxMipsel32") as KotlinNativeTargetPreset, presets.getByName("linuxMipsel32") as KotlinNativeTargetPreset,
configure configure
) )
fun linuxMipsel32() = linuxMipsel32("linuxMipsel32") { } fun linuxMipsel32() = linuxMipsel32("linuxMipsel32") { }
fun linuxMipsel32(name: String) = linuxMipsel32(name) { } fun linuxMipsel32(name: String) = linuxMipsel32(name) { }
fun linuxMipsel32(name: String, configure: Closure<*>) = linuxMipsel32(name) { ConfigureUtil.configure(configure, this) } fun linuxMipsel32(name: String, configure: Closure<*>) = linuxMipsel32(name) { ConfigureUtil.configure(configure, this) }
@@ -206,12 +206,27 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("mingwX64") as KotlinNativeTargetPreset, presets.getByName("mingwX64") as KotlinNativeTargetPreset,
configure configure
) )
fun mingwX64() = mingwX64("mingwX64") { } fun mingwX64() = mingwX64("mingwX64") { }
fun mingwX64(name: String) = mingwX64(name) { } fun mingwX64(name: String) = mingwX64(name) { }
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 = { }
@@ -221,7 +236,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("macosX64") as KotlinNativeTargetPreset, presets.getByName("macosX64") as KotlinNativeTargetPreset,
configure configure
) )
fun macosX64() = macosX64("macosX64") { } fun macosX64() = macosX64("macosX64") { }
fun macosX64(name: String) = macosX64(name) { } fun macosX64(name: String) = macosX64(name) { }
fun macosX64(name: String, configure: Closure<*>) = macosX64(name) { ConfigureUtil.configure(configure, this) } fun macosX64(name: String, configure: Closure<*>) = macosX64(name) { ConfigureUtil.configure(configure, this) }
@@ -236,7 +251,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("wasm32") as KotlinNativeTargetPreset, presets.getByName("wasm32") as KotlinNativeTargetPreset,
configure configure
) )
fun wasm32() = wasm32("wasm32") { } fun wasm32() = wasm32("wasm32") { }
fun wasm32(name: String) = wasm32(name) { } fun wasm32(name: String) = wasm32(name) { }
fun wasm32(name: String, configure: Closure<*>) = wasm32(name) { ConfigureUtil.configure(configure, this) } fun wasm32(name: String, configure: Closure<*>) = wasm32(name) { ConfigureUtil.configure(configure, this) }
@@ -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}" })