Skip to content

Commit

Permalink
create support of android library for multiplatform and just android …
Browse files Browse the repository at this point in the history
…library, and updated logic faced with defaults
  • Loading branch information
sliderzxc committed Dec 7, 2023
1 parent fa2ec2b commit 80c5bb8
Show file tree
Hide file tree
Showing 7 changed files with 100 additions and 7 deletions.
37 changes: 37 additions & 0 deletions src/main/kotlin/com/sliderzxc/gradle/android/SetupAndroid.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.sliderzxc.gradle.android

import com.android.build.gradle.BaseExtension
import com.sliderzxc.gradle.android.config.AndroidConfig
import com.sliderzxc.gradle.defaults.requireDefaults
import org.gradle.api.JavaVersion
import org.gradle.api.Project
import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.withType
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

fun Project.setupAndroidLibrary(
config: AndroidConfig = requireDefaults()
) = setupAndroidCommon(config)

internal fun Project.setupAndroidCommon(config: AndroidConfig) {
extensions.configure<BaseExtension> {
namespace = config.namespace
compileSdkVersion(config.compileSdkVersion)

defaultConfig {
minSdk = config.minSdkVersion
targetSdk = config.targetSdkVersion
}

compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
}

tasks.withType<KotlinCompile> {
kotlinOptions {
jvmTarget = "11"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sliderzxc.gradle.android.config

data class AndroidConfig(
val minSdkVersion: Int,
val compileSdkVersion: Int,
val targetSdkVersion: Int,
val namespace: String
)
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.sliderzxc.gradle.multiplatform.defaults
package com.sliderzxc.gradle.defaults

import org.gradle.api.Project
import org.gradle.kotlin.dsl.extra

internal inline fun <reified T : Any> Project.requireDefaults(): T =
requireNotNull(getDefaults()) { "Defaults not found for type ${T::class}" }

internal inline fun <reified T : Any> Project.getDefaults(): T? {
private inline fun <reified T : Any> Project.getDefaults(): T? {
return getDefaults { it as? T }
}

Expand All @@ -20,4 +20,4 @@ private fun Project.getDefaultsList(): MutableList<Any>? {
return extra.takeIf { it.has(DEFAULTS_KEY) }?.get(DEFAULTS_KEY) as ArrayList<Any>?
}

private const val DEFAULTS_KEY = "com.sliderzxc.gradle.defaults"
const val DEFAULTS_KEY = "com.sliderzxc.gradle.defaults"
35 changes: 35 additions & 0 deletions src/main/kotlin/com/sliderzxc/gradle/defaults/SetupDefaults.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.sliderzxc.gradle.defaults

import com.sliderzxc.gradle.android.config.AndroidConfig
import com.sliderzxc.gradle.multiplatform.config.MultiplatformConfig
import com.sliderzxc.gradle.multiplatform.platforms.Platform
import org.gradle.api.Project
import org.gradle.kotlin.dsl.extra

fun Project.setupDefaults(
multiplatformConfig: MultiplatformConfig? = null,
androidConfig: AndroidConfig? = null,
) {
extra.set(
DEFAULTS_KEY,
listOfNotNull(
androidConfig,
multiplatformConfig
)
)
}

fun setupDef(
multiplatformConfig: MultiplatformConfig? = null,
androidConfig: AndroidConfig? = null,
) {
println(multiplatformConfig?.platforms?.joinToString(" | "))
}

fun main() {
setupDef(
multiplatformConfig = MultiplatformConfig(
setOf(Platform.Android, Platform.Js, Platform.Android)
)
)
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.sliderzxc.gradle.multiplatform

import com.sliderzxc.gradle.android.setupAndroidCommon
import com.sliderzxc.gradle.android.setupAndroidLibrary
import com.sliderzxc.gradle.defaults.requireDefaults
import com.sliderzxc.gradle.multiplatform.config.MultiplatformConfig
import com.sliderzxc.gradle.multiplatform.platforms.Platform
import com.sliderzxc.gradle.multiplatform.platforms.toTargets
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension

fun Project.setupMultiplatform(
vararg platforms: Platform,
multiplatformConfig: MultiplatformConfig? = requireDefaults()
) {
val targets = platforms.toSet().toTargets()
val targets = multiplatformConfig?.platforms.toTargets()

multiplatformExtension.apply {
with(targets) { invoke() }
Expand All @@ -32,6 +36,8 @@ fun Project.setupMultiplatform(
}
}
}

if (multiplatformConfig?.platforms?.contains(Platform.Android) == true) setupAndroidLibrary()
}

internal val Project.multiplatformExtension: KotlinMultiplatformExtension
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sliderzxc.gradle.multiplatform.config

import com.sliderzxc.gradle.multiplatform.platforms.Platform

data class MultiplatformConfig(
val platforms: Set<Platform>
)
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ enum class Platform {
Android, Jvm, Js
}

internal fun Set<Platform>.toTargets(): MultiplatformConfigurator {
if (this.isEmpty()) error("Platforms not found")
internal fun Set<Platform>?.toTargets(): MultiplatformConfigurator {
if (this.isNullOrEmpty()) error("Platforms not found")

return MultiplatformConfigurator {
for (platform in this@toTargets) {
Expand Down

0 comments on commit 80c5bb8

Please sign in to comment.