Skip to content

Commit fa64dc0

Browse files
committed
Introduced support for com.android.kotlin.multiplatform.library plugin
1 parent 2c77263 commit fa64dc0

20 files changed

Lines changed: 257 additions & 17 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ plugins {
88
alias(libs.plugins.kotlin.multiplatform) apply false
99
alias(libs.plugins.android.application) apply false
1010
alias(libs.plugins.android.library) apply false
11+
alias(libs.plugins.android.multiplatform) apply false
1112
alias(libs.plugins.publicationsReport)
1213
`jacoco-report-aggregation`
1314
}
File renamed without changes.

demo-project/kts-multiplatform/src/androidMain/AndroidManifest.xml renamed to demo-project/kmp-android-legacy/src/androidMain/AndroidManifest.xml

File renamed without changes.

demo-project/kts-multiplatform/src/androidUnitTest/kotlin/com/github/gmazzo/buildconfig/demos/kts_multiplatform/AndroidBuildConfigTest.kt renamed to demo-project/kmp-android-legacy/src/androidUnitTest/kotlin/com/github/gmazzo/buildconfig/demos/kmp_android_legacy/AndroidBuildConfigTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.github.gmazzo.buildconfig.demos.kts_multiplatform
1+
package com.github.gmazzo.buildconfig.demos.kmp_android_legacy
22

33
import com.eygraber.uri.Uri
44
import com.github.gmazzo.buildconfig.demos.android.BuildConfig as AndroidBuildConfig
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.github.gmazzo.buildconfig.demos.kmp_android_legacy
2+
3+
import com.eygraber.uri.Uri
4+
import kotlin.test.Test
5+
import kotlin.test.assertEquals
6+
7+
abstract class CommonBuildConfigTest(
8+
private val expectedPlatform: String,
9+
private val expectedMobile: Boolean = false,
10+
private val expectedDebug: Boolean = false,
11+
private val expectedUri: Uri = Uri.parse("https://api.example.com"),
12+
private val expectedProduct: String? = null,
13+
) {
14+
15+
@Test
16+
fun testBuildConfigProperties() {
17+
assertEquals("aCommonValue", BuildConfig.COMMON_VALUE)
18+
assertEquals(expectedPlatform, BuildConfig.PLATFORM)
19+
assertEquals(expectedDebug, BuildConfig.DEBUG)
20+
assertEquals(expectedUri, BuildConfig.ENDPOINT)
21+
assertEquals(expectedProduct, BuildConfig.PRODUCT_VALUE)
22+
}
23+
24+
@Test
25+
fun testI18nProperties() {
26+
assertEquals("Hello", i18n_hello)
27+
assertEquals(expectedPlatform, i18n_kind)
28+
}
29+
30+
@Test
31+
fun testSingleProperties() {
32+
assertEquals(expectedMobile, Single.IS_MOBILE)
33+
}
34+
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.gmazzo.buildconfig.demos.kmp_android_legacy
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class iOSBuildConfigTest : CommonBuildConfigTest(
7+
expectedPlatform = "ios",
8+
expectedMobile = true,
9+
) {
10+
11+
@Test
12+
fun testIOSOnlyValues() {
13+
assertEquals("anIOSValue", BuildConfig.IOS_VALUE)
14+
}
15+
16+
}

demo-project/kts-multiplatform/src/jvmMain/kotlin/KSPService.kt renamed to demo-project/kmp-android-legacy/src/jvmMain/kotlin/com/github/gmazzo/buildconfig/demos/kmp_android_legacy/KSPService.kt

File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.gmazzo.buildconfig.demos.kmp_android_legacy
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class JVMBuildConfigTest : CommonBuildConfigTest(
7+
expectedPlatform = "jvm",
8+
) {
9+
10+
@Test
11+
fun testJVMOnlyValues() {
12+
assertEquals("aJvmValue", BuildConfig.JVM_VALUE)
13+
}
14+
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.github.gmazzo.buildconfig.demos.kmp_android_legacy
2+
3+
import kotlin.test.Test
4+
import kotlin.test.assertEquals
5+
6+
class WebBuildConfigTest : CommonBuildConfigTest(
7+
expectedPlatform = "web",
8+
) {
9+
10+
@Test
11+
fun testWebOnlyValues() {
12+
assertEquals("aWebValue", BuildConfig.WEB_VALUE)
13+
}
14+
15+
}

demo-project/kmp/build.gradle.kts

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
@file:Suppress("OPT_IN_USAGE")
2+
3+
import com.github.gmazzo.buildconfig.generators.BuildConfigKotlinGenerator
4+
import com.squareup.kotlinpoet.AnnotationSpec
5+
import com.squareup.kotlinpoet.ClassName
6+
import com.squareup.kotlinpoet.TypeSpec
7+
8+
plugins {
9+
alias(libs.plugins.android.multiplatform)
10+
alias(libs.plugins.kotlin.multiplatform)
11+
alias(libs.plugins.kotlin.ksp)
12+
id("com.github.gmazzo.buildconfig")
13+
}
14+
15+
java.toolchain.languageVersion = JavaLanguageVersion.of(libs.versions.java.get())
16+
17+
kotlin {
18+
androidLibrary { // new AGP KMP plugin does not supports variants nor app
19+
compileSdk = 36
20+
namespace = "com.github.gmazzo.buildconfig.demos.android"
21+
minSdk = 21
22+
23+
withHostTest { } // the old `androidUnitTest` variant
24+
withDeviceTest { } // the old `androidInstrumentedTest` variant
25+
}
26+
jvm()
27+
iosArm64()
28+
iosSimulatorArm64()
29+
js(IR) { nodejs() }
30+
wasmJs { nodejs() }
31+
applyDefaultHierarchyTemplate()
32+
}
33+
34+
dependencies {
35+
"kspJvm"(libs.autoservice.ksp)
36+
"jvmMainCompileOnly"(libs.autoservice)
37+
commonMainImplementation(libs.uriKMP)
38+
commonTestImplementation(libs.kotlin.test)
39+
}
40+
41+
buildConfig {
42+
buildConfigField("COMMON_VALUE", expect("aCommonValue")) // a constant for all platforms
43+
buildConfigField("PLATFORM", expect<String>()) // expect a platform specific value
44+
buildConfigField("DEBUG", expect(false)) // expect with a default
45+
buildConfigField("com.eygraber.uri.Uri", "ENDPOINT",
46+
expect(expression("Uri.parse(\"https://api.example.com\")")))
47+
buildConfigField("PRODUCT_VALUE", expect<String?>(null))
48+
49+
forClass("i18n") {
50+
useKotlinOutput { topLevelConstants = true }
51+
52+
buildConfigField("i18n_hello", expect("Hello"))
53+
buildConfigField("i18n_kind", expect<String>())
54+
}
55+
56+
forClass("Single") {
57+
buildConfigField("IS_MOBILE", expect(false))
58+
}
59+
60+
sourceSets.named("androidMain") {
61+
buildConfigField("PLATFORM", "android")
62+
buildConfigField("ANDROID_VALUE", "anAndroidValue")
63+
buildConfigField("DEBUG", false)
64+
forClass("i18n").buildConfigField("i18n_kind", "android")
65+
forClass("Single").buildConfigField("IS_MOBILE", true)
66+
}
67+
68+
sourceSets.named("test") {
69+
buildConfigField("TEST_VALUE", "aTestValue")
70+
}
71+
72+
sourceSets.named("jvmMain") {
73+
buildConfigField("PLATFORM", "jvm")
74+
buildConfigField("JVM_VALUE", "aJvmValue")
75+
forClass("i18n").buildConfigField("i18n_kind", "jvm")
76+
forClass("Single") // will inherit all defaults from `commonMain`
77+
}
78+
79+
sourceSets.named("iosMain") {
80+
buildConfigField("PLATFORM", "ios")
81+
buildConfigField("IOS_VALUE", "anIOSValue")
82+
forClass("i18n").buildConfigField("i18n_kind", "ios")
83+
forClass("Single").buildConfigField("IS_MOBILE", true)
84+
}
85+
86+
sourceSets.named("webMain") {
87+
// Customize the generator to add @JsName annotations to the generated object
88+
generator = object : BuildConfigKotlinGenerator() {
89+
override fun adaptSpec(spec: TypeSpec) = spec.toBuilder()
90+
.addAnnotation(
91+
AnnotationSpec.builder(ClassName.bestGuess("kotlin.js.JsName"))
92+
.addMember("name = %S", spec.name!!)
93+
.build()
94+
)
95+
.build()
96+
}
97+
98+
buildConfigField("PLATFORM", "web")
99+
buildConfigField("WEB_VALUE", "aWebValue")
100+
forClass("i18n").buildConfigField("i18n_kind", "web")
101+
forClass("Single") // will inherit all defaults from `commonMain`
102+
}
103+
}
104+
105+
tasks.named("compileTestDevelopmentExecutableKotlinJs") {
106+
notCompatibleWithConfigurationCache("uses Task.project")
107+
}

0 commit comments

Comments
 (0)