summaryrefslogtreecommitdiff
path: root/kotlin/internal/toolchains.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'kotlin/internal/toolchains.bzl')
-rw-r--r--kotlin/internal/toolchains.bzl200
1 files changed, 200 insertions, 0 deletions
diff --git a/kotlin/internal/toolchains.bzl b/kotlin/internal/toolchains.bzl
new file mode 100644
index 0000000..01e07bf
--- /dev/null
+++ b/kotlin/internal/toolchains.bzl
@@ -0,0 +1,200 @@
+# Copyright 2018 The Bazel Authors. 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.
+
+load("//kotlin/internal/common:common.bzl", _common="common")
+load("//kotlin/internal:defs.bzl", _TOOLCHAIN_TYPE="TOOLCHAIN_TYPE", _KT_COMPILER_REPO="KT_COMPILER_REPO")
+
+"""Kotlin Toolchains
+
+This file contains macros for defining and registering specific toolchains.
+
+### Examples
+
+To override a tool chain use the appropriate macro in a `BUILD` file to declare the toolchain:
+
+```bzl
+load("@io_bazel_rules_kotlin//kotlin:toolchains.bzl", "define_kt_toolchain")
+
+define_kt_toolchain(
+ name= "custom_toolchain",
+ api_version = "1.1",
+ language_version = "1.1",
+)
+```
+and then register it in the `WORKSPACE`:
+```bzl
+register_toolchains("//:custom_toolchain")
+```
+"""
+
+
+
+# The toolchain rules are not made private, at least the jvm ones so that they may be introspected in Intelij.
+_common_attrs = {
+ "kotlin_home": attr.label(
+ default = Label("@" + _KT_COMPILER_REPO + "//:home"),
+ allow_files = True,
+ ),
+ "kotlinbuilder": attr.label(
+ default = Label("//kotlin/builder"),
+ executable = True,
+ allow_files = True,
+ cfg = "host",
+ ),
+ "language_version": attr.string(
+ default = "1.2",
+ values = [
+ "1.1",
+ "1.2",
+ ],
+ ),
+ "api_version": attr.string(
+ default = "1.2",
+ values = [
+ "1.1",
+ "1.2",
+ ],
+ ),
+ "debug": attr.string_list(
+ allow_empty=True,
+ doc="""Debugging tags passed to the builder. Two tags are supported. `timings` will cause the builder to print
+timing information. `trace` will cause the builder to print tracing messages. These tags can be enabled via the default
+toolchain via the defines `kt_timings=1` and `kt_trace=1`. The tags may also be picked up via the `tags` attribute
+defined directly on the rules."""
+ ),
+ "coroutines": attr.string(
+ default = "enable",
+ values = [
+ "enable",
+ "warn",
+ "error",
+ ],
+ ),
+}
+
+_kt_jvm_attrs = dict(_common_attrs.items() + {
+ "jvm_runtime": attr.label(
+ default = Label("@" + _KT_COMPILER_REPO + "//:kotlin-runtime"),
+ providers = [JavaInfo],
+ cfg = "target",
+ ),
+ "jvm_stdlibs": attr.label_list(
+ default = [
+ Label("@" + _KT_COMPILER_REPO + "//:kotlin-stdlib"),
+ Label("@" + _KT_COMPILER_REPO + "//:kotlin-stdlib-jdk7"),
+ Label("@" + _KT_COMPILER_REPO + "//:kotlin-stdlib-jdk8"),
+ ],
+ providers = [JavaInfo],
+ cfg = "target",
+ ),
+ "jvm_target": attr.string(
+ default = "1.8",
+ values = [
+ "1.6",
+ "1.8",
+ ],
+ ),
+}.items())
+
+def _kotlin_toolchain_impl(ctx):
+ toolchain = dict(
+ label = _common.restore_label(ctx.label),
+ language_version = ctx.attr.language_version,
+ api_version = ctx.attr.api_version,
+ coroutines = ctx.attr.coroutines,
+ debug = ctx.attr.debug,
+
+ jvm_target = ctx.attr.jvm_target,
+
+ kotlinbuilder = ctx.attr.kotlinbuilder,
+ kotlin_home = ctx.files.kotlin_home,
+
+ jvm_stdlibs = java_common.create_provider(
+ compile_time_jars = ctx.files.jvm_stdlibs,
+ runtime_jars = ctx.files.jvm_runtime,
+ use_ijar = False,
+ ),
+ )
+ return [
+ platform_common.ToolchainInfo(**toolchain)
+ ]
+
+kt_toolchain = rule(
+ attrs = _kt_jvm_attrs,
+ implementation = _kotlin_toolchain_impl,
+ provides = [platform_common.ToolchainInfo],
+)
+
+"""The kotlin jvm toolchain
+Args:
+ language_version: the -languag_version flag [see](https://kotlinlang.org/docs/reference/compatibility.html).
+ api_version: the -api_version flag [see](https://kotlinlang.org/docs/reference/compatibility.html).
+ jvm_target: the -jvm_target flag.
+ coroutines: the -Xcoroutines flag, enabled by default as it's considered production ready 1.2.0 onward.
+"""
+
+def kt_register_toolchains():
+ """This macro registers all of the default toolchains."""
+ native.register_toolchains("@io_bazel_rules_kotlin//kotlin/internal:default_toolchain")
+
+def define_kt_toolchain(
+ name,
+ language_version=None,
+ api_version=None,
+ jvm_target=None,
+ coroutines=None,
+ debug=[]
+):
+ """Define a Kotlin JVM Toolchain, the name is used in the `toolchain` rule so can be used to register the toolchain
+ in the WORKSPACE file.
+ """
+ impl_name = name + "_impl"
+ kt_toolchain(
+ name = impl_name,
+ language_version = language_version,
+ api_version = api_version,
+ jvm_target = jvm_target,
+ coroutines = coroutines,
+ debug = debug,
+ visibility = ["//visibility:public"]
+ )
+ native.toolchain(
+ name = name,
+ toolchain_type = _TOOLCHAIN_TYPE,
+ toolchain = impl_name,
+ visibility = ["//visibility:public"]
+ )
+
+def _kt_toolchain_ide_info_impl(ctx):
+ tc=ctx.toolchains[_TOOLCHAIN_TYPE]
+ info = struct(
+ label = tc.label,
+ common = struct(
+ language_version = tc.language_version,
+ api_version = tc.api_version,
+ coroutines = tc.coroutines
+ ),
+ jvm = struct(
+ jvm_target = tc.jvm_target,
+ )
+ )
+ ctx.actions.write(ctx.outputs.ide_info, info.to_json())
+ return [DefaultInfo(files=depset([ctx.outputs.ide_info]))]
+
+kt_toolchain_ide_info = rule(
+ outputs = {"ide_info": "kt_toolchain_ide_info.json"},
+ toolchains = [_TOOLCHAIN_TYPE],
+ implementation = _kt_toolchain_ide_info_impl,
+)
+