properly generate and collect and create source sets for jvm+kt+ts (but kotlin multiplatform js doesn't work????)

todo: clean up this is really messy
This commit is contained in:
Adam 2021-11-02 23:22:30 +01:00
parent 00b3dc3554
commit ac8428f36d
6 changed files with 167 additions and 280 deletions

View file

@ -1,5 +1,6 @@
package dev.adamko.gradle.pbandg.pattern
import dev.adamko.gradle.pbandg.Constants.pbAndGBuildDir
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.findByType
@ -18,30 +19,36 @@ class KotlinMultiplatformProjectConfiguration : Plugin<Project> {
project.extensions.findByType<KotlinMultiplatformExtension>()?.apply {
project.logger.lifecycle("Kotlin Multiplatform source sets: ${sourceSets.joinToString { "${it.name} / ${it.kotlin.sourceDirectories.files.joinToString()}" }}")
sourceSets.whenObjectAdded {
this.name
// sourceSets.whenObjectAdded {
// this.name
// }
//
val jvmProto = this.sourceSets.maybeCreate("jvmProto").apply {
kotlin.srcDir(project.layout.pbAndGBuildDir.get().dir("generated-sources/java"))
kotlin.srcDir(project.layout.pbAndGBuildDir.get().dir("generated-sources/kotlin"))
dependsOn(sourceSets.maybeCreate("jvmMain"))
}
//
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 tsProto = this.sourceSets.maybeCreate("tsProto").apply {
kotlin.srcDir(project.layout.pbAndGBuildDir.get().dir("generated-sources/typescript"))
dependsOn(sourceSets.maybeCreate("jsMain"))
}
val protoTypescript = this.sourceSets.maybeCreate("protoJvm").apply {
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript"))
}
this.sourceSets.findByName("jvmMain")?.apply {
// protoJvm.dependsOn(this)
// dependsOn(protoJvm)
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java"))
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin"))
}
this.sourceSets.findByName("jsMain")?.apply {
// protoTypescript.dependsOn(this)
// dependsOn(protoTypescript)
kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/typescript"))
}
// this.sourceSets.findByName("jvmMain")?.apply {
//// protoJvm.dependsOn(this)
//// dependsOn(protoJvm)
// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/java"))
// kotlin.srcDir(project.layout.buildDirectory.dir("pbAndG/generated-sources/kotlin"))
// }
// this.sourceSets.findByName("jsMain")?.apply {
//// protoTypescript.dependsOn(this)
//// 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()}" }}")

View file

@ -1,16 +1,11 @@
package dev.adamko.gradle.pbandg
import dev.adamko.gradle.pbandg.Constants.pbAndGBuildDir
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
import dev.adamko.gradle.pbandg.task.options.ProtocOutput.JavaOutput
import dev.adamko.gradle.pbandg.task.options.ProtocOutput.KotlinOutput
//plugins {
// `kotlin-dsl`
//}
plugins {
base
@ -63,6 +58,9 @@ project.dependencies {
protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1")
// implementation("com.google.protobuf:protobuf-javalite:3.19.1")
// implementation("com.google.protobuf:protobuf-kotlin-lite:3.19.1")
// protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1")
//// implementation("com.google.protobuf:protobuf-javalite:3.19.1")
//// implementation("com.google.protobuf:protobuf-kotlin-lite:3.19.1")
}
val protobufPrepareLibrariesTask =
@ -70,12 +68,6 @@ val protobufPrepareLibrariesTask =
librarySources.set(protobufLibraryDependencies)
}
//project.dependencies {
// protobufLibraryDependencies("com.google.protobuf:protobuf-javalite:3.19.1")
//// implementation("com.google.protobuf:protobuf-javalite:3.19.1")
//// implementation("com.google.protobuf:protobuf-kotlin-lite:3.19.1")
//}
project.tasks.withType<ProtobufCompileTask> {
dependsOn(protocDep, protobufPrepareLibrariesTask)
protobufLibraryDirectories.add(protobufPrepareLibrariesTask.flatMap { it.librariesDirectory })
@ -85,10 +77,25 @@ project.tasks.withType<ProtobufCompileTask> {
protocExecutable.set(exe)
}
/** Convert `.proto` files to Kotlin */
val pbCompileTask = project.tasks.register<ProtobufCompileTask>(Constants.PBG_TASK_COMPILE) {
protocOutputs += KotlinOutput()
protocOutputs += JavaOutput()
}
val aggregateTask = project.tasks.register<Sync>("protobufCompileAll") {
group = Constants.PBG_TASK_GROUP
dependsOn(tasks.withType<ProtobufCompileTask>())
val genSrcDir = project.layout.pbAndGBuildDir.map { it.dir("generated-sources") }
val pbCompileTasks = tasks.withType<ProtobufCompileTask>()
from(pbCompileTasks.map { it.temporaryDir })
into(genSrcDir)
includeEmptyDirs = false
}
//project.tasks.assemble { dependsOn(aggregateTask) }
///** Convert `.proto` files to Kotlin */
//val pbCompileTask = project.tasks.create<ProtobufCompileTask>("protobufJava") {
// protocOutputs += KotlinOutput()
// protocOutputs += JavaOutput()
//}
project.tasks.assemble { dependsOn(pbCompileTask) }

View file

@ -1,36 +1,32 @@
package dev.adamko.gradle.pbandg.task
import dev.adamko.gradle.pbandg.Constants
import dev.adamko.gradle.pbandg.Constants.pbAndGBuildDir
import dev.adamko.gradle.pbandg.task.options.ProtocOutput
import org.gradle.api.DefaultTask
import org.gradle.api.DomainObjectSet
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.OutputDirectory
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.property
import dev.adamko.gradle.pbandg.Constants.pbAndGBuildDir
abstract class ProtobufCompileTask : DefaultTask() {
@get:InputFile
abstract val protocExecutable: RegularFileProperty
@get:OutputDirectory
val generatedSources: DirectoryProperty = project.objects.directoryProperty()
.convention(project.pbAndGBuildDir.map { it.dir("generated-sources") })
@get:InputFiles
abstract val protobufLibraryDirectories: ListProperty<Directory>
@get:Input
abstract val protocOutputs: DomainObjectSet<ProtocOutput>
// @get:Input
// abstract val protocOutputs: DomainObjectSet<ProtocOutput>
// = project.objects.domainObjectSet(ProtocOutput::class.java)
@get:Input
@ -43,35 +39,37 @@ abstract class ProtobufCompileTask : DefaultTask() {
val cliParamProtoPath: Property<String> =
project.objects.property<String>().convention("--proto_path=")
@get:OutputDirectory
val outputDir: RegularFileProperty =
project.objects.fileProperty().convention { temporaryDir }
// @get:Internal
// val outputPath: Provider<String> = outputDir.map { it.asFile.canonicalPath }
init {
group = Constants.PBG_TASK_GROUP
}
@TaskAction
fun compile() {
val workDir = temporaryDir
// project.delete(workDir)
// prepare directories
project.mkdir(outputDir)
project.exec {
executable(protocExecutable.asFile.get())
workingDir(workDir)
workingDir(outputDir.asFile.get())
// prepare directories
project.mkdir(workingDir)
project.mkdir(generatedSources)
val mapOutputsToOutputDir =
protocOutputs.associateWith { workingDir.resolve(it.outputDirectoryName) }
mapOutputsToOutputDir.values.forEach { project.mkdir(it) }
// set args
mapOutputsToOutputDir
.map { (opt, dir) ->
val optionsSuffix = if (opt.protocOptions.isBlank()) "" else ":"
"${opt.cliParam}=${opt.protocOptions}$optionsSuffix$dir"
}
.also { args(it) }
// val mapOutputsToOutputDir =
// protocOutputs.associateWith { outputDir.get().asFile.resolve(it.outputDirectoryName) }
// mapOutputsToOutputDir.values.forEach { project.mkdir(it) }
//
// // set args
// mapOutputsToOutputDir
// .map { (opt, dir) ->
// val optionsSuffix = if (opt.protocOptions.isBlank()) "" else ":"
// "${opt.cliParam}=${opt.protocOptions}$optionsSuffix$dir"
// }
// .also { args(it) }
args(cliArgs.get())
val protoPath = cliParamProtoPath.get()
@ -83,76 +81,6 @@ abstract class ProtobufCompileTask : DefaultTask() {
args("$targetProtoFile")
}
// sync compiled files
project.sync {
from(workDir)
into(generatedSources)
includeEmptyDirs = false
}
// clean up temp-dir
project.delete(workDir)
}
}
/*
{
group = "protobuf"
dependsOn(protobufCompiler, protoLibsTask)
standardOutput = System.out
executable(protobufCompiler.singleFile)
workingDir(temporaryDirFactory)
val outDir = project.layout.buildDirectory.dir("protobuf/generated-sources")
outputs.dir(outDir)
val protoLibsDir: Provider<File> = protoLibsTask.map { it.destinationDir }
val javaOut = workingDir.resolve("java")
val kotlinOut = workingDir.resolve("kotlin")
val protoFile by project.objects.fileProperty()
.convention(project.layout.projectDirectory.file("src/main/proto/FactorioServerLogRecord.proto"))
val protoFileParent = project.provider { protoFile.asFile.parentFile }
val isLiteEnabled: Boolean by project.objects.property<Boolean>().convention(true)
doFirst {
project.delete(workingDir)
project.mkdir(outDir)
project.mkdir(javaOut)
project.mkdir(kotlinOut)
val liteOpt: String = when (isLiteEnabled) {
true -> "lite:"
false -> ""
}
args(
parseSpaceSeparatedArgs(
"""
--proto_path=${protoLibsDir.get()}
--proto_path=${protoFileParent.get()}
--java_out=$liteOpt$javaOut
--kotlin_out=$liteOpt$kotlinOut
$protoFile
"""
)
)
}
doLast {
project.sync {
from(workingDir)
into(outDir)
}
project.delete(workingDir)
}
}
*/