blob: 03e587aabd74d69336b08a935fdf74bf73258a40 [file] [log] [blame]
# Copyright 2022 Google LLC. All rights reserved.
#
# 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.
"""Kotlin toolchain."""
load("//:visibility.bzl", "RULES_DEFS_THAT_COMPILE_KOTLIN")
load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load("//bazel:stubs.bzl", "select_java_language_level")
load(":kotlinc_flags.bzl", "kotlinc_flags")
# Work around to toolchains in Google3.
# buildifier: disable=provider-params
KtJvmToolchainInfo = provider()
KT_VERSION = "v1_9_20"
# TODO: Remove this alias. Why are we letting people read this?
KT_LANG_VERSION = kotlinc_flags.KT_LANG_VERSION
# Kotlin JVM toolchain type label
_TYPE = Label("//toolchains/kotlin_jvm:kt_jvm_toolchain_type")
def _opt_for_test(val, getter):
return getter(val) if val else None
def _kt_jvm_toolchain_impl(ctx):
profiling_filter = ctx.attr.profiling_filter[BuildSettingInfo].value
kotlinc_define_flags = kotlinc_flags.read_define_flags(ctx)
kt_jvm_toolchain = dict(
# go/keep-sorted start
android_java8_apis_desugared = ctx.attr.android_java8_apis_desugared,
android_lint_config = ctx.file.android_lint_config,
android_lint_runner = ctx.attr.android_lint_runner[DefaultInfo].files_to_run,
build_marker = ctx.file.build_marker,
coverage_instrumenter = ctx.attr.coverage_instrumenter[DefaultInfo].files_to_run,
coverage_runtime = _opt_for_test(ctx.attr.coverage_runtime, lambda x: x[JavaInfo]),
genclass = ctx.file.genclass,
header_gen_tool = _opt_for_test(ctx.attr.header_gen_tool, lambda x: x[DefaultInfo].files_to_run),
is_profiling_enabled = lambda label: profiling_filter and (profiling_filter in str(label)),
java_language_version = ctx.attr.java_language_version,
java_runtime = ctx.attr.java_runtime,
jvm_abi_gen_plugin = ctx.file.jvm_abi_gen_plugin,
kotlin_compiler = ctx.attr.kotlin_compiler[DefaultInfo].files_to_run,
kotlin_language_version = ctx.attr.kotlin_language_version,
kotlin_libs = [x[JavaInfo] for x in ctx.attr.kotlin_libs],
kotlin_sdk_libraries = ctx.attr.kotlin_sdk_libraries,
kotlinc_cli_flags = ctx.attr.kotlinc_cli_flags + kotlinc_define_flags,
kotlinc_ide_flags = ctx.attr.kotlinc_ide_flags + kotlinc_define_flags,
proguard_whitelister = ctx.attr.proguard_whitelister[DefaultInfo].files_to_run,
source_jar_zipper = ctx.file.source_jar_zipper,
toolchain_type = None if ctx.attr.toolchain_type == None else str(ctx.attr.toolchain_type.label),
# go/keep-sorted end
)
return [
platform_common.ToolchainInfo(**kt_jvm_toolchain),
KtJvmToolchainInfo(**kt_jvm_toolchain),
]
kt_jvm_toolchain = rule(
attrs = dict(
android_java8_apis_desugared = attr.bool(
# Reflects a select in build rules.
doc = "Whether Java 8 API desugaring is enabled",
mandatory = True,
),
android_lint_config = attr.label(
cfg = "exec",
allow_single_file = [".xml"],
),
android_lint_runner = attr.label(
default = "//bazel:stub_tool",
executable = True,
cfg = "exec",
),
build_marker = attr.label(
default = "//tools:build_marker",
allow_single_file = [".jar"],
),
coverage_instrumenter = attr.label(
default = "//tools/coverage:offline_instrument",
cfg = "exec",
executable = True,
),
coverage_runtime = attr.label(
default = "@maven//:org_jacoco_org_jacoco_agent",
),
genclass = attr.label(
default = "@bazel_tools//tools/jdk:GenClass_deploy.jar",
cfg = "exec",
allow_single_file = True,
),
header_gen_tool = attr.label(
executable = True,
allow_single_file = True,
cfg = "exec",
),
java_language_version = attr.string(
default = "11",
),
java_runtime = attr.label(
default = "@bazel_tools//tools/jdk:current_java_runtime",
cfg = "exec",
allow_files = True,
),
jvm_abi_gen_plugin = attr.label(
default = "@kotlinc//:jvm_abi_gen_plugin",
cfg = "exec",
allow_single_file = [".jar"],
),
kotlin_compiler = attr.label(
default = "@kotlinc//:kotlin_compiler",
cfg = "exec",
executable = True,
),
kotlin_language_version = attr.string(
default = KT_LANG_VERSION,
),
kotlin_libs = attr.label_list(
doc = "The libraries required during all Kotlin builds.",
default = [
"@kotlinc//:kotlin_stdlib",
"@kotlinc//:annotations",
],
cfg = "target",
),
kotlin_sdk_libraries = attr.label_list(
doc = "The libraries required to resolve Kotlin code in an IDE.",
default = [
"@kotlinc//:kotlin_reflect",
"@kotlinc//:kotlin_stdlib",
"@kotlinc//:kotlin_test_not_testonly",
],
cfg = "target",
),
kotlinc_cli_flags = attr.string_list(
doc = "The static flags to pass to CLI kotlinc invocations",
default = kotlinc_flags.CLI_FLAGS,
),
kotlinc_ide_flags = attr.string_list(
doc = "The static flags to pass to IDE kotlinc invocations",
default = kotlinc_flags.IDE_FLAGS,
),
profiling_filter = attr.label(
default = "//toolchains/kotlin_jvm:profiling_filter",
providers = [BuildSettingInfo],
),
proguard_whitelister = attr.label(
default = "@bazel_tools//tools/jdk:proguard_whitelister",
cfg = "exec",
),
runtime = attr.label_list(
# This attribute has a "magic" name recognized by the native DexArchiveAspect
# (b/78647825). Must list all implicit runtime deps here, this is not limited
# to Kotlin runtime libs.
default = [
"@kotlinc//:kotlin_stdlib",
"@kotlinc//:annotations",
],
cfg = "target",
doc = "The Kotlin runtime libraries grouped into one attribute.",
),
source_jar_zipper = attr.label(
default = "//tools/bin:source_jar_zipper_binary",
cfg = "exec",
allow_single_file = [".jar"],
),
toolchain_type = attr.label(),
),
provides = [platform_common.ToolchainInfo],
implementation = _kt_jvm_toolchain_impl,
)
def _declare(
toolchain_type = _TYPE,
**kwargs):
kt_jvm_toolchain(
android_java8_apis_desugared = select({
"//conditions:default": False,
}),
# The JVM bytecode version to output
# https://kotlinlang.org/docs/compiler-reference.html#jvm-target-version
toolchain_type = toolchain_type,
**kwargs
)
_ATTRS = dict(
_toolchain = attr.label(
# TODO: Delete this attr when fixed.
doc = "Magic attribute name for DexArchiveAspect (b/78647825)",
default = "//toolchains/kotlin_jvm:kt_jvm_toolchain_linux_sts_jdk",
),
)
kt_jvm_toolchains = struct(
name = _TYPE.name,
get = lambda ctx: ctx.toolchains[_TYPE],
type = str(_TYPE),
declare = _declare,
attrs = _ATTRS,
)