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) {
X64(64),
X86(32),
ARM64(64),
ARM32(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 LINUX_X64 : KonanTarget("linux_x64", Family.LINUX, 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 LINUX_ARM32_HFP : KonanTarget("linux_arm32_hfp", Family.LINUX, Architecture.ARM32)
object LINUX_MIPS32 : KonanTarget("linux_mips32", Family.LINUX, Architecture.MIPS32)
@@ -58,7 +60,7 @@ object PredefinedKonanTargets {
ANDROID_ARM32, ANDROID_ARM64,
IOS_ARM32, IOS_ARM64, IOS_X64,
LINUX_X64, LINUX_ARM32_HFP, LINUX_MIPS32, LINUX_MIPSEL32,
MINGW_X64,
MINGW_X64, MINGW_X86,
MACOS_X64,
KonanTarget.WASM32
)
@@ -188,13 +190,18 @@ open class HostManager(subtargetProvider: SubTargetProvider = NoSubTargets()) {
) + zephyrSubtargets,
KonanTarget.MINGW_X64 to setOf(
KonanTarget.MINGW_X64,
KonanTarget.WASM32
KonanTarget.WASM32,
KonanTarget.LINUX_X64,
KonanTarget.LINUX_ARM32_HFP,
KonanTarget.ANDROID_ARM32
) + zephyrSubtargets,
KonanTarget.MACOS_X64 to setOf(
KonanTarget.MACOS_X64,
KonanTarget.IOS_ARM32,
KonanTarget.IOS_ARM64,
KonanTarget.IOS_X64,
KonanTarget.LINUX_X64,
KonanTarget.LINUX_ARM32_HFP,
KonanTarget.ANDROID_ARM32,
KonanTarget.ANDROID_ARM64,
KonanTarget.WASM32
@@ -18,22 +18,44 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import org.jetbrains.kotlin.konan.target.HostManager
import org.junit.Assert
import org.junit.Test
import java.lang.StringBuilder
import java.util.jar.JarFile
import java.util.zip.ZipFile
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue
class NewMultiplatformIT : BaseGradleIT() {
val gradleVersion = GradleVersionRequired.AtLeast("4.7")
data class NativeTargets(val current: String, val supported: List<String>, val unsupported: List<String>)
val nativeHostTargetName = when {
fun configure(): NativeTargets {
val all = listOf("linux64", "macos64", "mingw64", "wasm32")
val current = when {
HostManager.hostIsMingw -> "mingw64"
HostManager.hostIsLinux -> "linux64"
HostManager.hostIsMac -> "macos64"
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") =
classesDir(sourceSet = "$targetName/$sourceSetName")
@@ -615,19 +637,21 @@ class NewMultiplatformIT : BaseGradleIT() {
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")) {
setupWorkingDir()
gradleBuildScript().modify {
it.replace("implementation 'com.example:sample-lib:1.0'", "implementation 'com.example:sample-lib-metadata:1.0'") + "\n" + """
repositories { maven { url '${repoDir.toURI()}' } }
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()
it.replace("implementation 'com.example:sample-lib:1.0'", "implementation 'com.example:sample-lib-metadata:1.0'") +
"\nrepositories { maven { url '${repoDir.toURI()}' } }\n\n" + dependencies
}
build("assemble") {
@@ -639,12 +663,8 @@ class NewMultiplatformIT : BaseGradleIT() {
@Test
fun testPublishingOnlySupportedNativeTargets() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) {
val (publishedVariant, nonPublishedVariant) = when {
HostManager.hostIsMac -> "macos64" to "linux64"
HostManager.hostIsLinux -> "linux64" to "macos64"
HostManager.hostIsMingw -> "mingw64" to "linux64"
else -> error("Unknown host")
}
val publishedVariant = nativeHostTargetName
val nonPublishedVariant = unsupportedNativeTargets[0]
build("publish") {
assertSuccessful()
@@ -1092,9 +1112,13 @@ class NewMultiplatformIT : BaseGradleIT() {
}
val host = nativeHostTargetName
val libraryCinteropTask = ":projectLibrary:cinteropStdio${host.capitalize()}"
val libraryCompileTask = ":projectLibrary:compileKotlin${host.capitalize()}"
build(":projectLibrary:build") {
assertSuccessful()
assertTasksExecuted(":projectLibrary:cinteropStdio${host.capitalize()}")
assertTasksExecuted(libraryCinteropTask)
assertTrue(output.contains("Project test"), "No test output found")
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.
build(":projectLibrary:build") {
assertSuccessful()
assertTasksUpToDate(
":projectLibrary:cinteropStdio${host.capitalize()}",
":projectLibrary:compileKotlin${host.capitalize()}"
)
assertTasksUpToDate(libraryCinteropTask, libraryCompileTask)
}
build(":projectLibrary:build", "-Porg.jetbrains.kotlin.native.version=0.9.2") {
build(libraryCinteropTask, libraryCompileTask, "-Porg.jetbrains.kotlin.native.version=1.1.0") {
assertSuccessful()
assertTasksExecuted(
":projectLibrary:cinteropStdio${host.capitalize()}",
":projectLibrary:compileKotlin${host.capitalize()}"
)
assertTasksExecuted(libraryCinteropTask, libraryCompileTask)
}
}
}
@@ -26,7 +26,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("jvm") as KotlinJvmTargetPreset,
configure
)
fun jvm() = jvm("jvm") { }
fun jvm(name: String) = jvm(name) { }
fun jvm(name: String, configure: Closure<*>) = jvm(name) { ConfigureUtil.configure(configure, this) }
@@ -41,7 +41,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("js") as KotlinJsTargetPreset,
configure
)
fun js() = js("js") { }
fun js(name: String) = js(name) { }
fun js(name: String, configure: Closure<*>) = js(name) { ConfigureUtil.configure(configure, this) }
@@ -56,7 +56,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("android") as KotlinAndroidTargetPreset,
configure
)
fun android() = android("android") { }
fun android(name: String) = android(name) { }
fun android(name: String, configure: Closure<*>) = android(name) { ConfigureUtil.configure(configure, this) }
@@ -71,7 +71,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("androidNativeArm32") as KotlinNativeTargetPreset,
configure
)
fun androidNativeArm32() = androidNativeArm32("androidNativeArm32") { }
fun androidNativeArm32(name: String) = androidNativeArm32(name) { }
fun androidNativeArm32(name: String, configure: Closure<*>) = androidNativeArm32(name) { ConfigureUtil.configure(configure, this) }
@@ -86,7 +86,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("androidNativeArm64") as KotlinNativeTargetPreset,
configure
)
fun androidNativeArm64() = androidNativeArm64("androidNativeArm64") { }
fun androidNativeArm64(name: String) = androidNativeArm64(name) { }
fun androidNativeArm64(name: String, configure: Closure<*>) = androidNativeArm64(name) { ConfigureUtil.configure(configure, this) }
@@ -101,7 +101,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("iosArm32") as KotlinNativeTargetPreset,
configure
)
fun iosArm32() = iosArm32("iosArm32") { }
fun iosArm32(name: String) = iosArm32(name) { }
fun iosArm32(name: String, configure: Closure<*>) = iosArm32(name) { ConfigureUtil.configure(configure, this) }
@@ -116,7 +116,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("iosArm64") as KotlinNativeTargetPreset,
configure
)
fun iosArm64() = iosArm64("iosArm64") { }
fun iosArm64(name: String) = iosArm64(name) { }
fun iosArm64(name: String, configure: Closure<*>) = iosArm64(name) { ConfigureUtil.configure(configure, this) }
@@ -131,7 +131,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("iosX64") as KotlinNativeTargetPreset,
configure
)
fun iosX64() = iosX64("iosX64") { }
fun iosX64(name: String) = iosX64(name) { }
fun iosX64(name: String, configure: Closure<*>) = iosX64(name) { ConfigureUtil.configure(configure, this) }
@@ -146,7 +146,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxX64") as KotlinNativeTargetPreset,
configure
)
fun linuxX64() = linuxX64("linuxX64") { }
fun linuxX64(name: String) = linuxX64(name) { }
fun linuxX64(name: String, configure: Closure<*>) = linuxX64(name) { ConfigureUtil.configure(configure, this) }
@@ -161,7 +161,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxArm32Hfp") as KotlinNativeTargetPreset,
configure
)
fun linuxArm32Hfp() = linuxArm32Hfp("linuxArm32Hfp") { }
fun linuxArm32Hfp(name: String) = linuxArm32Hfp(name) { }
fun linuxArm32Hfp(name: String, configure: Closure<*>) = linuxArm32Hfp(name) { ConfigureUtil.configure(configure, this) }
@@ -176,7 +176,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxMips32") as KotlinNativeTargetPreset,
configure
)
fun linuxMips32() = linuxMips32("linuxMips32") { }
fun linuxMips32(name: String) = linuxMips32(name) { }
fun linuxMips32(name: String, configure: Closure<*>) = linuxMips32(name) { ConfigureUtil.configure(configure, this) }
@@ -191,7 +191,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("linuxMipsel32") as KotlinNativeTargetPreset,
configure
)
fun linuxMipsel32() = linuxMipsel32("linuxMipsel32") { }
fun linuxMipsel32(name: String) = linuxMipsel32(name) { }
fun linuxMipsel32(name: String, configure: Closure<*>) = linuxMipsel32(name) { ConfigureUtil.configure(configure, this) }
@@ -206,12 +206,27 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("mingwX64") as KotlinNativeTargetPreset,
configure
)
fun mingwX64() = mingwX64("mingwX64") { }
fun mingwX64(name: String) = mingwX64(name) { }
fun mingwX64(name: String, configure: Closure<*>) = mingwX64(name) { 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(
name: String = "macosX64",
configure: KotlinNativeTarget.() -> Unit = { }
@@ -221,7 +236,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("macosX64") as KotlinNativeTargetPreset,
configure
)
fun macosX64() = macosX64("macosX64") { }
fun macosX64(name: String) = macosX64(name) { }
fun macosX64(name: String, configure: Closure<*>) = macosX64(name) { ConfigureUtil.configure(configure, this) }
@@ -236,7 +251,7 @@ interface KotlinTargetContainerWithPresetFunctions : KotlinTargetsContainerWithP
presets.getByName("wasm32") as KotlinNativeTargetPreset,
configure
)
fun wasm32() = wasm32("wasm32") { }
fun wasm32(name: String) = wasm32(name) { }
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 ->
addArg("-l", library.absolutePath)
addArg("-library", library.absolutePath)
}
addArgs("-copt", allHeadersDirs.map { "-I${it.absolutePath}" })