Skip to content

Commit 5c3be2a

Browse files
committed
feat: plugin for setting up kotlin native projects
1 parent a20d60f commit 5c3be2a

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
lines changed

src/main/kotlin/io/github/gciatto/kt/mpp/DefaultProperties.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ interface DefaultProperties {
9797
defaultValue = false
9898
)
9999

100+
val ktTargetNativeDisable: PropertyDescriptor
101+
get() = PropertyDescriptor(
102+
name = "ktTargetNativeDisable",
103+
description = "If true, disables the Native target on a multi-platform project",
104+
mandatory = false,
105+
defaultValue = false
106+
)
107+
100108
val mavenPassword: PropertyDescriptor
101109
get() = PropertyDescriptor(
102110
name = "mavenPassword",

src/main/kotlin/io/github/gciatto/kt/mpp/MultiplatformPlugin.kt

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package io.github.gciatto.kt.mpp
33
import org.gradle.api.Project
44
import org.gradle.api.logging.LogLevel
55
import org.gradle.kotlin.dsl.apply
6+
import org.gradle.kotlin.dsl.get
67
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
78
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
9+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
810
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl
911
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
1012

@@ -17,6 +19,7 @@ class MultiplatformPlugin : AbstractKotlinProjectPlugin("multiplatform") {
1719
configureNodeVersionFromCatalogIfPossible()
1820
val ktTargetJvmDisable = getBooleanProperty("ktTargetJvmDisable")
1921
val ktTargetJsDisable = getBooleanProperty("ktTargetJsDisable")
22+
val ktTargetNativeDisable = getBooleanProperty("ktTargetNativeDisable")
2023
configure(KotlinMultiplatformExtension::class) {
2124
if (ktTargetJvmDisable) {
2225
log("disable JVM target", LogLevel.WARN)
@@ -28,6 +31,11 @@ class MultiplatformPlugin : AbstractKotlinProjectPlugin("multiplatform") {
2831
} else {
2932
js { configureJs() }
3033
}
34+
if (ktTargetNativeDisable) {
35+
log("disable Native target", LogLevel.WARN)
36+
} else {
37+
configureNative()
38+
}
3139
dependenciesFor("commonMain") {
3240
addMainDependencies(project, "common", skipBom = false)
3341
}
@@ -46,7 +54,7 @@ class MultiplatformPlugin : AbstractKotlinProjectPlugin("multiplatform") {
4654

4755
private fun KotlinMultiplatformExtension.dependenciesFor(
4856
sourceSet: String,
49-
action: KotlinDependencyHandler.() -> Unit
57+
action: KotlinDependencyHandler.() -> Unit,
5058
) = sourceSets.getByName(sourceSet).dependencies(action)
5159

5260
context(Project, KotlinMultiplatformExtension)
@@ -82,6 +90,29 @@ class MultiplatformPlugin : AbstractKotlinProjectPlugin("multiplatform") {
8290
}
8391
}
8492

93+
private fun KotlinMultiplatformExtension.configureNative() {
94+
// TODO: Setup nativeMain and nativeTest source sets
95+
val nativeSetup: KotlinNativeTarget.() -> Unit = {
96+
compilations["main"].defaultSourceSet.dependsOn(sourceSets["nativeMain"])
97+
compilations["test"].defaultSourceSet.dependsOn(sourceSets["nativeTest"])
98+
binaries {
99+
sharedLib()
100+
staticLib()
101+
}
102+
}
103+
// TODO: enable selectively the targets based on properties
104+
linuxX64(nativeSetup)
105+
linuxArm64(nativeSetup)
106+
107+
mingwX64(nativeSetup)
108+
109+
macosX64(nativeSetup)
110+
macosArm64(nativeSetup)
111+
ios(nativeSetup)
112+
watchos(nativeSetup)
113+
tvos(nativeSetup)
114+
}
115+
85116
override fun PropertiesHelperExtension.declareProperties() {
86117
addProperty(allWarningsAsErrors)
87118
addProperty(ktCompilerArgs)
@@ -90,6 +121,7 @@ class MultiplatformPlugin : AbstractKotlinProjectPlugin("multiplatform") {
90121
addProperty(mochaTimeout)
91122
addProperty(ktTargetJvmDisable)
92123
addProperty(ktTargetJsDisable)
124+
addProperty(ktTargetNativeDisable)
93125
addProperty(versionsFromCatalog)
94126
addProperty(nodeVersion)
95127
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.github.gciatto.kt.mpp
2+
3+
import org.gradle.api.Project
4+
import org.gradle.kotlin.dsl.apply
5+
import org.gradle.kotlin.dsl.get
6+
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
7+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
8+
9+
class NativeOnlyPlugin : AbstractKotlinProjectPlugin("native") {
10+
override fun Project.applyThisPlugin() {
11+
apply(plugin = kotlinPlugin())
12+
log("apply ${kotlinPlugin()} plugin")
13+
apply(plugin = "native")
14+
log("apply native plugin")
15+
configureKotlinVersionFromCatalogIfPossible()
16+
configure(KotlinMultiplatformExtension::class) {
17+
sourceSets.create("nativeMain")
18+
sourceSets.create("nativeTest")
19+
sourceSets.getByName("nativeMain").dependsOn(sourceSets["commonMain"])
20+
sourceSets.getByName("nativeTest").dependsOn(sourceSets["commonTest"])
21+
22+
val nativeSetup: KotlinNativeTarget.() -> Unit = {
23+
compilations["main"].defaultSourceSet.dependsOn(sourceSets["nativeMain"])
24+
compilations["test"].defaultSourceSet.dependsOn(sourceSets["nativeTest"])
25+
binaries {
26+
sharedLib()
27+
staticLib()
28+
}
29+
}
30+
// TODO: enable selectively the targets based on properties
31+
linuxX64(nativeSetup)
32+
linuxArm64(nativeSetup)
33+
34+
mingwX64(nativeSetup)
35+
36+
macosX64(nativeSetup)
37+
macosArm64(nativeSetup)
38+
ios(nativeSetup)
39+
watchos(nativeSetup)
40+
tvos(nativeSetup)
41+
}
42+
addTaskAliases()
43+
}
44+
45+
override fun PropertiesHelperExtension.declareProperties() {
46+
addProperty(allWarningsAsErrors)
47+
addProperty(ktCompilerArgs)
48+
addProperty(ktCompilerArgsJvm)
49+
addProperty(mochaTimeout)
50+
addProperty(versionsFromCatalog)
51+
}
52+
}

0 commit comments

Comments
 (0)