Skip to content

Commit 20a5ab7

Browse files
committed
grpc-native: One build task per platform target
Signed-off-by: Johannes Zottele <[email protected]>
1 parent 2ece62f commit 20a5ab7

File tree

6 files changed

+116
-78
lines changed

6 files changed

+116
-78
lines changed

cinterop-c/build_all_targets.sh

Lines changed: 0 additions & 54 deletions
This file was deleted.

cinterop-c/build_target.sh

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env bash
2+
#
3+
# Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
4+
#
5+
6+
set -Eeuo pipefail
7+
trap 'echo "ERROR: Build failed at ${BASH_SOURCE}:${LINENO}" >&2' ERR
8+
9+
# Builds a static library for a specific platform (os/arch).
10+
#
11+
# Usage:
12+
# ./build_target.sh //path:libtarget out_dir <platform> <short> <os>
13+
# Example:
14+
# ./build_target.sh :protowire_static out @build_bazel_apple_support//platforms:ios_arm64 ios_arm64 ios
15+
#
16+
# The example will produce ./out/libprotowire_static.ios_arm64.a
17+
18+
LABEL="${1:?need bazel target label}"
19+
DST="${2:?need output destination}"
20+
PLATFORM="${3:?need a platform for bazel build command}"
21+
OS="${4:?need the operating system of the target platform}"
22+
23+
CONFIG=release
24+
25+
mkdir -p $(dirname "$DST")
26+
27+
echo "==> Building $LABEL to $DST" >&2
28+
bazel build "$LABEL" --platforms="$PLATFORM" --apple_platform_type="$OS" --config="$CONFIG" --announce_rc >/dev/null
29+
30+
# Ask Bazel what file(s) this target produced under this platform
31+
out="$(bazel cquery "$LABEL" --platforms="$PLATFORM" --apple_platform_type="$OS" --config="$CONFIG" --output=files | head -n1)"
32+
[[ -n "$out" ]] || { echo "No output for $LABEL ($SHORT)"; exit 1; }
33+
34+
cp -f "$out" "$DST"
35+
36+
echo "Done. Binary written to: $DST"

gradle-conventions/src/main/kotlin/util/cinterop.kt

Lines changed: 71 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ import org.gradle.api.NamedDomainObjectContainer
99
import org.gradle.api.Project
1010
import org.gradle.api.tasks.Exec
1111
import org.gradle.internal.extensions.stdlib.capitalized
12-
import org.gradle.kotlin.dsl.extra
13-
import org.gradle.kotlin.dsl.named
14-
import org.gradle.kotlin.dsl.provideDelegate
15-
import org.gradle.kotlin.dsl.register
12+
import org.gradle.kotlin.dsl.*
1613
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
1714
import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultCInteropSettings
1815
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
1916
import org.jetbrains.kotlin.gradle.tasks.CInteropProcess
17+
import org.jetbrains.kotlin.konan.target.Family
18+
import org.jetbrains.kotlin.konan.target.KonanTarget
2019
import java.io.File
2120

2221
// works with the cinterop-c Bazel project
@@ -42,30 +41,87 @@ fun KotlinMultiplatformExtension.configureCLibCInterop(
4241
}
4342
}
4443

45-
val buildCinteropCLib = project.tasks.register<Exec>("buildCinteropCLib") {
46-
group = "build"
47-
workingDir = cinteropCLib
48-
commandLine("bash", "-c", "${cinteropCLib}/build_all_targets.sh $bazelTask out")
49-
inputs.files(project.fileTree(cinteropCLib) { exclude("bazel-*/**", "out/**") })
50-
outputs.dir(cinteropCLib.resolve("out"))
44+
targets.withType<KotlinNativeTarget>().configureEach {
45+
val buildTargetName = bazelTask.split(":").last()
46+
// bazel library build task
47+
val taskName = "buildCLib${buildTargetName.capitalized()}_$targetName"
48+
val buildCinteropCLib = project.tasks.register<Exec>(taskName) {
49+
val platform = bazelPlatformName
50+
val os = bazelOsName
5151

52-
dependsOn(checkBazel)
53-
}
52+
// the name used for the static library files (e.g. iosSimulatorArm64 -> ios_simulator_arm64)
53+
val platformShortName = konanTarget.visibleName
54+
val fileName = "lib$buildTargetName.$platformShortName.a"
55+
val outFile = cinteropCLib.resolve("out").resolve(fileName)
56+
57+
group = "build"
58+
workingDir = cinteropCLib
59+
commandLine("bash", "-c", "./build_target.sh $bazelTask $outFile $platform $os")
60+
inputs.files(project.fileTree(cinteropCLib) { exclude("bazel-*/**", "out/**") })
61+
outputs.files(outFile)
5462

55-
targets.filterIsInstance<KotlinNativeTarget>().forEach {
56-
it.compilations.getByName("main") {
63+
dependsOn(checkBazel)
64+
}
65+
66+
// cinterop klib build config
67+
compilations.getByName("main") {
5768
cinterops {
5869
configureCinterop(cinteropCLib)
5970
}
6071

6172
cinterops.all {
6273
val interop = this
6374

64-
val interopTask = "cinterop${interop.name.capitalized()}${it.targetName.capitalized()}"
75+
val interopTask = "cinterop${interop.name.capitalized()}${this@configureEach.targetName.capitalized()}"
6576
project.tasks.named(interopTask, CInteropProcess::class) {
6677
dependsOn(buildCinteropCLib)
6778
}
6879
}
6980
}
7081
}
7182
}
83+
84+
/**
85+
* Returns the Bazel platform name for the given [KotlinNativeTarget].
86+
*
87+
* For Apple targets, compare the following two lists:
88+
* - https://kotlinlang.org/docs/native-target-support.html
89+
* - https://github.com/bazelbuild/apple_support/blob/master/configs/platforms.bzl
90+
*/
91+
private val KotlinNativeTarget.bazelPlatformName: String
92+
get() {
93+
val appleSupport = "@build_bazel_apple_support//platforms"
94+
return when (konanTarget) {
95+
KonanTarget.MACOS_ARM64 -> "$appleSupport:macos_arm64"
96+
KonanTarget.MACOS_X64 -> "$appleSupport:macos_x86_64"
97+
KonanTarget.IOS_ARM64 -> "$appleSupport:ios_arm64"
98+
KonanTarget.IOS_SIMULATOR_ARM64 -> "$appleSupport:ios_sim_arm64"
99+
KonanTarget.IOS_X64 -> "$appleSupport:ios_x86_64"
100+
KonanTarget.WATCHOS_ARM32 -> "$appleSupport:watchos_armv7k"
101+
// WATCHOS_ARM64 is the "older" arm64_32 target, not arm64 (which is WATCH_DEVICE_ARM64)
102+
KonanTarget.WATCHOS_ARM64 -> "$appleSupport:watchos_arm64_32"
103+
KonanTarget.WATCHOS_DEVICE_ARM64 -> "$appleSupport:watchos_device_arm64"
104+
KonanTarget.WATCHOS_SIMULATOR_ARM64 -> "$appleSupport:watchos_arm64"
105+
KonanTarget.WATCHOS_X64 -> "$appleSupport:watchos_x86_64"
106+
KonanTarget.TVOS_ARM64 -> "$appleSupport:tvos_arm64"
107+
KonanTarget.TVOS_SIMULATOR_ARM64 -> "$appleSupport:tvos_sim_arm64"
108+
KonanTarget.TVOS_X64 -> "$appleSupport:tvos_x86_64"
109+
KonanTarget.LINUX_ARM32_HFP -> TODO()
110+
KonanTarget.LINUX_ARM64 -> TODO()
111+
KonanTarget.LINUX_X64 -> TODO()
112+
KonanTarget.ANDROID_ARM32 -> TODO()
113+
KonanTarget.ANDROID_ARM64 -> TODO()
114+
KonanTarget.ANDROID_X64 -> TODO()
115+
KonanTarget.ANDROID_X86 -> TODO()
116+
KonanTarget.MINGW_X64 -> TODO()
117+
}
118+
}
119+
120+
private val KotlinNativeTarget.bazelOsName
121+
get() = when (konanTarget.family) {
122+
Family.OSX -> "macos"
123+
Family.IOS -> "ios"
124+
Family.TVOS -> "tvos"
125+
Family.WATCHOS -> "watchos"
126+
else -> TODO()
127+
}

grpc/grpc-core/src/nativeInterop/cinterop/libkgrpc.def

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ strictEnums = grpc_status_code grpc_connectivity_state grpc_call_error
1111

1212
staticLibraries.macos_arm64 = libkgrpc_static.macos_arm64.a
1313
staticLibraries.ios_arm64 = libkgrpc_static.ios_arm64.a
14-
staticLibraries.ios_simulator_arm64 = libkgrpc_static.ios_sim_arm64.a
15-
staticLibraries.ios_simulator_x64 = libkgrpc_static.ios_sim_x64.a
14+
staticLibraries.ios_simulator_arm64 = libkgrpc_static.ios_simulator_arm64.a
15+
staticLibraries.ios_simulator_x64 = libkgrpc_static.ios_simulator_x64.a
1616
# TODO: Uncomment when activating WatchOS
17-
# staticLibraries.watchos_arm64 = libkgrpc_static.watchos_arm64_32.a
18-
# staticLibraries.watchos_simulator_arm64 = libkgrpc_static.watchos_sim_arm64.a
17+
# staticLibraries.watchos_arm64 = libkgrpc_static.watchos_arm64.a
18+
# staticLibraries.watchos_simulator_arm64 = libkgrpc_static.watchos_simulator_arm64.a

protobuf/protobuf-core/src/nativeInterop/cinterop/libprotowire.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ noStringConversion = pw_encoder_write_string
66

77
staticLibraries.macos_arm64 = libprotowire_static.macos_arm64.a
88
staticLibraries.ios_arm64 = libprotowire_static.ios_arm64.a
9-
staticLibraries.ios_simulator_arm64 = libprotowire_static.ios_sim_arm64.a
10-
staticLibraries.ios_simulator_x64 = libprotowire_static.ios_sim_x64.a
9+
staticLibraries.ios_simulator_arm64 = libprotowire_static.ios_simulator_arm64.a
10+
staticLibraries.ios_simulator_x64 = libprotowire_static.ios_simulator_x64.a
1111
# TODO: Uncomment when activating WatchOS
1212
# staticLibraries.watchos_arm64 = libprotowire_static.watchos_arm64_32.a
1313
# staticLibraries.watchos_simulator_arm64 = libprotowire_static.watchos_sim_arm64.a

versions-root/libs.versions.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ kover = "0.9.1"
3030
develocity = "3.19.2"
3131
common-custom-user-data = "2.3"
3232
compat-patrouille = "0.0.1"
33-
grpc = "1.73.0"
33+
grpc = "1.74.0"
3434
grpc-kotlin = "1.4.1"
3535
protobuf = "4.31.1"
3636
protobuf-gradle = "0.9.5"
@@ -62,7 +62,7 @@ serialization-plugin = { module = "org.jetbrains.kotlin:kotlin-serialization-com
6262
serialization-plugin-forIde = { module = "org.jetbrains.kotlin:kotlinx-serialization-compiler-plugin-for-ide", version.ref = "kotlin-compiler" }
6363
kotlinx-browser = { module = "org.jetbrains.kotlinx:kotlinx-browser", version.ref = "kotlinx-browser" }
6464
kotlinx-io-core = { module = "org.jetbrains.kotlinx:kotlinx-io-core", version.ref = "kotlinx-io" }
65-
kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinx-collections"}
65+
kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinx-collections" }
6666

6767
# serialization
6868
serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "serialization" }
@@ -128,7 +128,7 @@ kotlin-js-wrappers = { module = "org.jetbrains.kotlin-wrappers:kotlin-js", versi
128128
intellij-util = { module = "com.jetbrains.intellij.platform:util", version.ref = "intellij" }
129129
atomicfu = { module = "org.jetbrains.kotlinx:atomicfu", version.ref = "atomicfu" }
130130
develocity = { module = "com.gradle:develocity-gradle-plugin", version.ref = "develocity" }
131-
common-custom-user-data = { module ="com.gradle:common-custom-user-data-gradle-plugin", version.ref = "common-custom-user-data" }
131+
common-custom-user-data = { module = "com.gradle:common-custom-user-data-gradle-plugin", version.ref = "common-custom-user-data" }
132132

133133
# gradle plugins as lib deps
134134
detekt-gradle-plugin = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt-gradle-plugin" }

0 commit comments

Comments
 (0)