Skip to content

Commit 11a2dd5

Browse files
authored
Simplify setup of scala_toolchain and its deps (#1439)
* Add setup_scala_toolchain marco to simplify setup of scala_toolchain and its deps * Add default providers back * Remove debug print * Use default dep providers for tools * Remove wrongly merged changes
1 parent 88ec960 commit 11a2dd5

File tree

5 files changed

+161
-145
lines changed

5 files changed

+161
-145
lines changed

README.md

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ load("@io_bazel_rules_scala//scala:scala.bzl", "rules_scala_setup", "rules_scala
6767
# loads other rules Rules Scala depends on
6868
rules_scala_setup()
6969

70-
# loads Maven deps like Scala compiler and standard libs, on production projects you should consider
70+
# Loads Maven deps like Scala compiler and standard libs. On production projects you should consider
7171
# defining a custom deps toolchains to use your project libs instead
7272
rules_scala_toolchain_deps_repositories(fetch_sources = True)
7373

@@ -88,7 +88,7 @@ This will load the `rules_scala` repository at the commit sha
8888
`rules_scala_version` into your Bazel project and register a [scala_toolchain](docs/scala_toolchain.md) at the default Scala version (2.12.14)
8989

9090
Then in your BUILD file just add the following so the rules will be available:
91-
```python
91+
```starlark
9292
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_library", "scala_binary", "scala_test")
9393
```
9494
You may wish to have these rules loaded by default using bazel's prelude. You can add the above to the file `tools/build_rules/prelude_bazel` in your repo (don't forget to have a, possibly empty, BUILD file there) and then it will be automatically prepended to every BUILD file in the workspace.
@@ -148,41 +148,14 @@ dependency providers configured for `2.11.12`, `2.12.14` and `2.13.6` versions.
148148
load("@io_bazel_rules_scala//:scala_config.bzl", "scala_config")
149149
scala_config(scala_version = "2.13.6")
150150

151-
load("@io_bazel_rules_scala//scala:scala.bzl", "scala_repositories")
152-
scala_repositories()
151+
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
152+
rules_proto_dependencies()
153+
rules_proto_toolchains()
153154

154155
load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_toolchains")
155156
scala_register_toolchains()
156157
```
157158

158-
If you're using any of the rules `twitter_scrooge`, `scala_proto_repositories`
159-
or `specs2_junit_repositories` you also need to specify `scala_version` for them. See `./test_version/WORKSPACE.template`
160-
for an example workspace using another scala version.
161-
162-
### As an option for `scala_repositories()`
163-
164-
It's also possible to override the scala artifacts while calling `scala_repositories()`:
165-
166-
```starlark
167-
scala_repositories(
168-
overriden_artifacts = {
169-
# Change both the artifact names and sha256s.
170-
"io_bazel_rules_scala_scala_library": {
171-
"artifact": "org.scala-lang:scala-library:2.12.14",
172-
"sha256": "0451dce8322903a6c2aa7d31232b54daa72a61ced8ade0b4c5022442a3f6cb57",
173-
},
174-
"io_bazel_rules_scala_scala_compiler": {
175-
"artifact": "org.scala-lang:scala-compiler:2.12.14",
176-
"sha256": "2a1b3fbf9c956073c8c5374098a6f987e3b8d76e34756ab985fc7d2ca37ee113",
177-
},
178-
"io_bazel_rules_scala_scala_reflect": {
179-
"artifact": "org.scala-lang:scala-reflect:2.12.14",
180-
"sha256": "497f4603e9d19dc4fa591cd467de5e32238d240bbd955d3dac6390b270889522",
181-
}
182-
}
183-
)
184-
```
185-
186159
Note: Toolchains are a more flexible way to configure dependencies, so you should prefer that way.
187160
Please also note, that the `overriden_artifacts` parameter is likely to be removed in the future.
188161

docs/scala_toolchain.md

Lines changed: 27 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
In your workspace file add the following lines:
1212

13-
```python
13+
```starlark
1414
# WORKSPACE
1515
# register default scala toolchain
1616
load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_toolchains")
@@ -20,71 +20,37 @@ scala_register_toolchains()
2020
#### B) Defining your own `scala_toolchain` requires 2 steps:
2121

2222
1. Add your own definition of `scala_toolchain` to a `BUILD` file:
23-
```python
23+
Example assumes external libraries are resolved with [rules_jvm_external](https://github.com/bazelbuild/rules_jvm_external)
24+
```starlark
2425
# //toolchains/BUILD
25-
load("@io_bazel_rules_scala//scala:scala_toolchain.bzl", "scala_toolchain")
26-
load("@io_bazel_rules_scala//scala:providers.bzl", "declare_deps_provider")
26+
load("//scala:scala.bzl", "setup_scala_toolchain")
2727

28-
scala_toolchain(
29-
name = "my_toolchain_impl",
30-
dep_providers = [
31-
":my_scala_compile_classpath_provider",
32-
":my_scala_library_classpath_provider",
33-
":my_scala_macro_classpath_provider",
34-
":my_scala_xml_provider",
35-
":my_parser_combinators_provider",
28+
setup_scala_toolchain(
29+
name = "my_toolchain",
30+
# configure toolchain dependecies
31+
parser_combinators_deps = [
32+
"@maven//:org_scala_lang_modules_scala_parser_combinators_2_12",
3633
],
37-
scalacopts = ["-Ywarn-unused"],
38-
unused_dependency_checker_mode = "off",
39-
visibility = ["//visibility:public"]
40-
)
41-
42-
toolchain(
43-
name = "my_scala_toolchain",
44-
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
45-
toolchain = "my_toolchain_impl",
46-
visibility = ["//visibility:public"]
47-
)
48-
49-
declare_deps_provider(
50-
name = "my_scala_compile_classpath_provider",
51-
deps_id = "scala_compile_classpath",
52-
visibility = ["//visibility:public"],
53-
deps = [
54-
"@io_bazel_rules_scala_scala_compiler",
55-
"@io_bazel_rules_scala_scala_library",
56-
"@io_bazel_rules_scala_scala_reflect",
34+
scala_compile_classpath = [
35+
"@maven//:org_scala_lang_scala_compiler",
36+
"@maven//:org_scala_lang_scala_library",
37+
"@maven//:org_scala_lang_scala_reflect",
5738
],
58-
)
59-
60-
declare_deps_provider(
61-
name = "my_scala_library_classpath_provider",
62-
deps_id = "scala_library_classpath",
63-
deps = [
64-
"@io_bazel_rules_scala_scala_library",
65-
"@io_bazel_rules_scala_scala_reflect",
39+
scala_library_classpath = [
40+
"@maven//:org_scala_lang_scala_library",
41+
"@maven//:org_scala_lang_scala_reflect",
6642
],
67-
)
68-
69-
declare_deps_provider(
70-
name = "my_scala_macro_classpath_provider",
71-
deps_id = "scala_macro_classpath",
72-
deps = [
73-
"@io_bazel_rules_scala_scala_library",
74-
"@io_bazel_rules_scala_scala_reflect",
43+
scala_macro_classpath = [
44+
"@maven//:org_scala_lang_scala_library",
45+
"@maven//:org_scala_lang_scala_reflect",
7546
],
76-
)
77-
78-
declare_deps_provider(
79-
name = "my_scala_xml_provider",
80-
deps_id = "scala_xml",
81-
deps = ["@scala_xml_dep"],
82-
)
83-
84-
declare_deps_provider(
85-
name = "my_parser_combinators_provider",
86-
deps_id = "parser_combinators",
87-
deps = ["@parser_combinators_dep"],
47+
scala_xml_deps = [
48+
"@maven//:org_scala_lang_modules_scala_xml_2_12",
49+
],
50+
# example of setting attribute values
51+
scalacopts = ["-Ywarn-unused"],
52+
unused_dependency_checker_mode = "off",
53+
visibility = ["//visibility:public"]
8854
)
8955
```
9056

@@ -111,7 +77,7 @@ scala_register_toolchains()
11177
<p><code>List of labels; optional</code></p>
11278
<p>
11379
Allows to configure dependencies lists by configuring <code>DepInfo</code> provider targets.
114-
Currently supported depset ids: <code>scala_compile_classpath</code>,
80+
Currently supported dep ids: <code>scala_compile_classpath</code>,
11581
<code>scala_library_classpath</code>, <code>scala_macro_classpath</code>, <code>scala_xml</code>,
11682
<code>parser_combinators</code>.
11783
</p>

scala/BUILD

Lines changed: 46 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,64 @@
11
load("@rules_java//java:defs.bzl", "java_import", "java_library")
2-
load("//scala:scala_toolchain.bzl", "scala_toolchain")
32
load("//scala:providers.bzl", "declare_deps_provider")
3+
load("//scala:scala.bzl", "setup_scala_toolchain")
44
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_MAJOR_VERSION")
55

66
toolchain_type(
77
name = "toolchain_type",
88
visibility = ["//visibility:public"],
99
)
1010

11-
scala_toolchain(
12-
name = "default_toolchain_impl",
13-
scalacopts = [],
14-
use_argument_file_in_runner = True,
15-
visibility = ["//visibility:public"],
16-
)
11+
_SCALA_COMPILE_CLASSPATH_DEPS = [
12+
"@io_bazel_rules_scala_scala_compiler",
13+
"@io_bazel_rules_scala_scala_library",
14+
] + (["@io_bazel_rules_scala_scala_reflect"] if SCALA_MAJOR_VERSION.startswith("2") else [
15+
"@io_bazel_rules_scala_scala_interfaces",
16+
"@io_bazel_rules_scala_scala_tasty_core",
17+
"@io_bazel_rules_scala_scala_asm",
18+
"@io_bazel_rules_scala_scala_library_2",
19+
])
1720

18-
toolchain(
19-
name = "default_toolchain",
20-
toolchain = ":default_toolchain_impl",
21-
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
22-
visibility = ["//visibility:public"],
23-
)
21+
_SCALA_LIBRARY_CLASSPATH_DEPS = [
22+
"@io_bazel_rules_scala_scala_library",
23+
] + (["@io_bazel_rules_scala_scala_reflect"] if SCALA_MAJOR_VERSION.startswith("2") else [
24+
"@io_bazel_rules_scala_scala_library_2",
25+
])
2426

25-
scala_toolchain(
26-
name = "unused_dependency_checker_error_toolchain_impl",
27-
unused_dependency_checker_mode = "error",
28-
visibility = ["//visibility:public"],
27+
_SCALA_MACRO_CLASSPATH_DEPS = [
28+
"@io_bazel_rules_scala_scala_library",
29+
] + (["@io_bazel_rules_scala_scala_reflect"] if SCALA_MAJOR_VERSION.startswith("2") else [
30+
"@io_bazel_rules_scala_scala_library_2",
31+
])
32+
33+
_PARSER_COMBINATORS_DEPS = ["@io_bazel_rules_scala_scala_parser_combinators"]
34+
35+
_SCALA_XML_DEPS = ["@io_bazel_rules_scala_scala_xml"]
36+
37+
setup_scala_toolchain(
38+
name = "default_toolchain",
39+
scala_compile_classpath = _SCALA_COMPILE_CLASSPATH_DEPS,
40+
scala_library_classpath = _SCALA_LIBRARY_CLASSPATH_DEPS,
41+
scala_macro_classpath = _SCALA_MACRO_CLASSPATH_DEPS,
42+
use_argument_file_in_runner = True,
2943
)
3044

31-
toolchain(
45+
setup_scala_toolchain(
3246
name = "unused_dependency_checker_error_toolchain",
33-
toolchain = ":unused_dependency_checker_error_toolchain_impl",
34-
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
35-
visibility = ["//visibility:public"],
47+
scala_compile_classpath = _SCALA_COMPILE_CLASSPATH_DEPS,
48+
scala_library_classpath = _SCALA_LIBRARY_CLASSPATH_DEPS,
49+
scala_macro_classpath = _SCALA_MACRO_CLASSPATH_DEPS,
50+
unused_dependency_checker_mode = "error",
3651
)
3752

38-
scala_toolchain(
39-
name = "ast_plus_one_deps_strict_deps_unused_deps_error_impl",
53+
setup_scala_toolchain(
54+
name = "minimal_direct_source_deps",
4055
dependency_mode = "plus-one",
4156
dependency_tracking_method = "ast",
57+
scala_compile_classpath = _SCALA_COMPILE_CLASSPATH_DEPS,
58+
scala_library_classpath = _SCALA_LIBRARY_CLASSPATH_DEPS,
59+
scala_macro_classpath = _SCALA_MACRO_CLASSPATH_DEPS,
4260
strict_deps_mode = "error",
4361
unused_dependency_checker_mode = "error",
44-
visibility = ["//visibility:public"],
45-
)
46-
47-
toolchain(
48-
name = "minimal_direct_source_deps",
49-
toolchain = "ast_plus_one_deps_strict_deps_unused_deps_error_impl",
50-
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
51-
visibility = ["//visibility:public"],
5262
)
5363

5464
java_import(
@@ -67,49 +77,33 @@ declare_deps_provider(
6777
name = "scala_compile_classpath_provider",
6878
deps_id = "scala_compile_classpath",
6979
visibility = ["//visibility:public"],
70-
deps = [
71-
"@io_bazel_rules_scala_scala_compiler",
72-
"@io_bazel_rules_scala_scala_library",
73-
] + (["@io_bazel_rules_scala_scala_reflect"] if SCALA_MAJOR_VERSION.startswith("2") else [
74-
"@io_bazel_rules_scala_scala_interfaces",
75-
"@io_bazel_rules_scala_scala_tasty_core",
76-
"@io_bazel_rules_scala_scala_asm",
77-
"@io_bazel_rules_scala_scala_library_2",
78-
]),
80+
deps = _SCALA_COMPILE_CLASSPATH_DEPS,
7981
)
8082

8183
declare_deps_provider(
8284
name = "scala_library_classpath_provider",
8385
deps_id = "scala_library_classpath",
8486
visibility = ["//visibility:public"],
85-
deps = [
86-
"@io_bazel_rules_scala_scala_library",
87-
] + (["@io_bazel_rules_scala_scala_reflect"] if SCALA_MAJOR_VERSION.startswith("2") else [
88-
"@io_bazel_rules_scala_scala_library_2",
89-
]),
87+
deps = _SCALA_LIBRARY_CLASSPATH_DEPS,
9088
)
9189

9290
declare_deps_provider(
9391
name = "scala_macro_classpath_provider",
9492
deps_id = "scala_macro_classpath",
9593
visibility = ["//visibility:public"],
96-
deps = [
97-
"@io_bazel_rules_scala_scala_library",
98-
] + (["@io_bazel_rules_scala_scala_reflect"] if SCALA_MAJOR_VERSION.startswith("2") else [
99-
"@io_bazel_rules_scala_scala_library_2",
100-
]),
94+
deps = _SCALA_MACRO_CLASSPATH_DEPS,
10195
)
10296

10397
declare_deps_provider(
10498
name = "scala_xml_provider",
10599
deps_id = "scala_xml",
106100
visibility = ["//visibility:public"],
107-
deps = ["@io_bazel_rules_scala_scala_xml"],
101+
deps = _SCALA_XML_DEPS,
108102
)
109103

110104
declare_deps_provider(
111105
name = "parser_combinators_provider",
112106
deps_id = "parser_combinators",
113107
visibility = ["//visibility:public"],
114-
deps = ["@io_bazel_rules_scala_scala_parser_combinators"],
108+
deps = _PARSER_COMBINATORS_DEPS,
115109
)

0 commit comments

Comments
 (0)