Skip to content

Commit 7c5126f

Browse files
Allow transitioning scala version with scala_version attribute of rules (#1569)
Co-authored-by: mkuta <mkuta@virtuslab.com>
1 parent 8158717 commit 7c5126f

File tree

7 files changed

+84
-0
lines changed

7 files changed

+84
-0
lines changed

cross-compilation-doc.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,45 @@ scala_library(
117117
```
118118

119119

120+
## Requesting specific version
121+
To use other than default version of Scala, you need to change the current `@io_bazel_rules_scala_config//:scala_version` build setting.
122+
123+
Simple transition, setting the Scala version to one found in `scala_version` attribute:
124+
```starlark
125+
def _scala_version_transition_impl(settings, attr):
126+
if attr.scala_version:
127+
return {"@io_bazel_rules_scala_config//:scala_version": attr.scala_version}
128+
else:
129+
return {}
130+
131+
scala_version_transition = transition(
132+
implementation = _scala_version_transition_impl,
133+
inputs = [],
134+
outputs = ["@io_bazel_rules_scala_config//:scala_version"],
135+
)
136+
```
137+
138+
To use it in a rule, use the `scala_version_transition` as `cfg` and use `toolchain_transition_attr` in `attrs`:
139+
```starlark
140+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "scala_version_transition", "toolchain_transition_attr")
141+
142+
_scala_library_attrs.update(toolchain_transition_attr)
143+
144+
def make_scala_library(*extras):
145+
return rule(
146+
attrs = _dicts.add(
147+
...
148+
toolchain_transition_attr,
149+
...
150+
),
151+
...
152+
cfg = scala_version_transition,
153+
incompatible_use_toolchain_transition = True,
154+
...
155+
)
156+
```
157+
158+
120159
## Toolchains
121160
Standard [toolchain resolution](https://bazel.build/extending/toolchains#toolchain-resolution) procedure determines which toolchain to use for Scala targets.
122161

scala/private/rules/scala_binary.bzl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ load(
99
"resolve_deps",
1010
)
1111
load("@io_bazel_rules_scala//scala/private:common_outputs.bzl", "common_outputs")
12+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "scala_version_transition", "toolchain_transition_attr")
1213
load(
1314
"@io_bazel_rules_scala//scala/private:phases/phases.bzl",
1415
"extras_phases",
@@ -70,6 +71,8 @@ _scala_binary_attrs.update(common_attrs)
7071

7172
_scala_binary_attrs.update(resolve_deps)
7273

74+
_scala_binary_attrs.update(toolchain_transition_attr)
75+
7376
def make_scala_binary(*extras):
7477
return rule(
7578
attrs = _dicts.add(
@@ -87,6 +90,7 @@ def make_scala_binary(*extras):
8790
"@io_bazel_rules_scala//scala:toolchain_type",
8891
"@bazel_tools//tools/jdk:toolchain_type",
8992
],
93+
cfg = scala_version_transition,
9094
incompatible_use_toolchain_transition = True,
9195
implementation = _scala_binary_impl,
9296
)

scala/private/rules/scala_junit_test.bzl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ load(
88
"launcher_template",
99
)
1010
load("@io_bazel_rules_scala//scala/private:common_outputs.bzl", "common_outputs")
11+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "scala_version_transition", "toolchain_transition_attr")
1112
load(
1213
"@io_bazel_rules_scala//scala/private:phases/phases.bzl",
1314
"extras_phases",
@@ -123,6 +124,8 @@ _scala_junit_test_attrs.update({
123124
"tests_from": attr.label_list(providers = [[JavaInfo]]),
124125
})
125126

127+
_scala_junit_test_attrs.update(toolchain_transition_attr)
128+
126129
def make_scala_junit_test(*extras):
127130
return rule(
128131
attrs = _dicts.add(
@@ -140,6 +143,7 @@ def make_scala_junit_test(*extras):
140143
"@io_bazel_rules_scala//scala:toolchain_type",
141144
"@bazel_tools//tools/jdk:toolchain_type",
142145
],
146+
cfg = scala_version_transition,
143147
incompatible_use_toolchain_transition = True,
144148
implementation = _scala_junit_test_impl,
145149
)

scala/private/rules/scala_library.bzl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ load(
1515
"@io_bazel_rules_scala//scala/private:coverage_replacements_provider.bzl",
1616
_coverage_replacements_provider = "coverage_replacements_provider",
1717
)
18+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "scala_version_transition", "toolchain_transition_attr")
1819
load(
1920
"@io_bazel_rules_scala//scala/private:phases/phases.bzl",
2021
"extras_phases",
@@ -87,6 +88,8 @@ _scala_library_attrs.update(_library_attrs)
8788

8889
_scala_library_attrs.update(resolve_deps)
8990

91+
_scala_library_attrs.update(toolchain_transition_attr)
92+
9093
def make_scala_library(*extras):
9194
return rule(
9295
attrs = _dicts.add(
@@ -103,6 +106,7 @@ def make_scala_library(*extras):
103106
"@io_bazel_rules_scala//scala:toolchain_type",
104107
"@bazel_tools//tools/jdk:toolchain_type",
105108
],
109+
cfg = scala_version_transition,
106110
incompatible_use_toolchain_transition = True,
107111
implementation = _scala_library_impl,
108112
)
@@ -185,6 +189,8 @@ _scala_library_for_plugin_bootstrapping_attrs.update(
185189
common_attrs_for_plugin_bootstrapping,
186190
)
187191

192+
_scala_library_for_plugin_bootstrapping_attrs.update(toolchain_transition_attr)
193+
188194
def make_scala_library_for_plugin_bootstrapping(*extras):
189195
return rule(
190196
attrs = _dicts.add(
@@ -201,6 +207,7 @@ def make_scala_library_for_plugin_bootstrapping(*extras):
201207
"@io_bazel_rules_scala//scala:toolchain_type",
202208
"@bazel_tools//tools/jdk:toolchain_type",
203209
],
210+
cfg = scala_version_transition,
204211
incompatible_use_toolchain_transition = True,
205212
implementation = _scala_library_for_plugin_bootstrapping_impl,
206213
)
@@ -245,6 +252,8 @@ _scala_macro_library_attrs.update(_library_attrs)
245252

246253
_scala_macro_library_attrs.update(resolve_deps)
247254

255+
_scala_macro_library_attrs.update(toolchain_transition_attr)
256+
248257
# Set unused_dependency_checker_mode default to off for scala_macro_library
249258
_scala_macro_library_attrs["unused_dependency_checker_mode"] = attr.string(
250259
default = "off",
@@ -273,6 +282,7 @@ def make_scala_macro_library(*extras):
273282
"@io_bazel_rules_scala//scala:toolchain_type",
274283
"@bazel_tools//tools/jdk:toolchain_type",
275284
],
285+
cfg = scala_version_transition,
276286
incompatible_use_toolchain_transition = True,
277287
implementation = _scala_macro_library_impl,
278288
)

scala/private/rules/scala_repl.bzl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ load(
99
"resolve_deps",
1010
)
1111
load("@io_bazel_rules_scala//scala/private:common_outputs.bzl", "common_outputs")
12+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "scala_version_transition", "toolchain_transition_attr")
1213
load(
1314
"@io_bazel_rules_scala//scala/private:phases/phases.bzl",
1415
"extras_phases",
@@ -65,6 +66,8 @@ _scala_repl_attrs.update(common_attrs)
6566

6667
_scala_repl_attrs.update(resolve_deps)
6768

69+
_scala_repl_attrs.update(toolchain_transition_attr)
70+
6871
def make_scala_repl(*extras):
6972
return rule(
7073
attrs = _dicts.add(
@@ -79,6 +82,7 @@ def make_scala_repl(*extras):
7982
*[extra["outputs"] for extra in extras if "outputs" in extra]
8083
),
8184
toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"],
85+
cfg = scala_version_transition,
8286
incompatible_use_toolchain_transition = True,
8387
implementation = _scala_repl_impl,
8488
)

scala/private/rules/scala_test.bzl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ load(
99
)
1010
load("@io_bazel_rules_scala//scala/private:common.bzl", "sanitize_string_for_usage")
1111
load("@io_bazel_rules_scala//scala/private:common_outputs.bzl", "common_outputs")
12+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "scala_version_transition", "toolchain_transition_attr")
1213
load(
1314
"@io_bazel_rules_scala//scala/private:phases/phases.bzl",
1415
"extras_phases",
@@ -108,6 +109,8 @@ _scala_test_attrs.update(common_attrs)
108109

109110
_scala_test_attrs.update(_test_resolve_deps)
110111

112+
_scala_test_attrs.update(toolchain_transition_attr)
113+
111114
def make_scala_test(*extras):
112115
return rule(
113116
attrs = _dicts.add(
@@ -126,6 +129,7 @@ def make_scala_test(*extras):
126129
"@io_bazel_rules_scala//scala:toolchain_type",
127130
"@bazel_tools//tools/jdk:toolchain_type",
128131
],
132+
cfg = scala_version_transition,
129133
incompatible_use_toolchain_transition = True,
130134
implementation = _scala_test_impl,
131135
)

scala/scala_cross_version.bzl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,22 @@ def sanitize_version(scala_version):
5151

5252
def version_suffix(scala_version):
5353
return "_" + sanitize_version(scala_version)
54+
55+
def _scala_version_transition_impl(settings, attr):
56+
if attr.scala_version:
57+
return {"@io_bazel_rules_scala_config//:scala_version": attr.scala_version}
58+
else:
59+
return {}
60+
61+
scala_version_transition = transition(
62+
implementation = _scala_version_transition_impl,
63+
inputs = [],
64+
outputs = ["@io_bazel_rules_scala_config//:scala_version"],
65+
)
66+
67+
toolchain_transition_attr = {
68+
"scala_version": attr.string(),
69+
"_allowlist_function_transition": attr.label(
70+
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
71+
),
72+
}

0 commit comments

Comments
 (0)