From 6dce641d6b20dcafcd8cd5b5cfe5f53fcfce09ff Mon Sep 17 00:00:00 2001 From: Adam <897017+asemy@users.noreply.github.com> Date: Sun, 31 Oct 2021 11:32:27 +0100 Subject: [PATCH] kotlin multiplatform and proto kind of working? --- .../gradle/pbandg/pattern/IntelliJPattern.kt | 2 +- ...on.kt => KotlinJvmProjectConfiguration.kt} | 22 +-- ...KotlinMultiplatformProjectConfiguration.kt | 61 +++++++++ .../adamko/gradle/pbandg/pb-and-g.gradle.kts | 15 +- .../build.gradle.kts | 129 +++++++++++++++++- .../proto/FactorioServerLogRecord.proto | 0 .../FactorioEvent.kt | 0 .../JsonPrimitiveType.kt | 0 .../{src => xsrc}/main/kotlin/PlayerModel.kt | 0 9 files changed, 207 insertions(+), 22 deletions(-) rename buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/{KotlinProjectConfiguration.kt => KotlinJvmProjectConfiguration.kt} (66%) create mode 100644 buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt rename modules/factorio-events-data-model/src/{main => }/proto/FactorioServerLogRecord.proto (100%) rename modules/factorio-events-data-model/{src => xsrc}/commonMain/kotlin/dev.adamko.factorioevents.model/FactorioEvent.kt (100%) rename modules/factorio-events-data-model/{src => xsrc}/jsMain/kotlin/dev.adamko.factorioevents.model/JsonPrimitiveType.kt (100%) rename modules/factorio-events-data-model/{src => xsrc}/main/kotlin/PlayerModel.kt (100%) diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/IntelliJPattern.kt b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/IntelliJPattern.kt index 4adc9d2..8749884 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/IntelliJPattern.kt +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/IntelliJPattern.kt @@ -50,4 +50,4 @@ class IntelliJPattern : Plugin { } } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinProjectConfiguration.kt b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinJvmProjectConfiguration.kt similarity index 66% rename from buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinProjectConfiguration.kt rename to buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinJvmProjectConfiguration.kt index cdcca3c..4d0c429 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinProjectConfiguration.kt +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinJvmProjectConfiguration.kt @@ -7,7 +7,7 @@ import org.gradle.api.tasks.SourceSetContainer import org.gradle.kotlin.dsl.findByType import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension -class KotlinProjectConfiguration : Plugin { +class KotlinJvmProjectConfiguration : Plugin { override fun apply(project: Project) { addSourceSets(project) @@ -15,16 +15,18 @@ class KotlinProjectConfiguration : Plugin { private fun addSourceSets(project: Project) { - project.extensions.findByType()?.apply { - - project.extensions.findByType() - ?.named(SourceSet.MAIN_SOURCE_SET_NAME) - ?.configure { - java { - srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) - srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) + project.beforeEvaluate { + extensions.findByType()?.apply { + extensions.findByType() + ?.named(SourceSet.MAIN_SOURCE_SET_NAME) + ?.configure { + java { + srcDir(layout.buildDirectory.dir("pbAndG/generated-sources/java")) + srcDir(layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) + } } - } + + } // val srcSet = project.extensions.getByName(SourceSet.MAIN_SOURCE_SET_NAME) // diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt new file mode 100644 index 0000000..79845f4 --- /dev/null +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pattern/KotlinMultiplatformProjectConfiguration.kt @@ -0,0 +1,61 @@ +package dev.adamko.gradle.pbandg.pattern + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.findByType +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension + +class KotlinMultiplatformProjectConfiguration : Plugin { + + override fun apply(project: Project) { + project.afterEvaluate { + addSourceSets(this) + } + } + + private fun addSourceSets(project: Project) { + + project.extensions.findByType()?.apply { + project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}") + + sourceSets.whenObjectAdded { + this.name + } +// +// val protoJvm = this.sourceSets.maybeCreate("protoJvm").apply { +// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) +// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) +// } +// +// val protoTypescript = this.sourceSets.maybeCreate("protoJvm").apply { +// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript")) +// } + + this.sourceSets.named("jvmMain").configure { +// dependsOn(protoJvm) + kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java")) + kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin")) + } + this.sourceSets.named("jsMain").configure { +// dependsOn(protoTypescript) + kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript")) + } + + project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}") + +// +// targets .forEach { +// when (it.platformType){ +// KotlinPlatformType.jvm -> TODO() +// KotlinPlatformType.js -> { +// it.defaultConfigurationName +// } +// KotlinPlatformType.androidJvm -> {} +// KotlinPlatformType.common -> {} +// KotlinPlatformType.native -> {} +// } +// } + + } + } +} diff --git a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts index c015322..232bbea 100644 --- a/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts +++ b/buildSrc/src/main/kotlin/dev/adamko/gradle/pbandg/pb-and-g.gradle.kts @@ -1,7 +1,7 @@ package dev.adamko.gradle.pbandg -import dev.adamko.gradle.pbandg.pattern.IntelliJPattern -import dev.adamko.gradle.pbandg.pattern.KotlinProjectConfiguration +import dev.adamko.gradle.pbandg.pattern.KotlinJvmProjectConfiguration +import dev.adamko.gradle.pbandg.pattern.KotlinMultiplatformProjectConfiguration import dev.adamko.gradle.pbandg.settings.PBAndGSettings import dev.adamko.gradle.pbandg.task.ProtobufCompileTask import dev.adamko.gradle.pbandg.task.ProtobufPrepareLibrariesTask @@ -24,8 +24,15 @@ plugins { //if (plugins.hasPlugin(IdeaPlugin::class)) { // IntelliJPattern().apply(project) //} -if (plugins.hasPlugin("org.jetbrains.kotlin.jvm")) { - KotlinProjectConfiguration().apply(project) + +plugins.withId("org.jetbrains.kotlin.jvm") { + logger.info("Configuring Kotlin JVM plugin for PB&G") + KotlinJvmProjectConfiguration().apply(project) +} + +plugins.withId("org.jetbrains.kotlin.multiplatform") { + logger.info("Configuring Kotlin Multiplatform plugin for PB&G") + KotlinMultiplatformProjectConfiguration().apply(project) } val pbAndGSettings = diff --git a/modules/factorio-events-data-model/build.gradle.kts b/modules/factorio-events-data-model/build.gradle.kts index 4787ac5..fac3999 100644 --- a/modules/factorio-events-data-model/build.gradle.kts +++ b/modules/factorio-events-data-model/build.gradle.kts @@ -1,7 +1,9 @@ plugins { - id("dev.adamko.factoriowebmap.archetype.kotlin-jvm") + id("dev.adamko.factoriowebmap.archetype.base") + kotlin("multiplatform") + +// id("dev.adamko.factoriowebmap.archetype.kotlin-jvm") id("dev.adamko.gradle.pbandg.pb-and-g") - `kotlin-dsl` } val projectId: String by project.extra @@ -10,15 +12,128 @@ val buildDir: Directory = layout.buildDirectory.dir(projectId).get() dependencies { protobufLibrary("com.google.protobuf:protobuf-javalite:3.19.1") - - api("com.google.protobuf:protobuf-javalite:3.19.1") - api("com.google.protobuf:protobuf-kotlin-lite:3.19.1") +// +// api("com.google.protobuf:protobuf-javalite:3.19.1") +// api("com.google.protobuf:protobuf-kotlin-lite:3.19.1") } tasks.protobufCompile { - protoFile.set(layout.projectDirectory.file("src/main/proto/FactorioServerLogRecord.proto")) + protoFile.set(layout.projectDirectory.file("src/proto/FactorioServerLogRecord.proto")) } -sourceSets { +idea { + workspace { + + } +} + +kotlin { + sourceSets.all { + languageSettings.apply { + languageVersion = "1.5" +// enableLanguageFeature("InlineClasses") // language feature name + optIn("kotlin.OptIn") + optIn("kotlin.ExperimentalStdlibApi") + optIn("kotlin.time.ExperimentalTime") + optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") +// progressiveMode = true // false by default + } + } + + // + sourceSets { + val proto by creating { + } + } + // + + // + jvm { + compilations.configureEach { + kotlinOptions { + jvmTarget = "11" + } + } + } + + sourceSets { + val jvmMain by getting { + dependencies { + api("com.google.protobuf:protobuf-javalite:3.19.1") + api("com.google.protobuf:protobuf-kotlin-lite:3.19.1") + } + } + val jvmTest by getting { + } + } + // + + // + js(IR) { + binaries.executable() + browser { + commonWebpackConfig { + cssSupport.enabled = true + } + } + + useCommonJs() + nodejs() + + compilations["main"].apply { + packageJson { + customField( + "scripts", + mapOf( + "build" to "tstl", + "dev" to "tstl --watch", + ) + ) + } + } + + } + + sourceSets { + + val jsMain by getting { + kotlin.srcDir("externals02") +// kotlin.srcDir("externals") + + dependencies { + + val kotlinWrappersVersion = "0.0.1-pre.254-kotlin-1.5.31" + implementation( + project.dependencies.enforcedPlatform( + "org.jetbrains.kotlin-wrappers:kotlin-wrappers-bom:${kotlinWrappersVersion}" + ) + ) + +// implementation("org.jetbrains.kotlin-wrappers:kotlin-react") +// implementation("org.jetbrains.kotlin-wrappers:kotlin-react-dom") +// implementation(npm("react", "17.0.2")) +// implementation(npm("react-dom", "17.0.2")) + +// implementation("org.jetbrains.kotlinx:kotlinx-nodejs:0.0.7") { +// because("https://github.com/Kotlin/kotlinx-nodejs") +// } + +// implementation(npm("typescript-to-lua", "1.0.1")) +// implementation(npm("typed-factorio", "0.7.1")) +// implementation(npm("lua-types", "2.11.0")) +// implementation(npm("typescript", "4.4.3")) + + + implementation(npm("ts-proto", "1.83.3")) + } + } + + val jsTest by getting { + dependencies { + implementation(kotlin("test-js")) + } + } + } + // } diff --git a/modules/factorio-events-data-model/src/main/proto/FactorioServerLogRecord.proto b/modules/factorio-events-data-model/src/proto/FactorioServerLogRecord.proto similarity index 100% rename from modules/factorio-events-data-model/src/main/proto/FactorioServerLogRecord.proto rename to modules/factorio-events-data-model/src/proto/FactorioServerLogRecord.proto diff --git a/modules/factorio-events-data-model/src/commonMain/kotlin/dev.adamko.factorioevents.model/FactorioEvent.kt b/modules/factorio-events-data-model/xsrc/commonMain/kotlin/dev.adamko.factorioevents.model/FactorioEvent.kt similarity index 100% rename from modules/factorio-events-data-model/src/commonMain/kotlin/dev.adamko.factorioevents.model/FactorioEvent.kt rename to modules/factorio-events-data-model/xsrc/commonMain/kotlin/dev.adamko.factorioevents.model/FactorioEvent.kt diff --git a/modules/factorio-events-data-model/src/jsMain/kotlin/dev.adamko.factorioevents.model/JsonPrimitiveType.kt b/modules/factorio-events-data-model/xsrc/jsMain/kotlin/dev.adamko.factorioevents.model/JsonPrimitiveType.kt similarity index 100% rename from modules/factorio-events-data-model/src/jsMain/kotlin/dev.adamko.factorioevents.model/JsonPrimitiveType.kt rename to modules/factorio-events-data-model/xsrc/jsMain/kotlin/dev.adamko.factorioevents.model/JsonPrimitiveType.kt diff --git a/modules/factorio-events-data-model/src/main/kotlin/PlayerModel.kt b/modules/factorio-events-data-model/xsrc/main/kotlin/PlayerModel.kt similarity index 100% rename from modules/factorio-events-data-model/src/main/kotlin/PlayerModel.kt rename to modules/factorio-events-data-model/xsrc/main/kotlin/PlayerModel.kt