From 9ab2b928bc0fe4389096a229ccb8f86e8a3ca969 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Fri, 4 Oct 2019 20:02:37 +0700 Subject: [PATCH] Gradle, native: Add a DSL shortcut for iOS, watchsOS and tvOS 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 --- .../kotlin/konan/target/Distribution.kt | 3 +- .../gradle/plugin/KotlinTargetsContainer.kt | 5 + .../jetbrains/kotlin/gradle/CommonNativeIT.kt | 77 ++++++++++++ .../kotlin/gradle/NewMultiplatformIT.kt | 1 + .../common-ios/app/build.gradle.kts | 22 ++++ .../app/src/iosArm64Main/kotlin/device.kt | 3 + .../common-ios/app/src/iosMain/kotlin/main.kt | 10 ++ .../common-ios/app/src/iosTest/kotlin/test.kt | 7 ++ .../app/src/iosX64Main/kotlin/simulator.kt | 3 + .../common-ios/lib/build.gradle.kts | 25 ++++ .../lib/src/iosLibArm64Main/kotlin/device.kt | 3 + .../lib/src/iosLibMain/kotlin/main.kt | 7 ++ .../lib/src/iosLibX64Main/kotlin/simulator.kt | 3 + .../common-ios/settings.gradle.kts | 12 ++ .../common-tvos/app/build.gradle.kts | 22 ++++ .../app/src/tvosArm64Main/kotlin/device.kt | 3 + .../app/src/tvosMain/kotlin/main.kt | 12 ++ .../app/src/tvosTest/kotlin/test.kt | 7 ++ .../app/src/tvosX64Main/kotlin/simulator.kt | 3 + .../common-tvos/lib/build.gradle.kts | 25 ++++ .../lib/src/tvosLibArm64Main/kotlin/device.kt | 3 + .../lib/src/tvosLibMain/kotlin/main.kt | 7 ++ .../src/tvosLibX64Main/kotlin/simulator.kt | 3 + .../common-tvos/settings.gradle.kts | 12 ++ .../common-watchos/app/build.gradle.kts | 22 ++++ .../src/watchosArm32Main/kotlin/device32.kt | 3 + .../src/watchosArm64Main/kotlin/device64.kt | 3 + .../src/watchosDeviceMain/kotlin/device.kt | 5 + .../app/src/watchosMain/kotlin/main.kt | 10 ++ .../app/src/watchosTest/kotlin/test.kt | 7 ++ .../src/watchosX86Main/kotlin/simulator.kt | 3 + .../common-watchos/lib/build.gradle.kts | 25 ++++ .../src/watchosLibDeviceMain/kotlin/device.kt | 3 + .../lib/src/watchosLibMain/kotlin/main.kt | 7 ++ .../src/watchosLibX86Main/kotlin/simulator.kt | 3 + .../common-watchos/settings.gradle.kts | 12 ++ .../dsl/KotlinMultiplatformExtension.kt | 6 +- .../gradle/dsl/KotlinProjectExtension.kt | 5 +- ...otlinTargetContainerWithNativeShortcuts.kt | 118 ++++++++++++++++++ 39 files changed, 506 insertions(+), 4 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonNativeIT.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosArm64Main/kotlin/device.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosTest/kotlin/test.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosX64Main/kotlin/simulator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibArm64Main/kotlin/device.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibX64Main/kotlin/simulator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosArm64Main/kotlin/device.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosTest/kotlin/test.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosX64Main/kotlin/simulator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibArm64Main/kotlin/device.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibX64Main/kotlin/simulator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm32Main/kotlin/device32.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm64Main/kotlin/device64.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosDeviceMain/kotlin/device.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosTest/kotlin/test.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosX86Main/kotlin/simulator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibDeviceMain/kotlin/device.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibMain/kotlin/main.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibX86Main/kotlin/simulator.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/settings.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithNativeShortcuts.kt diff --git a/konan/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt b/konan/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt index ce57133dd28df..b87ca8eb2dc62 100644 --- a/konan/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt +++ b/konan/utils/src/org/jetbrains/kotlin/konan/target/Distribution.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetsContainer.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetsContainer.kt index bd97f69c11a74..9ba2df2868821 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetsContainer.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetsContainer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.NamedDomainObjectCollection +import org.gradle.api.NamedDomainObjectContainer interface KotlinTargetsContainer { val targets: NamedDomainObjectCollection @@ -13,4 +14,8 @@ interface KotlinTargetsContainer { interface KotlinTargetsContainerWithPresets : KotlinTargetsContainer { val presets: NamedDomainObjectCollection> +} + +interface KotlinSourceSetContainer { + val sourceSets: NamedDomainObjectContainer } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonNativeIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonNativeIT.kt new file mode 100644 index 0000000000000..920eafdaded93 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/CommonNativeIT.kt @@ -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, + appTargets: List + ) = 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") + ) + } +} + diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 77785f1d09b71..20c9762b86722 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/build.gradle.kts new file mode 100644 index 0000000000000..32e9b445c16d0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +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") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosArm64Main/kotlin/device.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosArm64Main/kotlin/device.kt new file mode 100644 index 0000000000000..b2c434a997ed1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosArm64Main/kotlin/device.kt @@ -0,0 +1,3 @@ +package common.ios.app + +actual fun platform(): String = "Device" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosMain/kotlin/main.kt new file mode 100644 index 0000000000000..daf87e2aae664 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosMain/kotlin/main.kt @@ -0,0 +1,10 @@ +package common.ios.app + +import common.ios.lib.* + +expect fun platform(): String + +fun appFunction() { + libFunction() + println(platform()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosTest/kotlin/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosTest/kotlin/test.kt new file mode 100644 index 0000000000000..dd46bf393ae95 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosTest/kotlin/test.kt @@ -0,0 +1,7 @@ +import common.ios.app.* +import kotlin.test.* + +@Test +fun test() { + appFunction() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosX64Main/kotlin/simulator.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosX64Main/kotlin/simulator.kt new file mode 100644 index 0000000000000..0ca2796be85d6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/app/src/iosX64Main/kotlin/simulator.kt @@ -0,0 +1,3 @@ +package common.ios.app + +actual fun platform(): String = "Simulator" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/build.gradle.kts new file mode 100644 index 0000000000000..500d390a97c16 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + 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")) } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibArm64Main/kotlin/device.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibArm64Main/kotlin/device.kt new file mode 100644 index 0000000000000..c9bbfbe06fde7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibArm64Main/kotlin/device.kt @@ -0,0 +1,3 @@ +package common.ios.lib + +actual fun platform(): String = "Device" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibMain/kotlin/main.kt new file mode 100644 index 0000000000000..42c32c534b058 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibMain/kotlin/main.kt @@ -0,0 +1,7 @@ +package common.ios.lib + +expect fun platform(): String + +fun libFunction() { + println(platform()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibX64Main/kotlin/simulator.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibX64Main/kotlin/simulator.kt new file mode 100644 index 0000000000000..1a99ed17231ef --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/lib/src/iosLibX64Main/kotlin/simulator.kt @@ -0,0 +1,3 @@ +package common.ios.lib + +actual fun platform(): String = "Simulator" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/settings.gradle.kts new file mode 100644 index 0000000000000..cc1c3d2342f53 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-ios/settings.gradle.kts @@ -0,0 +1,12 @@ +pluginManagement { + repositories { + mavenLocal() + jcenter() + gradlePluginPortal() + } +} + +enableFeaturePreview("GRADLE_METADATA") + +include(":app") +include(":lib") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/build.gradle.kts new file mode 100644 index 0000000000000..3b9dd924f1991 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +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") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosArm64Main/kotlin/device.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosArm64Main/kotlin/device.kt new file mode 100644 index 0000000000000..341089406e5a7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosArm64Main/kotlin/device.kt @@ -0,0 +1,3 @@ +package common.tvos.app + +actual fun platform(): String = "Device" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosMain/kotlin/main.kt new file mode 100644 index 0000000000000..28d9a9e944318 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosMain/kotlin/main.kt @@ -0,0 +1,12 @@ + + +package common.tvos.app + +import common.tvos.lib.* + +expect fun platform(): String + +fun appFunction() { + libFunction() + println(platform()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosTest/kotlin/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosTest/kotlin/test.kt new file mode 100644 index 0000000000000..9ef3b69de9e96 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosTest/kotlin/test.kt @@ -0,0 +1,7 @@ +import common.tvos.app.* +import kotlin.test.* + +@Test +fun test() { + appFunction() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosX64Main/kotlin/simulator.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosX64Main/kotlin/simulator.kt new file mode 100644 index 0000000000000..032044d7c6760 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/app/src/tvosX64Main/kotlin/simulator.kt @@ -0,0 +1,3 @@ +package common.tvos.app + +actual fun platform(): String = "Simulator" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/build.gradle.kts new file mode 100644 index 0000000000000..2eb0c1ef19d3f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + 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")) } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibArm64Main/kotlin/device.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibArm64Main/kotlin/device.kt new file mode 100644 index 0000000000000..e20bdba0dc288 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibArm64Main/kotlin/device.kt @@ -0,0 +1,3 @@ +package common.tvos.lib + +actual fun platform(): String = "Device" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibMain/kotlin/main.kt new file mode 100644 index 0000000000000..afb0084b58467 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibMain/kotlin/main.kt @@ -0,0 +1,7 @@ +package common.tvos.lib + +expect fun platform(): String + +fun libFunction() { + println(platform()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibX64Main/kotlin/simulator.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibX64Main/kotlin/simulator.kt new file mode 100644 index 0000000000000..5f709f2b6415a --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/lib/src/tvosLibX64Main/kotlin/simulator.kt @@ -0,0 +1,3 @@ +package common.tvos.lib + +actual fun platform(): String = "Simulator" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/settings.gradle.kts new file mode 100644 index 0000000000000..cc1c3d2342f53 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-tvos/settings.gradle.kts @@ -0,0 +1,12 @@ +pluginManagement { + repositories { + mavenLocal() + jcenter() + gradlePluginPortal() + } +} + +enableFeaturePreview("GRADLE_METADATA") + +include(":app") +include(":lib") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/build.gradle.kts new file mode 100644 index 0000000000000..517d6422025c4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/build.gradle.kts @@ -0,0 +1,22 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") +} + +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") + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm32Main/kotlin/device32.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm32Main/kotlin/device32.kt new file mode 100644 index 0000000000000..a7bb6fba7ab39 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm32Main/kotlin/device32.kt @@ -0,0 +1,3 @@ +package common.watchos.app + +actual val bitness: Int = 32 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm64Main/kotlin/device64.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm64Main/kotlin/device64.kt new file mode 100644 index 0000000000000..179a48b00ced6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosArm64Main/kotlin/device64.kt @@ -0,0 +1,3 @@ +package common.watchos.app + +actual val bitness: Int = 64 \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosDeviceMain/kotlin/device.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosDeviceMain/kotlin/device.kt new file mode 100644 index 0000000000000..249b578ce6d57 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosDeviceMain/kotlin/device.kt @@ -0,0 +1,5 @@ +package common.watchos.app + +expect val bitness: Int + +actual fun platform(): String = "Device$bitness" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosMain/kotlin/main.kt new file mode 100644 index 0000000000000..38823681a6737 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosMain/kotlin/main.kt @@ -0,0 +1,10 @@ +package common.watchos.app + +import common.watchos.lib.* + +expect fun platform(): String + +fun appFunction() { + libFunction() + println(platform()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosTest/kotlin/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosTest/kotlin/test.kt new file mode 100644 index 0000000000000..c5f2fae0bcbac --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosTest/kotlin/test.kt @@ -0,0 +1,7 @@ +import common.watchos.app.* +import kotlin.test.* + +@Test +fun test() { + appFunction() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosX86Main/kotlin/simulator.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosX86Main/kotlin/simulator.kt new file mode 100644 index 0000000000000..89cc561bc8de1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/app/src/watchosX86Main/kotlin/simulator.kt @@ -0,0 +1,3 @@ +package common.watchos.app + +actual fun platform(): String = "Simulator" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/build.gradle.kts new file mode 100644 index 0000000000000..578f75e13b0db --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("org.jetbrains.kotlin.multiplatform").version("") + id("maven-publish") +} + +group = "common.watchos" +version = "1.0" + +repositories { + mavenLocal() + jcenter() +} + +kotlin { + watchos("watchosLib") + watchos("watchosLib") { + println("Configuring ${this.name}") + } +} + +publishing { + repositories { + maven { setUrl(rootProject.projectDir.resolve("repo")) } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibDeviceMain/kotlin/device.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibDeviceMain/kotlin/device.kt new file mode 100644 index 0000000000000..cd8ce2388e477 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibDeviceMain/kotlin/device.kt @@ -0,0 +1,3 @@ +package common.watchos.lib + +actual fun platform(): String = "Device" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibMain/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibMain/kotlin/main.kt new file mode 100644 index 0000000000000..ca5eb81401e12 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibMain/kotlin/main.kt @@ -0,0 +1,7 @@ +package common.watchos.lib + +expect fun platform(): String + +fun libFunction() { + println(platform()) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibX86Main/kotlin/simulator.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibX86Main/kotlin/simulator.kt new file mode 100644 index 0000000000000..a72e07fdd1db9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/lib/src/watchosLibX86Main/kotlin/simulator.kt @@ -0,0 +1,3 @@ +package common.watchos.lib + +actual fun platform(): String = "Simulator" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/settings.gradle.kts new file mode 100644 index 0000000000000..cc1c3d2342f53 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/new-mpp-common-native/common-watchos/settings.gradle.kts @@ -0,0 +1,12 @@ +pluginManagement { + repositories { + mavenLocal() + jcenter() + gradlePluginPortal() + } +} + +enableFeaturePreview("GRADLE_METADATA") + +include(":app") +include(":lib") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt index 4a3aff4ca94d2..d8fa203821ff2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt @@ -13,7 +13,11 @@ import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast -open class KotlinMultiplatformExtension : KotlinProjectExtension(), KotlinTargetContainerWithPresetFunctions { +open class KotlinMultiplatformExtension : + KotlinProjectExtension(), + KotlinTargetContainerWithPresetFunctions, + KotlinTargetContainerWithNativeShortcuts +{ override lateinit var presets: NamedDomainObjectCollection> internal set diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index 152c5fcc2e798..0328054ff997d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -22,6 +22,7 @@ import org.gradle.api.Project import org.gradle.api.internal.plugins.DslObject import org.gradle.util.ConfigureUtil import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetContainer import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation @@ -50,11 +51,11 @@ internal val Project.multiplatformExtensionOrNull: KotlinMultiplatformExtension? internal val Project.multiplatformExtension: KotlinMultiplatformExtension get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinMultiplatformExtension -open class KotlinProjectExtension { +open class KotlinProjectExtension: KotlinSourceSetContainer { val experimental: ExperimentalExtension get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java) - var sourceSets: NamedDomainObjectContainer + override var sourceSets: NamedDomainObjectContainer @Suppress("UNCHECKED_CAST") get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer internal set(value) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithNativeShortcuts.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithNativeShortcuts.kt new file mode 100644 index 0000000000000..82064e0a74f7e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetContainerWithNativeShortcuts.kt @@ -0,0 +1,118 @@ +/* + * 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.dsl + +import groovy.lang.Closure +import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPILATION_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_MAIN_SOURCE_SET_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_TEST_SOURCE_SET_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetContainer +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget + +interface KotlinTargetContainerWithNativeShortcuts : KotlinTargetContainerWithPresetFunctions, KotlinSourceSetContainer { + + private data class DefaultSourceSets(val main: KotlinSourceSet, val test: KotlinSourceSet) + + private fun KotlinNativeTarget.defaultSourceSets(): DefaultSourceSets = + DefaultSourceSets( + compilations.getByName(MAIN_COMPILATION_NAME).defaultSourceSet, + compilations.getByName(TEST_COMPILATION_NAME).defaultSourceSet + ) + + private fun mostCommonSourceSets() = DefaultSourceSets( + sourceSets.getByName(COMMON_MAIN_SOURCE_SET_NAME), + sourceSets.getByName(COMMON_TEST_SOURCE_SET_NAME) + ) + + private fun List.defaultSourceSets(): List = map { it.defaultSourceSets() } + + private fun createIntermediateSourceSet( + name: String, + children: List, + parent: KotlinSourceSet? = null + ) : KotlinSourceSet = + sourceSets.maybeCreate(name).apply { + parent?.let { dependsOn(parent) } + children.forEach { + it.dependsOn(this) + } + } + + private fun createIntermediateSourceSets( + namePrefix: String, + children: List, + parent: DefaultSourceSets? = null + ): DefaultSourceSets { + val main = createIntermediateSourceSet("${namePrefix}Main", children.map { it.main }, parent?.main) + val test = createIntermediateSourceSet("${namePrefix}Test", children.map { it.test }, parent?.test) + return DefaultSourceSets(main, test) + } + + fun ios( + namePrefix: String = "ios", + configure: KotlinNativeTarget.() -> Unit = {} + ) { + val targets = listOf( + iosArm64("${namePrefix}Arm64"), + iosX64("${namePrefix}X64") + ) + createIntermediateSourceSets(namePrefix, targets.defaultSourceSets(), mostCommonSourceSets()) + targets.forEach { it.configure() } + } + + fun ios() = ios("ios") { } + fun ios(namePrefix: String) = ios(namePrefix) { } + fun ios(namePrefix: String, configure: Closure<*>) = ios(namePrefix) { ConfigureUtil.configure(configure, this) } + fun ios(configure: Closure<*>) = ios { ConfigureUtil.configure(configure, this) } + + fun tvos( + namePrefix: String = "tvos", + configure: KotlinNativeTarget.() -> Unit + ) { + val targets = listOf( + tvosArm64("${namePrefix}Arm64"), + tvosX64("${namePrefix}X64") + ) + createIntermediateSourceSets(namePrefix, targets.defaultSourceSets(), mostCommonSourceSets()) + targets.forEach { it.configure() } + } + + fun tvos() = tvos("tvos") { } + fun tvos(namePrefix: String) = tvos(namePrefix) { } + fun tvos(namePrefix: String, configure: Closure<*>) = tvos(namePrefix) { ConfigureUtil.configure(configure, this) } + fun tvos(configure: Closure<*>) = tvos { ConfigureUtil.configure(configure, this) } + + fun watchos( + namePrefix: String = "watchos", + configure: KotlinNativeTarget.() -> Unit = {} + ) { + val device32 = watchosArm32("${namePrefix}Arm32") + val device64 = watchosArm64("${namePrefix}Arm64") + val simulator = watchosX86("${namePrefix}X86") + val deviceTargets = listOf(device32, device64) + + val deviceSourceSets = createIntermediateSourceSets( + "${namePrefix}Device", + deviceTargets.defaultSourceSets() + ) + + createIntermediateSourceSets( + namePrefix, + listOf(deviceSourceSets, simulator.defaultSourceSets()), + mostCommonSourceSets() + ) + + listOf(device32, device64, simulator).forEach { it.configure() } + } + + fun watchos() = watchos("watchos") { } + fun watchos(namePrefix: String) = watchos(namePrefix) { } + fun watchos(namePrefix: String, configure: Closure<*>) = watchos(namePrefix) { ConfigureUtil.configure(configure, this) } + fun watchos(configure: Closure<*>) = watchos { ConfigureUtil.configure(configure, this) } +}