Skip to content

Commit 17892bf

Browse files
beala-stripejohnynek
authored andcommitted
Add scalac_jvm_flags option to toolchain (#803)
* Add scalac_jvm_flags to scala_toolchain This allows things like setting the max heap on all Scalac workers. * Add docs * Fix comment * Add enable_code_coverage_aspect to the docs * Flags on target should override flags on toolchain. Also fix comment.
1 parent 697e5f3 commit 17892bf

File tree

6 files changed

+126
-4
lines changed

6 files changed

+126
-4
lines changed

docs/scala_toolchain.md

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
`scala_toolchain` allows you to define global configuration to all Scala targets.
44

5-
Currently, the only option that can be set is `scalacopts` but the plan is to expand it to other options as well.
6-
75
**Some scala_toolchain must be registered!**
86

97
### Several options to configure `scala_toolchain`:
@@ -46,3 +44,57 @@ scala_register_toolchains()
4644
# WORKSPACE
4745
register_toolchains("//toolchains:my_scala_toolchain")
4846
```
47+
48+
<table class="table table-condensed table-bordered table-params">
49+
<colgroup>
50+
<col class="col-param" />
51+
<col class="param-description" />
52+
</colgroup>
53+
<thead>
54+
<tr>
55+
<th colspan="2">Attributes</th>
56+
</tr>
57+
</thead>
58+
<tbody>
59+
<tr>
60+
<td><code>scalacopts</code></td>
61+
<td>
62+
<p><code>List of strings; optional</code></p>
63+
<p>
64+
Extra compiler options for this binary to be passed to scalac.
65+
</p>
66+
<p>
67+
This is overridden by the `scalac_jvm_flags` attribute on individual targets.
68+
</p>
69+
</td>
70+
</tr>
71+
<tr>
72+
<td><code>scalac_jvm_flags</code></td>
73+
<td>
74+
<p><code>List of strings; optional</code></p>
75+
<p>
76+
List of JVM flags to be passed to scalac. For example <code>["-Xmx5G"]</code> could be passed to control memory usage of Scalac.
77+
</p>
78+
</td>
79+
</tr>
80+
<tr>
81+
<td><code>unused_dependency_checker_mode</code></td>
82+
<td>
83+
<p><code>String; optional</code></p>
84+
<p>
85+
Enable unused dependency checking (see <a href="https://github.com/bazelbuild/rules_scala#experimental-unused-dependency-checking">Unused dependency checking</a>).
86+
Possible values are: <code>off</code>, <code>warn</code> and <code>error</code>.
87+
</p>
88+
</td>
89+
</tr>
90+
<tr>
91+
<td><code>enable_code_coverage_aspect</code></td>
92+
<td>
93+
<p><code>"on" or "off"; optional; defaults to "off"</code></p>
94+
<p>
95+
This enables instrumenting tests with jacoco code coverage.
96+
</p>
97+
</td>
98+
</tr>
99+
</tbody>
100+
</table>

scala/private/rule_impls.bzl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,13 @@ StatsfileOutput: {statsfile_output}
294294
resource_jars + [manifest, argfile] + scalac_inputs
295295
)
296296

297+
# scalac_jvm_flags passed in on the target override scalac_jvm_flags passed in on the
298+
# toolchain
299+
if scalac_jvm_flags:
300+
final_scalac_jvm_flags = _expand_location(ctx, scalac_jvm_flags)
301+
else:
302+
final_scalac_jvm_flags = ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scalac_jvm_flags
303+
297304
ctx.actions.run(
298305
inputs = ins,
299306
outputs = outs,
@@ -312,7 +319,7 @@ StatsfileOutput: {statsfile_output}
312319
# consume the flags on startup.
313320
arguments = [
314321
"--jvm_flag=%s" % f
315-
for f in _expand_location(ctx, scalac_jvm_flags)
322+
for f in final_scalac_jvm_flags
316323
] + ["@" + argfile.path],
317324
)
318325

scala/scala_toolchain.bzl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def _scala_toolchain_impl(ctx):
1010
unused_dependency_checker_mode = ctx.attr.unused_dependency_checker_mode,
1111
plus_one_deps_mode = ctx.attr.plus_one_deps_mode,
1212
enable_code_coverage_aspect = ctx.attr.enable_code_coverage_aspect,
13+
scalac_jvm_flags = ctx.attr.scalac_jvm_flags,
1314
)
1415
return [toolchain]
1516

@@ -32,6 +33,7 @@ scala_toolchain = rule(
3233
"enable_code_coverage_aspect": attr.string(
3334
default = "off",
3435
values = ["off", "on"],
35-
)
36+
),
37+
"scalac_jvm_flags": attr.string_list(),
3638
},
3739
)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
load("//scala:scala_toolchain.bzl", "scala_toolchain")
2+
load("//scala:scala.bzl", "scala_library")
3+
4+
scala_toolchain(
5+
name = "failing_toolchain_impl",
6+
# This will fail because 1M isn't enough
7+
scalac_jvm_flags = ["-Xmx1M"],
8+
visibility = ["//visibility:public"],
9+
)
10+
11+
scala_toolchain(
12+
name = "passing_toolchain_impl",
13+
# This will pass because 1G is enough
14+
scalac_jvm_flags = ["-Xmx1G"],
15+
visibility = ["//visibility:public"],
16+
)
17+
18+
toolchain(
19+
name = "failing_scala_toolchain",
20+
toolchain = "failing_toolchain_impl",
21+
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
22+
visibility = ["//visibility:public"],
23+
)
24+
25+
toolchain(
26+
name = "passing_scala_toolchain",
27+
toolchain = "passing_toolchain_impl",
28+
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
29+
visibility = ["//visibility:public"],
30+
)
31+
32+
scala_library(
33+
name = "empty_build",
34+
srcs = ["Empty.scala"],
35+
)
36+
37+
scala_library(
38+
name = "empty_overriding_build",
39+
srcs = ["Empty.scala"],
40+
# This overrides the option passed in on the toolchain, and should BUILD, even if
41+
# the `failing_scala_toolchain` is used.
42+
scalac_jvm_flags = ["-Xmx1G"],
43+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package test_expect_failure.scalac_jvm_opts
2+
3+
class Empty

test_rules_scala.sh

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,18 @@ test_scalaopts_from_scala_toolchain() {
825825
action_should_fail build --extra_toolchains="//test_expect_failure/scalacopts_from_toolchain:failing_scala_toolchain" //test_expect_failure/scalacopts_from_toolchain:failing_build
826826
}
827827

828+
test_scalac_jvm_flags_from_scala_toolchain_fails() {
829+
action_should_fail build --extra_toolchains="//test_expect_failure/scalac_jvm_opts:failing_scala_toolchain" //test_expect_failure/scalac_jvm_opts:empty_build
830+
}
831+
832+
test_scalac_jvm_flags_from_scala_toolchain_passes() {
833+
bazel build --extra_toolchains="//test_expect_failure/scalac_jvm_opts:passing_scala_toolchain" //test_expect_failure/scalac_jvm_opts:empty_build
834+
}
835+
836+
test_scalac_jvm_flags_on_target_overrides_toolchain_passes() {
837+
bazel build --extra_toolchains="//test_expect_failure/scalac_jvm_opts:failing_scala_toolchain" //test_expect_failure/scalac_jvm_opts:empty_overriding_build
838+
}
839+
828840
test_unused_dependency_checker_mode_set_in_rule() {
829841
action_should_fail build //test_expect_failure/unused_dependency_checker:failing_build
830842
}
@@ -1104,3 +1116,6 @@ $runner bazel test //test/... --extra_toolchains="//test_expect_failure/plus_one
11041116
$runner test_unused_dependency_fails_even_if_also_exists_in_plus_one_deps
11051117
$runner test_coverage_on
11061118
$runner scala_pb_library_targets_do_not_have_host_deps
1119+
$runner test_scalac_jvm_flags_on_target_overrides_toolchain_passes
1120+
$runner test_scalac_jvm_flags_from_scala_toolchain_passes
1121+
$runner test_scalac_jvm_flags_from_scala_toolchain_fails

0 commit comments

Comments
 (0)