Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .idea/kotlinx-rpc.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

import util.other.libs
import org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode

plugins {
id("conventions-jvm")
}

dependencies {
implementation(libs.protobuf.java)

implementation(libs.slf4j.api)
implementation(libs.logback.classic)

testImplementation(libs.kotlin.test)
}

tasks.jar {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
archiveClassifier = "all"

// Protoc plugins are all fat jars basically (the ones built on jvm)
// be really careful of what you put in the classpath here
from(
configurations.runtimeClasspath.map { prop ->
prop.map { if (it.isDirectory()) it else zipTree(it) }
}
)
}

kotlin {
explicitApi = ExplicitApiMode.Disabled
}

tasks.test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import util.other.isPublicModule
import util.tasks.ValidatePublishedArtifactsTask

val isGradlePlugin = project.name == "gradle-plugin"
val isProtocGen = project.name == "protoc-gen"
val isProtocGen = project.rootProject.name.startsWith(PROTOC_GEN)
val publishingExtension = project.extensions.findByType<PublishingExtension>()
val globalRootDir: String by extra

Expand Down
72 changes: 72 additions & 0 deletions gradle-conventions/src/main/kotlin/util/cinterop.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
/*
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
*/

package util

import org.gradle.api.GradleException
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.Project
import org.gradle.api.tasks.Exec
import org.gradle.internal.extensions.stdlib.capitalized
import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.named
import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.kotlin.dsl.register
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultCInteropSettings
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
import java.io.File
import kotlin.io.resolve

// works with the cinterop-c Bazel project
fun KotlinMultiplatformExtension.configureCLibCInterop(
project: Project,
bazelTask: String,
configureCinterop: NamedDomainObjectContainer<DefaultCInteropSettings>.(cinteropCLib: File) -> Unit,
) {
val globalRootDir: String by project.extra

val cinteropCLib = project.layout.projectDirectory.dir("$globalRootDir/cinterop-c").asFile

// TODO: Replace function implementation, so it does not use an internal API
fun findProgram(name: String) = org.gradle.internal.os.OperatingSystem.current().findInPath(name)
val checkBazel = project.tasks.register("checkBazel") {
doLast {
val bazelPath = findProgram("bazel")
if (bazelPath != null) {
logger.debug("bazel: {}", bazelPath)
} else {
throw GradleException("'bazel' not found on PATH. Please install Bazel (https://bazel.build/).")
}
}
}

val buildCinteropCLib = project.tasks.register<Exec>("buildCinteropCLib") {
group = "build"
workingDir = cinteropCLib
commandLine("bash", "-c", "bazel build $bazelTask --config=release")
inputs.files(project.fileTree(cinteropCLib) { exclude("bazel-*/**") })
outputs.dir(cinteropCLib.resolve("bazel-bin"))

dependsOn(checkBazel)
}

targets.filterIsInstance<KotlinNativeTarget>().forEach {
it.compilations.getByName("main") {
cinterops {
configureCinterop(cinteropCLib)
}

cinterops.all {
val interop = this

val interopTask = "cinterop${interop.name.capitalized()}${it.targetName.capitalized()}"
project.tasks.named(interopTask, CInteropProcess::class) {
dependsOn(buildCinteropCLib)
}
}
}
}
}
11 changes: 8 additions & 3 deletions gradle-conventions/src/main/kotlin/util/publication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import java.io.File

const val KOTLINX_RPC_PREFIX = "kotlinx-rpc"
const val PROTOC_GEN = "protoc-gen"
const val PROTOC_GEN_KOTLIN_MULTIPLATFORM = "protoc-gen-kotlin-multiplatform"
const val PROTOC_GEN_KOTLIN_MULTIPLATFORM = "kotlin-multiplatform"

/**
* Important to configure inside [KotlinTarget.mavenPublication]
Expand All @@ -28,8 +28,13 @@ const val PROTOC_GEN_KOTLIN_MULTIPLATFORM = "protoc-gen-kotlin-multiplatform"
fun MavenPublication.setPublicArtifactId(project: Project) {
val publication = this

if (publication.artifactId == PROTOC_GEN) {
publication.artifactId = PROTOC_GEN_KOTLIN_MULTIPLATFORM
if (project.rootProject.name == PROTOC_GEN) {
val middle = when (project.name) {
"grpc" -> "grpc-"
"protobuf" -> ""
else -> error("Unsupported project name in $PROTOC_GEN: ${project.name}")
}
publication.artifactId = "$PROTOC_GEN-$middle$PROTOC_GEN_KOTLIN_MULTIPLATFORM"
project.logger.info("Altered artifactId for $name publication: $artifactId")
} else if (!publication.artifactId.startsWith(KOTLINX_RPC_PREFIX)) {
publication.artifactId = "$KOTLINX_RPC_PREFIX-$artifactId"
Expand Down
78 changes: 40 additions & 38 deletions gradle-plugin/api/gradle-plugin.api
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ public abstract interface annotation class kotlinx/rpc/RpcDangerousApi : java/la
public class kotlinx/rpc/RpcExtension {
public fun <init> (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/Project;)V
public final fun getAnnotationTypeSafetyEnabled ()Lorg/gradle/api/provider/Provider;
public final fun getGrpc ()Lkotlinx/rpc/grpc/GrpcExtension;
public final fun getProtoc ()Lkotlinx/rpc/protoc/ProtocExtension;
public final fun getStrict ()Lkotlinx/rpc/RpcStrictModeExtension;
public final fun grpc (Lorg/gradle/api/Action;)V
public static synthetic fun grpc$default (Lkotlinx/rpc/RpcExtension;Lorg/gradle/api/Action;ILjava/lang/Object;)V
public final fun protoc (Lorg/gradle/api/Action;)V
public static synthetic fun protoc$default (Lkotlinx/rpc/RpcExtension;Lorg/gradle/api/Action;ILjava/lang/Object;)V
public final fun strict (Lorg/gradle/api/Action;)V
}

Expand All @@ -21,6 +21,7 @@ public final class kotlinx/rpc/RpcStrictMode : java/lang/Enum {
public static final field ERROR Lkotlinx/rpc/RpcStrictMode;
public static final field NONE Lkotlinx/rpc/RpcStrictMode;
public static final field WARNING Lkotlinx/rpc/RpcStrictMode;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/RpcStrictMode;
public static fun values ()[Lkotlinx/rpc/RpcStrictMode;
}
Expand Down Expand Up @@ -61,6 +62,7 @@ public final class kotlinx/rpc/buf/BufExtension$LogFormat : java/lang/Enum {
public static final field Default Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static final field Json Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static final field Text Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/buf/BufExtension$LogFormat;
public static fun values ()[Lkotlinx/rpc/buf/BufExtension$LogFormat;
}
Expand All @@ -79,6 +81,7 @@ public final class kotlinx/rpc/buf/BufGenerateExtension$ErrorFormat : java/lang/
public static final field Junit Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field Msvs Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static final field Text Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
public static fun values ()[Lkotlinx/rpc/buf/BufGenerateExtension$ErrorFormat;
}
Expand Down Expand Up @@ -119,6 +122,7 @@ public abstract class kotlinx/rpc/buf/tasks/BufGenerateTask : kotlinx/rpc/buf/ta
public fun <init> ()V
public abstract fun getAdditionalArgs ()Lorg/gradle/api/provider/ListProperty;
public abstract fun getErrorFormat ()Lorg/gradle/api/provider/Property;
public abstract fun getExecutableFiles ()Lorg/gradle/api/provider/ListProperty;
public abstract fun getIncludeImports ()Lorg/gradle/api/provider/Property;
public abstract fun getIncludeWkt ()Lorg/gradle/api/provider/Property;
public abstract fun getOutputDirectory ()Lorg/gradle/api/provider/Property;
Expand Down Expand Up @@ -146,14 +150,8 @@ public final class kotlinx/rpc/buf/tasks/GenerateBufYamlKt$inlined$sam$i$org_gra
public final synthetic fun execute (Ljava/lang/Object;)V
}

public abstract interface class kotlinx/rpc/grpc/GrpcExtension {
public abstract fun buf (Lorg/gradle/api/Action;)V
public abstract fun getBuf ()Lkotlinx/rpc/buf/BufExtension;
public abstract fun getProtocPlugins ()Lorg/gradle/api/NamedDomainObjectContainer;
public abstract fun protocPlugins (Lorg/gradle/api/Action;)V
}

public final class kotlinx/rpc/proto/ConstsKt {
public final class kotlinx/rpc/protoc/ConstsKt {
public static final field PROTOC_GEN_GRPC_KOTLIN_MULTIPLATFORM_JAR_CONFIGURATION Ljava/lang/String;
public static final field PROTOC_GEN_KOTLIN_MULTIPLATFORM_JAR_CONFIGURATION Ljava/lang/String;
public static final field PROTO_BUILD_DIR Ljava/lang/String;
public static final field PROTO_BUILD_GENERATED Ljava/lang/String;
Expand All @@ -165,33 +163,39 @@ public final class kotlinx/rpc/proto/ConstsKt {
public static final field PROTO_SOURCE_SETS Ljava/lang/String;
}

public final class kotlinx/rpc/proto/KotlinMultiplatformPluginJarKt {
public final class kotlinx/rpc/protoc/PluginJarsKt {
public static final fun getGrpcKotlinMultiplatformProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
public static final fun getKotlinMultiplatformProtocPluginJarPath (Lorg/gradle/api/Project;)Lorg/gradle/api/provider/Provider;
}

public abstract class kotlinx/rpc/proto/ProcessProtoFiles : org/gradle/api/tasks/Copy {
public abstract class kotlinx/rpc/protoc/ProcessProtoFiles : org/gradle/api/tasks/Copy {
public fun <init> ()V
}

public final class kotlinx/rpc/proto/ProcessProtoFilesKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
public final class kotlinx/rpc/protoc/ProcessProtoFilesKt$inlined$sam$i$org_gradle_api_Action$0 : org/gradle/api/Action {
public fun <init> (Lkotlin/jvm/functions/Function1;)V
public final synthetic fun execute (Ljava/lang/Object;)V
}

public abstract interface class kotlinx/rpc/proto/ProtoSourceSet {
public abstract interface class kotlinx/rpc/protoc/ProtoSourceSet {
public abstract fun getName ()Ljava/lang/String;
public abstract fun getProto ()Lorg/gradle/api/file/SourceDirectorySet;
public fun proto (Lorg/gradle/api/Action;)V
public abstract fun protocPlugin (Lkotlinx/rpc/proto/ProtocPlugin;)V
public abstract fun protocPlugin (Lkotlinx/rpc/protoc/ProtocPlugin;)V
public abstract fun protocPlugin (Lorg/gradle/api/NamedDomainObjectProvider;)V
}

public class kotlinx/rpc/proto/ProtocPlugin {
public static final field Companion Lkotlinx/rpc/proto/ProtocPlugin$Companion;
public static final field GRPC_JAVA Ljava/lang/String;
public static final field GRPC_KOTLIN Ljava/lang/String;
public abstract interface class kotlinx/rpc/protoc/ProtocExtension {
public abstract fun buf (Lorg/gradle/api/Action;)V
public abstract fun getBuf ()Lkotlinx/rpc/buf/BufExtension;
public abstract fun getPlugins ()Lorg/gradle/api/NamedDomainObjectContainer;
public abstract fun plugins (Lorg/gradle/api/Action;)V
}

public class kotlinx/rpc/protoc/ProtocPlugin {
public static final field Companion Lkotlinx/rpc/protoc/ProtocPlugin$Companion;
public static final field GRPC_KOTLIN_MULTIPLATFORM Ljava/lang/String;
public static final field KOTLIN_MULTIPLATFORM Ljava/lang/String;
public static final field PROTOBUF_JAVA Ljava/lang/String;
public fun <init> (Ljava/lang/String;Lorg/gradle/api/Project;)V
public final fun getArtifact ()Lorg/gradle/api/provider/Property;
public final fun getExcludeTypes ()Lorg/gradle/api/provider/ListProperty;
Expand All @@ -206,42 +210,40 @@ public class kotlinx/rpc/proto/ProtocPlugin {
public final fun remote (Lorg/gradle/api/Action;)V
}

public abstract class kotlinx/rpc/proto/ProtocPlugin$Artifact {
public abstract class kotlinx/rpc/protoc/ProtocPlugin$Artifact {
}

public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Local : kotlinx/rpc/proto/ProtocPlugin$Artifact {
public final class kotlinx/rpc/protoc/ProtocPlugin$Artifact$Local : kotlinx/rpc/protoc/ProtocPlugin$Artifact {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun executor (Lorg/gradle/api/provider/Provider;)V
public final fun executor ([Ljava/lang/String;)V
public final fun getExecutableFiles ()Lorg/gradle/api/provider/ListProperty;
public final fun getExecutor ()Lorg/gradle/api/provider/ListProperty;
public final fun javaJar (Ljava/lang/String;)V
public final fun javaJar (Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;)V
public static synthetic fun javaJar$default (Lkotlinx/rpc/proto/ProtocPlugin$Artifact$Local;Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;ILjava/lang/Object;)V
public static synthetic fun javaJar$default (Lkotlinx/rpc/protoc/ProtocPlugin$Artifact$Local;Lorg/gradle/api/provider/Provider;Lorg/gradle/api/provider/Provider;ILjava/lang/Object;)V
}

public final class kotlinx/rpc/proto/ProtocPlugin$Artifact$Remote : kotlinx/rpc/proto/ProtocPlugin$Artifact {
public final class kotlinx/rpc/protoc/ProtocPlugin$Artifact$Remote : kotlinx/rpc/protoc/ProtocPlugin$Artifact {
public fun <init> (Lorg/gradle/api/Project;)V
public final fun getLocator ()Lorg/gradle/api/provider/Property;
}

public final class kotlinx/rpc/proto/ProtocPlugin$Companion {
public final class kotlinx/rpc/protoc/ProtocPlugin$Companion {
}

public final class kotlinx/rpc/proto/ProtocPlugin$Strategy : java/lang/Enum {
public static final field All Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public static final field Directory Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public static fun values ()[Lkotlinx/rpc/proto/ProtocPlugin$Strategy;
public final class kotlinx/rpc/protoc/ProtocPlugin$Strategy : java/lang/Enum {
public static final field All Lkotlinx/rpc/protoc/ProtocPlugin$Strategy;
public static final field Directory Lkotlinx/rpc/protoc/ProtocPlugin$Strategy;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lkotlinx/rpc/protoc/ProtocPlugin$Strategy;
public static fun values ()[Lkotlinx/rpc/protoc/ProtocPlugin$Strategy;
}

public final class kotlinx/rpc/proto/ProtocPluginKt {
public static final fun getGrpcJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getGrpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public final class kotlinx/rpc/protoc/ProtocPluginKt {
public static final fun getGrpcKotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getKotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun getProtobufJava (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider;
public static final fun grpcJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun grpcKotlin (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun grpcKotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun kotlinMultiplatform (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
public static final fun protobufJava (Lorg/gradle/api/NamedDomainObjectContainer;Lorg/gradle/api/Action;)V
}

4 changes: 3 additions & 1 deletion gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ tasks.test {

useJUnitPlatform()

dependsOn(gradle.includedBuild("protoc-gen").task(":publishAllPublicationsToBuildRepoRepository"))
val includedBuild = gradle.includedBuild("protoc-gen")
dependsOn(includedBuild.task(":grpc:publishAllPublicationsToBuildRepoRepository"))
dependsOn(includedBuild.task(":protobuf:publishAllPublicationsToBuildRepoRepository"))
}

// This block is needed to show plugin tasks on --dry-run
Expand Down
20 changes: 10 additions & 10 deletions gradle-plugin/src/main/kotlin/kotlinx/rpc/Extensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@

package kotlinx.rpc

import kotlinx.rpc.grpc.DefaultGrpcExtension
import kotlinx.rpc.grpc.GrpcExtension
import kotlinx.rpc.protoc.DefaultProtocExtension
import kotlinx.rpc.protoc.ProtocExtension
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory
Expand Down Expand Up @@ -45,21 +45,21 @@ public open class RpcExtension @Inject constructor(objects: ObjectFactory, priva
configure.execute(strict)
}

internal val grpcApplied = AtomicBoolean(false)
internal val protocApplied = AtomicBoolean(false)

/**
* Grpc settings.
* Protoc settings.
*/
public val grpc: GrpcExtension by lazy {
grpcApplied.set(true)
objects.newInstance<DefaultGrpcExtension>()
public val protoc: ProtocExtension by lazy {
protocApplied.set(true)
objects.newInstance<DefaultProtocExtension>()
}

/**
* Grpc settings.
* Protoc settings.
*/
public fun grpc(configure: Action<GrpcExtension> = Action {}) {
configure.execute(grpc)
public fun protoc(configure: Action<ProtocExtension> = Action {}) {
configure.execute(protoc)
}
}

Expand Down
4 changes: 2 additions & 2 deletions gradle-plugin/src/main/kotlin/kotlinx/rpc/RpcGradlePlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

package kotlinx.rpc

import kotlinx.rpc.grpc.configurePluginProtections
import kotlinx.rpc.proto.createProtoExtensions
import kotlinx.rpc.protoc.configurePluginProtections
import kotlinx.rpc.protoc.createProtoExtensions
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.create
Expand Down
Loading
Loading