• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 Square, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 import org.gradle.api.NamedDomainObjectContainer
17 import org.gradle.api.Project
18 import org.gradle.kotlin.dsl.get
19 import org.gradle.kotlin.dsl.withType
20 import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
21 import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
22 import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
23 import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
24 import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
25 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
26 
configureOrCreateOkioPlatformsnull27 fun KotlinMultiplatformExtension.configureOrCreateOkioPlatforms() {
28   jvm {
29   }
30   if (kmpJsEnabled) {
31     configureOrCreateJsPlatforms()
32   }
33   if (kmpNativeEnabled) {
34     configureOrCreateNativePlatforms()
35   }
36   if (kmpWasmEnabled) {
37     configureOrCreateWasmPlatform()
38   }
39 }
40 
KotlinMultiplatformExtensionnull41 fun KotlinMultiplatformExtension.configureOrCreateNativePlatforms() {
42   iosX64()
43   iosArm64()
44   iosSimulatorArm64()
45   tvosX64()
46   tvosArm64()
47   tvosSimulatorArm64()
48   watchosArm32()
49   watchosArm64()
50   watchosDeviceArm64()
51   watchosX64()
52   watchosSimulatorArm64()
53   // Required to generate tests tasks: https://youtrack.jetbrains.com/issue/KT-26547
54   linuxX64()
55   linuxArm64()
56   macosX64()
57   macosArm64()
58   mingwX64()
59 }
60 
61 val appleTargets = listOf(
62   "iosArm64",
63   "iosX64",
64   "iosSimulatorArm64",
65   "macosX64",
66   "macosArm64",
67   "tvosArm64",
68   "tvosX64",
69   "tvosSimulatorArm64",
70   "watchosArm32",
71   "watchosArm64",
72   "watchosDeviceArm64",
73   "watchosX64",
74   "watchosSimulatorArm64",
75 )
76 
77 val mingwTargets = listOf(
78   "mingwX64",
79 )
80 
81 val linuxTargets = listOf(
82   "linuxX64",
83   "linuxArm64",
84 )
85 
86 val nativeTargets = appleTargets + linuxTargets + mingwTargets
87 
88 val wasmTargets = listOf(
89   "wasmJs",
90   "wasmWasi",
91 )
92 
93 /**
94  * Creates a source set for a directory that isn't already a built-in platform. Use this to create
95  * custom shared directories like `nonJvmMain` or `unixMain`.
96  */
NamedDomainObjectContainernull97 fun NamedDomainObjectContainer<KotlinSourceSet>.createSourceSet(
98   name: String,
99   parent: KotlinSourceSet? = null,
100   children: List<String> = listOf()
101 ): KotlinSourceSet {
102   val result = create(name)
103 
104   if (parent != null) {
105     result.dependsOn(parent)
106   }
107 
108   val suffix = when {
109     name.endsWith("Main") -> "Main"
110     name.endsWith("Test") -> "Test"
111     else -> error("unexpected source set name: ${name}")
112   }
113 
114   for (childTarget in children) {
115     val childSourceSet = get("${childTarget}$suffix")
116     childSourceSet.dependsOn(result)
117   }
118 
119   return result
120 }
121 
KotlinMultiplatformExtensionnull122 fun KotlinMultiplatformExtension.configureOrCreateJsPlatforms() {
123   js {
124     compilations.all {
125       kotlinOptions {
126         moduleKind = "umd"
127         sourceMap = true
128       }
129     }
130     nodejs {
131       testTask {
132         useMocha {
133           timeout = "30s"
134         }
135       }
136     }
137     browser {
138     }
139   }
140 }
141 
KotlinMultiplatformExtensionnull142 fun KotlinMultiplatformExtension.configureOrCreateWasmPlatform(
143   js: Boolean = true,
144   wasi: Boolean = true,
145 ) {
146   if (js) {
147     wasmJs {
148       nodejs()
149     }
150   }
151   if (wasi) {
152     wasmWasi {
153       nodejs()
154     }
155   }
156 }
157