Skip to content

Commit

Permalink
Gradle, native: Add a DSL shortcut for iOS, watchsOS and tvOS
Browse files Browse the repository at this point in the history
This patch adds a group of shortcut DSL methods allowing a user to
create simulator and device targets for Apple platforms along with
corresponding common source set(s) in one command. iOS, tvOS and
watchOS targets are supported.

Issue #KT-33856 fixed
  • Loading branch information
ilmat192 committed Oct 11, 2019
1 parent 9126905 commit 9ab2b92
Show file tree
Hide file tree
Showing 39 changed files with 506 additions and 4 deletions.
Expand Up @@ -13,7 +13,8 @@ import org.jetbrains.kotlin.konan.util.DependencyDirectories
class Distribution(
private val onlyDefaultProfiles: Boolean = false,
private val konanHomeOverride: String? = null,
private val runtimeFileOverride: String? = null) {
private val runtimeFileOverride: String? = null
) {

val localKonanDir = DependencyDirectories.localKonanDir

Expand Down
Expand Up @@ -6,11 +6,16 @@
package org.jetbrains.kotlin.gradle.plugin

import org.gradle.api.NamedDomainObjectCollection
import org.gradle.api.NamedDomainObjectContainer

interface KotlinTargetsContainer {
val targets: NamedDomainObjectCollection<KotlinTarget>
}

interface KotlinTargetsContainerWithPresets : KotlinTargetsContainer {
val presets: NamedDomainObjectCollection<KotlinTargetPreset<*>>
}

interface KotlinSourceSetContainer {
val sourceSets: NamedDomainObjectContainer<KotlinSourceSet>
}
@@ -0,0 +1,77 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/

package org.jetbrains.kotlin.gradle

import org.jetbrains.kotlin.konan.target.HostManager
import org.junit.Assume
import org.junit.Test

class CommonNativeIT : BaseGradleIT() {

private fun doCommonNativeTest(
projectName: String,
libTargets: List<String>,
appTargets: List<String>
) = with(transformProjectWithPluginsDsl(projectName, directoryPrefix = "new-mpp-common-native")) {
val libCompileTasks = libTargets.map { ":lib:compileKotlin${it.capitalize()}" }
val appCompileTasks = appTargets.map { ":app:compileKotlin${it.capitalize()}" }
val appLinkFrameworkTasks = appTargets.map { ":app:linkDebugFramework${it.capitalize()}" }
val appLinkTestTasks = appTargets.map { ":app:linkDebugTest${it.capitalize()}" }

build(":lib:publish") {
assertSuccessful()
assertTasksExecuted(libCompileTasks)
libTargets.forEach {
assertContains("Configuring $it")
assertFileExists("lib/build/classes/kotlin/$it/main/lib.klib")
}
}

build(":app:build", *appLinkTestTasks.toTypedArray()) {
assertSuccessful()
assertTasksExecuted(appCompileTasks)
assertTasksExecuted(appLinkFrameworkTasks)
assertTasksExecuted(appLinkTestTasks)

appTargets.forEach {
assertFileExists("app/build/classes/kotlin/$it/main/app.klib")
assertFileExists("app/build/bin/$it/debugFramework")
assertFileExists("app/build/bin/$it/debugTest")
}
}
}

@Test
fun testCommonIos() {
Assume.assumeTrue(HostManager.hostIsMac)
doCommonNativeTest(
"common-ios",
libTargets = listOf("iosLibArm64", "iosLibX64"),
appTargets = listOf("iosArm64", "iosX64")
)
}

@Test
fun testCommonWatchos() {
Assume.assumeTrue(HostManager.hostIsMac)
doCommonNativeTest(
"common-watchos",
libTargets = listOf("watchosLibArm32", "watchosLibArm64", "watchosLibX86"),
appTargets = listOf("watchosArm32", "watchosArm64", "watchosX86")
)
}

@Test
fun testCommonTvos() {
Assume.assumeTrue(HostManager.hostIsMac)
doCommonNativeTest(
"common-tvos",
libTargets = listOf("tvosLibArm64", "tvosLibX64"),
appTargets = listOf("tvosArm64", "tvosX64")
)
}
}

Expand Up @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.util.*
import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import org.jetbrains.kotlin.konan.target.HostManager
import org.junit.Assert
import org.junit.Assume
import org.junit.Ignore
import org.junit.Test
import java.util.jar.JarFile
Expand Down
@@ -0,0 +1,22 @@
plugins {
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
}

repositories {
mavenLocal()
jcenter()
maven { setUrl(rootProject.projectDir.resolve("repo")) }
}

kotlin {
ios()

// Check that we can reenter the configuration method.
ios {
binaries.framework(listOf(DEBUG))
}

sourceSets["iosMain"].dependencies {
implementation("common.ios:lib:1.0")
}
}
@@ -0,0 +1,3 @@
package common.ios.app

actual fun platform(): String = "Device"
@@ -0,0 +1,10 @@
package common.ios.app

import common.ios.lib.*

expect fun platform(): String

fun appFunction() {
libFunction()
println(platform())
}
@@ -0,0 +1,7 @@
import common.ios.app.*
import kotlin.test.*

@Test
fun test() {
appFunction()
}
@@ -0,0 +1,3 @@
package common.ios.app

actual fun platform(): String = "Simulator"
@@ -0,0 +1,25 @@
plugins {
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
id("maven-publish")
}

group = "common.ios"
version = "1.0"

repositories {
mavenLocal()
jcenter()
}

kotlin {
ios("iosLib")
ios("iosLib") {
println("Configuring ${this.name}")
}
}

publishing {
repositories {
maven { setUrl(rootProject.projectDir.resolve("repo")) }
}
}
@@ -0,0 +1,3 @@
package common.ios.lib

actual fun platform(): String = "Device"
@@ -0,0 +1,7 @@
package common.ios.lib

expect fun platform(): String

fun libFunction() {
println(platform())
}
@@ -0,0 +1,3 @@
package common.ios.lib

actual fun platform(): String = "Simulator"
@@ -0,0 +1,12 @@
pluginManagement {
repositories {
mavenLocal()
jcenter()
gradlePluginPortal()
}
}

enableFeaturePreview("GRADLE_METADATA")

include(":app")
include(":lib")
@@ -0,0 +1,22 @@
plugins {
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
}

repositories {
mavenLocal()
jcenter()
maven { setUrl(rootProject.projectDir.resolve("repo")) }
}

kotlin {
tvos()

// Check that we can reenter the configuration method.
tvos {
binaries.framework(listOf(DEBUG))
}

sourceSets["tvosMain"].dependencies {
implementation("common.tvos:lib:1.0")
}
}
@@ -0,0 +1,3 @@
package common.tvos.app

actual fun platform(): String = "Device"
@@ -0,0 +1,12 @@


package common.tvos.app

import common.tvos.lib.*

expect fun platform(): String

fun appFunction() {
libFunction()
println(platform())
}
@@ -0,0 +1,7 @@
import common.tvos.app.*
import kotlin.test.*

@Test
fun test() {
appFunction()
}
@@ -0,0 +1,3 @@
package common.tvos.app

actual fun platform(): String = "Simulator"
@@ -0,0 +1,25 @@
plugins {
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
id("maven-publish")
}

group = "common.tvos"
version = "1.0"

repositories {
mavenLocal()
jcenter()
}

kotlin {
tvos("tvosLib")
tvos("tvosLib") {
println("Configuring ${this.name}")
}
}

publishing {
repositories {
maven { setUrl(rootProject.projectDir.resolve("repo")) }
}
}
@@ -0,0 +1,3 @@
package common.tvos.lib

actual fun platform(): String = "Device"
@@ -0,0 +1,7 @@
package common.tvos.lib

expect fun platform(): String

fun libFunction() {
println(platform())
}
@@ -0,0 +1,3 @@
package common.tvos.lib

actual fun platform(): String = "Simulator"
@@ -0,0 +1,12 @@
pluginManagement {
repositories {
mavenLocal()
jcenter()
gradlePluginPortal()
}
}

enableFeaturePreview("GRADLE_METADATA")

include(":app")
include(":lib")
@@ -0,0 +1,22 @@
plugins {
id("org.jetbrains.kotlin.multiplatform").version("<pluginMarkerVersion>")
}

repositories {
mavenLocal()
jcenter()
maven { setUrl(rootProject.projectDir.resolve("repo")) }
}

kotlin {
watchos()

// Check that we can reenter the configuration method.
watchos {
binaries.framework(listOf(DEBUG))
}

sourceSets["watchosMain"].dependencies {
implementation("common.watchos:lib:1.0")
}
}
@@ -0,0 +1,3 @@
package common.watchos.app

actual val bitness: Int = 32
@@ -0,0 +1,3 @@
package common.watchos.app

actual val bitness: Int = 64
@@ -0,0 +1,5 @@
package common.watchos.app

expect val bitness: Int

actual fun platform(): String = "Device$bitness"
@@ -0,0 +1,10 @@
package common.watchos.app

import common.watchos.lib.*

expect fun platform(): String

fun appFunction() {
libFunction()
println(platform())
}
@@ -0,0 +1,7 @@
import common.watchos.app.*
import kotlin.test.*

@Test
fun test() {
appFunction()
}

0 comments on commit 9ab2b92

Please sign in to comment.