Skip to content

Commit ae7c8f8

Browse files
committed
Add a Metro DSL in buildSrc
This DSL allows App Platform modules to enable Metro, e.g. `:renderer:public` will use this DSL. There will be separate PR for the DSL in our published Gradle plugin. See #109
1 parent 286a1ba commit ae7c8f8

File tree

4 files changed

+59
-7
lines changed

4 files changed

+59
-7
lines changed

buildSrc/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ dependencies {
7777
implementation libs.kotlin.hierarchy.plugin
7878
implementation libs.ktfmt.gradle.plugin
7979
implementation libs.maven.publish.gradle.plugin
80+
implementation libs.metro.gradle.plugin
8081
implementation libs.detekt.gradle.plugin
8182
implementation "$GROUP:gradle-plugin:$VERSION_NAME"
8283
}

buildSrc/src/main/kotlin/software/amazon/app/platform/gradle/buildsrc/AppPlatformExtension.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import software.amazon.app.platform.gradle.AppPlatformExtension as AppPlatformEx
88
import software.amazon.app.platform.gradle.buildsrc.BaseAndroidPlugin.Companion.enableInstrumentedTests
99
import software.amazon.app.platform.gradle.buildsrc.KmpPlugin.Companion.enableCompose
1010
import software.amazon.app.platform.gradle.buildsrc.KmpPlugin.Companion.enableKotlinInject
11+
import software.amazon.app.platform.gradle.buildsrc.KmpPlugin.Companion.enableMetro
1112
import software.amazon.app.platform.gradle.buildsrc.KmpPlugin.Companion.enableMolecule
1213
import software.amazon.app.platform.gradle.buildsrc.SdkPlugin.publishSdk
1314

@@ -43,6 +44,20 @@ constructor(objects: ObjectFactory, private val project: Project) {
4344

4445
internal fun isKotlinInjectEnabled(): Property<Boolean> = enableKotlinInject
4546

47+
private val enableMetro: Property<Boolean> =
48+
objects.property(Boolean::class.java).convention(false)
49+
50+
public fun enableMetro(enabled: Boolean) {
51+
enableMetro.set(enabled)
52+
enableMetro.disallowChanges()
53+
54+
if (enabled) {
55+
project.enableMetro()
56+
}
57+
}
58+
59+
internal fun isMetroEnabled(): Property<Boolean> = enableMetro
60+
4661
private val enableMolecule: Property<Boolean> =
4762
objects.property(Boolean::class.java).convention(false)
4863

buildSrc/src/main/kotlin/software/amazon/app/platform/gradle/buildsrc/KmpPlugin.kt

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ public open class KmpPlugin : Plugin<Project> {
178178
}
179179

180180
fun Project.enableKotlinInject() {
181-
plugins.apply(Plugins.KSP)
181+
enableKsp()
182182

183183
val kspExtension = extensions.getByType(KspExtension::class.java)
184184

@@ -189,12 +189,6 @@ public open class KmpPlugin : Plugin<Project> {
189189
"disabled",
190190
)
191191

192-
tasks.withType(KspTask::class.java).configureEach { kspTask ->
193-
if (kspTask is KotlinCompile) {
194-
kspTask.compilerOptions.jvmTarget.set(javaTarget)
195-
}
196-
}
197-
198192
if (isKmpModule) {
199193
kmpExtension.sourceSets.getByName("commonMain").dependencies {
200194
implementation(libs.findLibrary("kotlin.inject.runtime").get().get().toString())
@@ -269,6 +263,47 @@ public open class KmpPlugin : Plugin<Project> {
269263
}
270264
}
271265

266+
fun Project.enableMetro() {
267+
plugins.apply(Plugins.METRO)
268+
269+
// Enable KSP for our custom extensions.
270+
enableKsp()
271+
272+
if (isKmpModule) {
273+
kmpExtension.sourceSets.getByName("commonMain").dependencies {
274+
implementation(project(":di-common:public"))
275+
implementation(project(":metro:public"))
276+
}
277+
} else {
278+
dependencies.add("implementation", project(":metro:public"))
279+
}
280+
281+
fun DependencyHandler.addKspProcessorDependencies(kspConfigurationName: String) {
282+
add(kspConfigurationName, project(":metro-extensions:contribute:impl-code-generators"))
283+
}
284+
285+
if (isKmpModule) {
286+
kmpExtension.targets.configureEach {
287+
if (it.name != "metadata") {
288+
dependencies.addKspProcessorDependencies("ksp${it.name.capitalize()}")
289+
dependencies.addKspProcessorDependencies("ksp${it.name.capitalize()}Test")
290+
}
291+
}
292+
} else {
293+
dependencies.addKspProcessorDependencies("ksp")
294+
}
295+
}
296+
297+
private fun Project.enableKsp() {
298+
plugins.apply(Plugins.KSP)
299+
300+
tasks.withType(KspTask::class.java).configureEach { kspTask ->
301+
if (kspTask is KotlinCompile) {
302+
kspTask.compilerOptions.jvmTarget.set(javaTarget)
303+
}
304+
}
305+
}
306+
272307
fun Project.enableMolecule() {
273308
plugins.apply(Plugins.COMPOSE_COMPILER)
274309
kmpExtension.sourceSets.getByName("commonMain").dependencies {

buildSrc/src/main/kotlin/software/amazon/app/platform/gradle/buildsrc/Plugins.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ internal object Plugins {
1414
const val KSP = "com.google.devtools.ksp"
1515
const val KTFMT = "com.ncorti.ktfmt.gradle"
1616
const val MAVEN_PUBLISH = "com.vanniktech.maven.publish"
17+
const val METRO = "dev.zacsweers.metro"
1718
}

0 commit comments

Comments
 (0)