diff --git a/embed/build.gradle.kts b/embed/build.gradle.kts new file mode 100644 index 0000000..b0ac03e --- /dev/null +++ b/embed/build.gradle.kts @@ -0,0 +1,55 @@ +import java.util.Properties +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts + +buildscript { + val versions = java.util.Properties() + versions.load(rootDir.resolve("../versions.properties").inputStream()) + + + dependencies { + classpath("ru.landgrafhomyak.kotlin:kotlin-mpp-gradle-build-helper:v${versions.getProperty("this")}k${versions.getProperty("kotlin")}") + } +} + +plugins { + kotlin("multiplatform") version "2.0.20" + `maven-publish` +} + +val versions = Properties() +versions.load(rootDir.resolve("../versions.properties").inputStream()) + +val targetKotlinVersion = versions.getProperty("kotlin") + +group = "ru.landgrafhomyak.kotlin" +version = "v${versions.getProperty("this")}k${targetKotlinVersion}" + +repositories { + mavenCentral() +} + + + +kotlin { + optInContracts() + + jvmToolchain(8) + jvm() + + sourceSets { + jvmMain { + dependencies { + compileOnly("dev.gradleplugins:gradle-api:${versions.getProperty("gradle")}") + implementation("${group}:kotlin-mpp-gradle-build-helper:${targetKotlinVersion}") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${targetKotlinVersion}") + } + } + } +} + +publishing { + repositories { + defineXomrkGiteaMavenRepo() + } +} \ No newline at end of file diff --git a/embed/settings.gradle.kts b/embed/settings.gradle.kts new file mode 100644 index 0000000..af3c3cd --- /dev/null +++ b/embed/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "kotlin-mpp-gradle-build" + diff --git a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/SetupBuildScript.kt b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/SetupBuildScript.kt new file mode 100644 index 0000000..f53d0f4 --- /dev/null +++ b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/SetupBuildScript.kt @@ -0,0 +1,19 @@ +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper + +import org.gradle.api.Plugin +import org.gradle.api.Project + + +class SetupBuildScript : Plugin { + override fun apply(project: Project) { + project.extensions.add("xomrk", XomrkDsl(project)) + } + + internal object PluginIDs { + @JvmStatic + val THIS = "ru.landgrafhomyak.kotlin.original-multiplatform-ext" + + @JvmStatic + val KOTLIN_MULTIPLATFORM = "org.jetbrains.kotlin.multiplatform" + } +} \ No newline at end of file diff --git a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/XomrkDsl.kt b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/XomrkDsl.kt new file mode 100644 index 0000000..ecda866 --- /dev/null +++ b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/XomrkDsl.kt @@ -0,0 +1,37 @@ +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper + +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract +import kotlin.reflect.KClass +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.SetupBuildScript.PluginIDs + +open class XomrkDsl internal constructor(private val project: Project) { + @Suppress("FunctionName") + private fun _wrapExtension( + @Suppress("SameParameterValue") pluginId: String, + extensionClass: KClass, + config: T.() -> Unit + ) { + contract { + callsInPlace(config, InvocationKind.EXACTLY_ONCE) + } + + if (null == this.project.plugins.findPlugin(pluginId)) { + this.project.plugins.apply(pluginId) + } + + val dsl = this.project.extensions.findByType(extensionClass.java) ?: throw RuntimeException("Can't get extension") + config(dsl) + + } + + fun kotlin(config: KotlinMultiplatformExtension.() -> Unit) { + contract { + callsInPlace(config, InvocationKind.EXACTLY_ONCE) + } + + this._wrapExtension(PluginIDs.KOTLIN_MULTIPLATFORM, KotlinMultiplatformExtension::class, config) + } +} \ No newline at end of file diff --git a/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/dsl_entry_point.kt b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/dsl_entry_point.kt new file mode 100644 index 0000000..48e6cce --- /dev/null +++ b/embed/src/jvmMain/kotlin/ru/landgrafhomyak/kotlin/kmp_gradle_build_helper/dsl_entry_point.kt @@ -0,0 +1,20 @@ +package ru.landgrafhomyak.kotlin.kmp_gradle_build_helper + +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract +import org.gradle.api.Project + +@Suppress("unused") +fun Project.xomrk(config: XomrkDsl.() -> Unit) { + contract { + callsInPlace(config, InvocationKind.EXACTLY_ONCE) + } + + if (null == this.plugins.findPlugin(SetupBuildScript::class.java)) { + this.plugins.apply(SetupBuildScript::class.java) + } + + val dsl = this.extensions.findByType(XomrkDsl::class.java) ?: throw RuntimeException("Can't install helper plugin") + + config(dsl) +} \ No newline at end of file diff --git a/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties b/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties new file mode 100644 index 0000000..fe148aa --- /dev/null +++ b/embed/src/jvmMain/resources/META-INF/gradle-plugins/ru.landgrafhomyak.kotlin.original-multiplatform-ext.properties @@ -0,0 +1 @@ +implementation-class=ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.SetupBuildScript diff --git a/settings.gradle.kts b/settings.gradle.kts index 46b9596..d1836cc 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,2 +1,3 @@ includeBuild("impl") +includeBuild("embed") includeBuild("test") \ No newline at end of file diff --git a/test/build.gradle.kts b/test/build.gradle.kts index cfc190a..5c82b0f 100644 --- a/test/build.gradle.kts +++ b/test/build.gradle.kts @@ -1,6 +1,7 @@ import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineAllMultiplatformTargets import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.defineXomrkGiteaMavenRepo import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.optInContracts +import ru.landgrafhomyak.kotlin.kmp_gradle_build_helper.xomrk buildscript { val versions = java.util.Properties() @@ -12,22 +13,19 @@ buildscript { } dependencies { - classpath("ru.landgrafhomyak.kotlin:kotlin-mpp-gradle-build-helper:v${versions.getProperty("this")}k${versions.getProperty("kotlin")}") + classpath("ru.landgrafhomyak.kotlin:kotlin-mpp-gradle-build:v${versions.getProperty("this")}k${versions.getProperty("kotlin")}") } } -plugins { - kotlin("multiplatform") version "2.0.20" -} - repositories { mavenCentral() defineXomrkGiteaMavenRepo() } - -kotlin { - jvmToolchain(8) - defineAllMultiplatformTargets() - optInContracts() -} +xomrk { + kotlin { + jvmToolchain(8) + defineAllMultiplatformTargets() + optInContracts() + } +} \ No newline at end of file