Skip to content

Commit e0c1125

Browse files
author
Abduqodiri Qurbonzoda
committed
Implement hierarchical MPP structuring
1 parent aefb469 commit e0c1125

File tree

1 file changed

+33
-15
lines changed

1 file changed

+33
-15
lines changed

main/src/kotlinx/team/infra/NativeMultiplatform.kt

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ fun Project.configureNativeMultiplatform() {
2727
}
2828

2929
val extension: Any = if (ideaActive)
30-
NativeIdeaInfraExtension(subproject, kotlin)
30+
NativeIdeaInfraExtension(subproject, kotlin, "native")
3131
else
32-
NativeBuildInfraExtension(subproject, kotlin)
32+
NativeBuildInfraExtension(subproject, kotlin, "native")
3333

3434
(kotlin as ExtensionAware).extensions.add("infra", extension)
3535
}
@@ -38,8 +38,12 @@ fun Project.configureNativeMultiplatform() {
3838

3939
abstract class NativeInfraExtension(
4040
protected val project: Project,
41-
protected val kotlin: KotlinMultiplatformExtension
41+
protected val kotlin: KotlinMultiplatformExtension,
42+
protected val sourceSetName: String
4243
) {
44+
protected val mainSourceSet = kotlin.sourceSets.maybeCreate("${sourceSetName}Main")
45+
protected val testSourceSet = kotlin.sourceSets.maybeCreate("${sourceSetName}Test")
46+
4347
protected val sharedConfigs = mutableListOf<KotlinNativeTarget.() -> Unit>()
4448
fun shared(configure: Closure<*>) = shared { ConfigureUtil.configure(configure, this) }
4549
fun shared(configure: KotlinNativeTarget.() -> Unit) {
@@ -49,10 +53,13 @@ abstract class NativeInfraExtension(
4953
fun target(name: String) = target(name) { }
5054
fun target(name: String, configure: Closure<*>) = target(name) { ConfigureUtil.configure(configure, this) }
5155
abstract fun target(name: String, configure: KotlinNativeTarget.() -> Unit)
56+
57+
fun common(name: String, configure: Closure<*>) = common(name) { ConfigureUtil.configure(configure, this) }
58+
abstract fun common(name: String, configure: NativeInfraExtension.() -> Unit)
5259
}
5360

54-
class NativeIdeaInfraExtension(project: Project, kotlin: KotlinMultiplatformExtension) :
55-
NativeInfraExtension(project, kotlin) {
61+
class NativeIdeaInfraExtension(project: Project, kotlin: KotlinMultiplatformExtension, sourceSetName: String) :
62+
NativeInfraExtension(project, kotlin, sourceSetName) {
5663

5764
private val hostManager = createHostManager()
5865

@@ -74,48 +81,59 @@ class NativeIdeaInfraExtension(project: Project, kotlin: KotlinMultiplatformExte
7481
if (name != hostPreset.name)
7582
return
7683

77-
kotlin.targetFromPreset(hostPreset, "native") {
84+
kotlin.targetFromPreset(hostPreset, sourceSetName) {
7885
configure()
7986
sharedConfigs.forEach { it() }
8087
}
8188

8289
project.afterEvaluate {
83-
kotlin.sourceSets.getByName("nativeMain") { sourceSet ->
90+
kotlin.sourceSets.getByName("${sourceSetName}Main") { sourceSet ->
8491
sourceSet.kotlin.srcDir("${hostPreset.name}Main/src")
8592
}
8693
}
8794
}
95+
96+
override fun common(name: String, configure: NativeInfraExtension.() -> Unit) {
97+
kotlin.sourceSets.create("${name}Main").dependsOn(mainSourceSet)
98+
kotlin.sourceSets.create("${name}Test").dependsOn(testSourceSet)
99+
val extension = NativeIdeaInfraExtension(project, kotlin, name)
100+
extension.configure()
101+
}
88102
}
89103

90-
class NativeBuildInfraExtension(project: Project, kotlin: KotlinMultiplatformExtension) :
91-
NativeInfraExtension(project, kotlin) {
104+
class NativeBuildInfraExtension(project: Project, kotlin: KotlinMultiplatformExtension, sourceSetName: String) :
105+
NativeInfraExtension(project, kotlin, sourceSetName) {
92106

93107
private val nativePresets = kotlin.presets.filterIsInstance<AbstractKotlinNativeTargetPreset<*>>()
94108

95-
private val nativeMain = kotlin.sourceSets.create("nativeMain")
96-
private val nativeTest = kotlin.sourceSets.create("nativeTest")
97-
98109
init {
99110
project.logger.infra("Configuring native targets for $project for build")
100111
project.logger.infra("Enabled native targets: ${nativePresets.joinToString { it.name }}")
101112
}
102113

103114
override fun target(name: String, configure: KotlinNativeTarget.() -> Unit) {
104115
val preset = nativePresets.singleOrNull { it.name == name } ?: return
105-
project.logger.infra("Creating target '${preset.name}' with dependency on 'native'")
116+
project.logger.infra("Creating target '${preset.name}' with dependency on '$sourceSetName'")
106117

107118
val target = kotlin.targetFromPreset(preset) {
108119
configure()
109120
sharedConfigs.forEach { config -> config() }
110121
}
111122

112123
kotlin.sourceSets.getByName("${preset.name}Main") { sourceSet ->
113-
sourceSet.dependsOn(nativeMain)
124+
sourceSet.dependsOn(mainSourceSet)
114125
}
115126
kotlin.sourceSets.getByName("${preset.name}Test") { sourceSet ->
116-
sourceSet.dependsOn(nativeTest)
127+
sourceSet.dependsOn(testSourceSet)
117128
}
118129
}
130+
131+
override fun common(name: String, configure: NativeInfraExtension.() -> Unit) {
132+
kotlin.sourceSets.create("${name}Main").dependsOn(mainSourceSet)
133+
kotlin.sourceSets.create("${name}Test").dependsOn(testSourceSet)
134+
val extension = NativeBuildInfraExtension(project, kotlin, name)
135+
extension.configure()
136+
}
119137
}
120138

121139
private fun createHostManager(): HostManager {

0 commit comments

Comments
 (0)