Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 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
3 changes: 3 additions & 0 deletions .bazel/.default.bazelrc
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ common --persistent_multiplex_android_tools
common --strategy=AARGenerator=worker
common --strategy=DatabindingStubs=worker
common --modify_execution_info=GenerateDataBindingBaseClasses=+supports-multiplex-workers=1
# TODO: KSP doesn't seem to work in a parallel environment, so we need to use sandboxed strategy. https://github.com/google/ksp/issues/427#issuecomment-1140076577
common --strategy=KotlinKsp=sandboxed

## Java Workers
common --strategy=KotlinCompile=worker
common --strategy=Javac=worker
Expand Down
15 changes: 14 additions & 1 deletion BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
load("@dagger//:workspace_defs.bzl", "dagger_rules")
load("@grab_bazel_common//toolchains:toolchains.bzl", "configure_common_toolchains")
load("@grab_bazel_common//tools/parcelize:parcelize.bzl", "parcelize_rules")
load("@io_bazel_rules_kotlin//kotlin:core.bzl", "define_kt_toolchain", "kt_javac_options", "kt_kotlinc_options")
load("@io_bazel_rules_kotlin//kotlin:core.bzl", "define_kt_toolchain", "kt_javac_options", "kt_kotlinc_options", "kt_ksp_plugin")

kt_kotlinc_options(
name = "kt_kotlinc_options",
Expand All @@ -28,6 +28,19 @@ dagger_rules()

parcelize_rules()

kt_ksp_plugin(
name = "moshi-kotlin-codegen-ksp",
generates_java = False,
processor_class = "com.squareup.moshi.kotlin.codegen.ksp.JsonClassSymbolProcessorProvider",
target_embedded_compiler = False,
visibility = [
"//visibility:public",
],
deps = [
"@ksp_maven//:com_squareup_moshi_moshi_kotlin_codegen",
],
)

configure_common_toolchains()

exports_files(["lint.xml"])
34 changes: 28 additions & 6 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

http_archive(
name = "io_bazel_rules_kotlin",
sha256 = "34e8c0351764b71d78f76c8746e98063979ce08dcf1a91666f3f3bc2949a533d",
url = "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.9.5/rules_kotlin-v1.9.5.tar.gz",
sha256 = "3b772976fec7bdcda1d84b9d39b176589424c047eb2175bed09aac630e50af43",
url = "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.9.6/rules_kotlin-v1.9.6.tar.gz",
)

KOTLIN_VERSION = "1.9.25"

KOTLINC_RELEASE_SHA = "6ab72d6144e71cbbc380b770c2ad380972548c63ab6ed4c79f11c88f2967332e"

KSP_VERSION = "1.8.10-1.0.9"
KSP_VERSION = "1.9.25-1.0.20"

KSP_COMPILER_RELEASE_SHA = "2f60c27956e4033c4c94355624e3fe88f255df42d8b67af44c1f2cdcbd513a13"
KSP_COMPILER_RELEASE_SHA = "3a2d24623409ac5904c87a7e130f5b39ce9fd67ca8b44e4fe5b784a6ec102b81"

load("@io_bazel_rules_kotlin//kotlin:repositories.bzl", "kotlin_repositories", "kotlinc_version", "ksp_version")

Expand All @@ -39,7 +39,7 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

git_repository(
name = "grab_bazel_common",
commit = "d17b05487ec15d1959dd8592757f4bc88741bf3e",
commit = "8cfb7bcb84f6d9631b01bb14c25644030ad2ecf8",
remote = "https://github.com/grab/grab-bazel-common.git",
)

Expand Down Expand Up @@ -223,6 +223,26 @@ load("@debug_maven//:defs.bzl", debug_maven_pinned_maven_install = "pinned_maven

debug_maven_pinned_maven_install()

maven_install(
name = "ksp_maven",
artifacts = [
"com.squareup.moshi:moshi-kotlin-codegen:1.15.0",
],
excluded_artifacts = ["androidx.test.espresso:espresso-contrib"],
fail_if_repin_required = False,
fail_on_missing_checksum = False,
maven_install_json = "//:ksp_maven_install.json",
repositories = [
"https://repo.maven.apache.org/maven2/",
],
resolve_timeout = 1000,
version_conflict_policy = "pinned",
)

load("@ksp_maven//:defs.bzl", ksp_maven_pinned_maven_install = "pinned_maven_install")

ksp_maven_pinned_maven_install()

maven_install(
name = "lint_maven",
artifacts = [
Expand Down Expand Up @@ -403,6 +423,8 @@ maven_install(
"com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
"com.google.j2objc:j2objc-annotations:2.8",
"com.jakewharton.timber:timber:5.0.1",
"com.squareup.moshi:moshi:1.15.0",
"com.squareup.okio:okio:2.10.0",
"com.squareup:javawriter:2.1.1",
"commons-io:commons-io:2.13.0",
"javax.inject:javax.inject:1",
Expand Down Expand Up @@ -440,7 +462,6 @@ maven_install(
"android.arch.lifecycle:livedata-core",
"android.arch.lifecycle:runtime",
"android.arch.lifecycle:viewmodel",
"androidx.fragment:fragment",
"com.android.databinding:baseLibrary",
"com.android.databinding:library",
"com.android.support.test.espresso:espresso-core",
Expand All @@ -460,6 +481,7 @@ maven_install(
"com.android.support:support-compat",
"com.android.support:support-core-ui",
"com.android.support:support-core-utils",
"com.android.support:support-fragment",
"com.android.support:support-vector-drawable",
"com.android.support:versionedparcelable",
"com.android.support:viewpager",
Expand Down
14 changes: 8 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ grazel {
rules {
bazelCommon {
gitRepository {
commit = "d17b05487ec15d1959dd8592757f4bc88741bf3e"
commit = "8cfb7bcb84f6d9631b01bb14c25644030ad2ecf8"
remote = "https://github.com/grab/grab-bazel-common.git"
}
toolchains {
Expand Down Expand Up @@ -122,16 +122,18 @@ grazel {
}
kotlin {
httpArchiveRepository {
url = "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.9.5/rules_kotlin-v1.9.5.tar.gz"
sha256 = "34e8c0351764b71d78f76c8746e98063979ce08dcf1a91666f3f3bc2949a533d"
url = "https://github.com/bazelbuild/rules_kotlin/releases/download/v1.9.6/rules_kotlin-v1.9.6.tar.gz"
sha256 = "3b772976fec7bdcda1d84b9d39b176589424c047eb2175bed09aac630e50af43"
}
compiler {
tag = "1.9.25"
sha = "6ab72d6144e71cbbc380b770c2ad380972548c63ab6ed4c79f11c88f2967332e"
}
kspCompiler {
tag = "1.8.10-1.0.9"
sha = "2f60c27956e4033c4c94355624e3fe88f255df42d8b67af44c1f2cdcbd513a13"
ksp {
compiler {
tag = "1.9.25-1.0.20"
sha = "3a2d24623409ac5904c87a7e130f5b39ce9fd67ca8b44e4fe5b784a6ec102b81"
}
}
toolchain {
enabled = true
Expand Down
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ timber = "5.0.1"
auto-service = "1.1.1"
truth = "1.1.3"
ksp = "1.9.25-1.0.20"
moshi = "1.15.0"

[libraries]
android-gradle-plugin = { module = "com.android.tools.build:gradle", version.ref = "android-gradle-plugin" }
Expand Down Expand Up @@ -80,6 +81,8 @@ sceneform-ux = { module = "com.google.ar.sceneform.ux:sceneform-ux", version.ref
slack-lint-checks = { module = "com.slack.lint:slack-lint-checks", version.ref = "slack-lint-checks" }
timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }
auto-service = { module = "com.google.auto.service:auto-service", version.ref = "auto-service" }
moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" }
moshi-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" }

[plugins]
android-application = { id = "com.android.application", version.ref = "android-gradle-plugin" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ internal fun StatementsBuilder.androidBinary(
resourceSets: Assignee? = null,
resValuesData: ResValuesData,
deps: List<BazelDependency>,
plugins: List<BazelDependency> = emptyList(),
assetsGlob: List<String> = emptyList(),
assetsDir: String? = null,
buildConfigData: BuildConfigData,
Expand Down Expand Up @@ -178,6 +179,9 @@ internal fun StatementsBuilder.androidBinary(
deps.notEmpty {
"deps" `=` array(deps.map(BazelDependency::toString).quote)
}
plugins.notEmpty {
"plugins" `=` array(plugins.map(BazelDependency::toString).map(String::quote))
}
assetsDir?.let {
"assets" `=` glob(assetsGlob.quote)
"assets_dir" `=` assetsDir.quote
Expand Down Expand Up @@ -210,6 +214,7 @@ internal fun StatementsBuilder.androidLibrary(
enableDataBinding: Boolean = false,
enableCompose: Boolean = false,
deps: List<BazelDependency>,
plugins: List<BazelDependency> = emptyList(),
tags: List<String> = emptyList(),
assetsGlob: List<String> = emptyList(),
assetsDir: String? = null,
Expand All @@ -236,6 +241,9 @@ internal fun StatementsBuilder.androidLibrary(
deps.notEmpty {
"deps" `=` array(deps.map(BazelDependency::toString).map(String::quote))
}
plugins.notEmpty {
"plugins" `=` array(plugins.map(BazelDependency::toString).map(String::quote))
}
if (enableDataBinding) {
"enable_data_binding" `=` enableDataBinding.toString().capitalize()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
/*
* Copyright 2022 Grabtaxi Holdings PTE LTD (GRAB)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.grab.grazel.bazel.rules

import com.grab.grazel.bazel.starlark.BazelDependency
import com.grab.grazel.bazel.starlark.StatementsBuilder
import com.grab.grazel.bazel.starlark.array
import com.grab.grazel.bazel.starlark.load
import com.grab.grazel.bazel.starlark.quote

/**
* Data holder for KSP processor dependencies.
*
* @param group Maven group ID
* @param name Maven artifact name
* @param version Maven version
* @param processorClass Fully-qualified class name of the KSP processor provider
* @param generatesJava Whether this processor generates Java code
* @param targetEmbeddedCompiler Whether to use embedded Kotlin compiler
*/
data class KspProcessor(
val group: String,
val name: String,
val version: String?,
val processorClass: String = "",
val generatesJava: Boolean = false,
val targetEmbeddedCompiler: Boolean = false
) : Comparable<KspProcessor> {
/** Maven coordinate in format `group:name` */
val shortId get() = "$group:$name"

/** Maven coordinate in format `group:name:version` */
val id get() = "$group:$name:${version ?: ""}"

override fun compareTo(other: KspProcessor) = shortId.compareTo(other.shortId)
}

/**
* Generates the target name for a KSP plugin rule.
* Converts maven coordinates to a valid Bazel target name.
* Example: "com.squareup.moshi:moshi-kotlin-codegen" -> "moshi-kotlin-codegen-ksp"
*/
fun kspTargetName(processor: KspProcessor): String {
return "${processor.name}-ksp"
}

/**
* Creates a BazelDependency reference to a KSP plugin target in root BUILD.bazel.
* Example: //:room-compiler-ksp
*/
fun kspPluginTarget(processor: KspProcessor): BazelDependency =
BazelDependency.StringDependency("//:" + kspTargetName(processor))

/**
* Converts a KSP processor to its maven label format.
* Example: "@ksp_maven//:androidx_room_room_compiler"
*/
private fun KspProcessor.toMavenLabel(): String {
val groupPart = group.replace(".", "_").replace("-", "_")
val namePart = name.replace(".", "_").replace("-", "_")
return "@ksp_maven//:${groupPart}_$namePart"
}

/**
* Generates `kt_ksp_plugin` rules in root BUILD.bazel for all KSP processors.
* These consolidated targets can be referenced by modules using KSP.
*
* Example output:
* ```starlark
* load("@io_bazel_rules_kotlin//kotlin:core.bzl", "kt_ksp_plugin")
*
* kt_ksp_plugin(
* name = "dagger-compiler-ksp",
* deps = ["@maven//:com_google_dagger_dagger_compiler"],
* processor_class = "dagger.internal.codegen.KspComponentProcessor$Provider",
* generates_java = True,
* visibility = ["//visibility:public"],
* )
* ```
*/
fun StatementsBuilder.kspPluginRules(kspProcessors: Set<KspProcessor>) {
if (kspProcessors.isEmpty()) return

load("@io_bazel_rules_kotlin//kotlin:core.bzl", "kt_ksp_plugin")

kspProcessors.forEach { processor ->
rule("kt_ksp_plugin") {
"name" `=` kspTargetName(processor).quote
"deps" `=` array(listOf(processor.toMavenLabel()).map(String::quote))
"processor_class" `=` processor.processorClass.quote
"generates_java" `=` processor.generatesJava.toString().replaceFirstChar { it.titlecase() }
"target_embedded_compiler" `=` processor.targetEmbeddedCompiler.toString().replaceFirstChar { it.titlecase() }
"visibility" `=` array(listOf("//visibility:public".quote))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ import org.gradle.api.Project
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.configurationcache.extensions.serviceOf
import org.gradle.internal.logging.progress.ProgressLoggerFactory
import org.gradle.kotlin.dsl.support.serviceOf
import org.gradle.process.ExecOperations
import org.gradle.workers.WorkerExecutor

Expand Down
Loading
Loading