Skip to content

Commit 85924ce

Browse files
committed
Toolchainize //scala:toolchain_type
Moves the `toolchain` targets for `//scala:toolchain_type` to a new `@io_bazel_rules_scala_toolchains` repository as a step towards Bzlmodification. Part of #1482. Instantiating toolchains in their own repository enables module extensions to define the the repositories required by those toolchains within the extension's own namespace. Bzlmod users can then register the toolchains from this repository without having to import all the toolchains' dependencies into their own namespace via `use_repo()`. --- The `scala_toolchains_repo()` macro wraps the underlying repository rule and assigns it the standard name `io_bazel_rules_scala_toolchains`. Right now it's only instantiating the main Scala toolchain via the default `scala = True` parameter. Future changes will expand this macro and repository rule with more boolean parameters to instantiate other toolchains, specifically: - `scalatest` - `junit` - `specs2` - `twitter_scrooge` - `jmh` - `scala_proto` and `scala_proto_enable_all_options` - `testing` (includes all of `scalatest`, `junit`, and `specs2`) - `scalafmt` --- `WORKSPACE` users will now have to import and call the `scala_toolchains_repo()` macro to instantiate `@io_bazel_rules_scala_toolchains`. ```py load("@io_bazel_rules_scala//:scala_config.bzl", "scala_config") scala_config() load( "//scala:scala.bzl", "rules_scala_setup", "rules_scala_toolchain_deps_repositories", "scala_toolchains_repo", ) rules_scala_setup() rules_scala_toolchain_deps_repositories() scala_toolchains_repo() register_toolchains("@io_bazel_rules_scala_toolchains//...:all") ``` This is what the corresponding `MODULE.bazel` setup would look like: ```py module(name = "rules_scala", version = "7.0.0") scala_config = use_extension( "//scala/extensions:config.bzl", "scala_config" ) scala_config.settings(scala_version = "2.13.14") scala_deps = use_extension("//scala/extensions:deps.bzl", "scala_deps") scala_deps.toolchains() ``` The `register_toolchains()` call in `WORKSPACE` isn't strictly required at this point, but is recommended. However, all the `WORKSPACE` files in this repo already register their required toolchains using existing macros, which have been updated in this change. In fact, calling `register_toolchains()` right after `scala_toolchains_repo()` as shown above breaks two tests that depend on the existing `WORKSPACE` toolchain registration: - `test_compilation_fails_with_plus_one_deps_undefined` from `test/shell/test_compilation.sh` depends on `scala_register_unused_deps_toolchains()` setting up its toolchain to resolve first. `//scala:unused_dependency_checker_error_toolchain` sets the `scala_toolchain()` parameters `dependency_tracking_method = "ast-plus"` and `unused_dependency_checker_mode = "error"`, and the `@io_bazel_rules_scala_toolchains//scala` toolchains don't. - `test_scala_binary_allows_opt_in_to_use_of_argument_file_in_runner_for_improved_performance` from `test/shell/test_scala_binary.sh` depends on the `use_argument_file_in_runner` parameter of `scala_toolchain` being `False`. This is the default, but the `@io_bazel_rules_scala_toolchains//scala` toolchains explicitly set this to `True` instead. In the Bzlmod case, the `register_toolchains()` call isn't necessary at all. This is because `@io_bazel_rules_scala_toolchains` includes one package per set of toolchains, and the rules_scala `MODULE.bazel` calls `register_toolchains("@io_bazel_rules_scala_toolchains//...:all")`. This will automatically register all configured rules_scala toolchains, while allowing users to override any of them using `register_toolchains()` in their own `MODULE.bazel` files. Technically, the `scala_deps.toolchains()` call isn't required when only using the default `scala = True` parameter; the rules_scala `MODULE.bazel` will instantiate this automatically, too.
1 parent 9bbdc8a commit 85924ce

File tree

24 files changed

+202
-98
lines changed

24 files changed

+202
-98
lines changed

WORKSPACE

+8-1
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,19 @@ load("@io_bazel_rules_scala//:scala_config.bzl", "scala_config")
3939

4040
scala_config(enable_compiler_dependency_tracking = True)
4141

42-
load("//scala:scala.bzl", "rules_scala_setup", "rules_scala_toolchain_deps_repositories")
42+
load(
43+
"//scala:scala.bzl",
44+
"rules_scala_setup",
45+
"rules_scala_toolchain_deps_repositories",
46+
"scala_toolchains_repo",
47+
)
4348

4449
rules_scala_setup()
4550

4651
rules_scala_toolchain_deps_repositories(fetch_sources = True)
4752

53+
scala_toolchains_repo()
54+
4855
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
4956

5057
rules_proto_dependencies()

dt_patches/test_dt_patches/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ load(
3535
"@io_bazel_rules_scala//scala:scala.bzl",
3636
"rules_scala_setup",
3737
"rules_scala_toolchain_deps_repositories",
38+
"scala_toolchains_repo",
3839
)
3940
load(
4041
"@io_bazel_rules_scala//scala:scala_cross_version.bzl",
@@ -74,6 +75,8 @@ rules_scala_toolchain_deps_repositories(
7475
validate_scala_version = False,
7576
)
7677

78+
scala_toolchains_repo()
79+
7780
register_toolchains(":dt_scala_toolchain")
7881

7982
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")

dt_patches/test_dt_patches_user_srcjar/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ load(
3535
"@io_bazel_rules_scala//scala:scala.bzl",
3636
"rules_scala_setup",
3737
"rules_scala_toolchain_deps_repositories",
38+
"scala_toolchains_repo",
3839
)
3940
load(
4041
"@io_bazel_rules_scala//scala:scala_cross_version.bzl",
@@ -123,6 +124,8 @@ rules_scala_toolchain_deps_repositories(
123124
validate_scala_version = False,
124125
)
125126

127+
scala_toolchains_repo()
128+
126129
register_toolchains(":dt_scala_toolchain")
127130

128131
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")

examples/crossbuild/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,15 @@ load(
4242
"@io_bazel_rules_scala//scala:scala.bzl",
4343
"rules_scala_setup",
4444
"rules_scala_toolchain_deps_repositories",
45+
"scala_toolchains_repo",
4546
)
4647

4748
rules_scala_setup()
4849

4950
rules_scala_toolchain_deps_repositories()
5051

52+
scala_toolchains_repo()
53+
5154
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
5255

5356
rules_proto_dependencies()

examples/scala3/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ load(
3535
"@io_bazel_rules_scala//scala:scala.bzl",
3636
"rules_scala_setup",
3737
"rules_scala_toolchain_deps_repositories",
38+
"scala_toolchains_repo",
3839
)
3940

4041
rules_scala_setup()
4142

4243
rules_scala_toolchain_deps_repositories(fetch_sources = True)
4344

45+
scala_toolchains_repo()
46+
4447
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
4548

4649
rules_proto_dependencies()

examples/semanticdb/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,15 @@ load(
3838
"@io_bazel_rules_scala//scala:scala.bzl",
3939
"rules_scala_setup",
4040
"rules_scala_toolchain_deps_repositories",
41+
"scala_toolchains_repo",
4142
)
4243

4344
rules_scala_setup()
4445

4546
rules_scala_toolchain_deps_repositories(fetch_sources = True)
4647

48+
scala_toolchains_repo()
49+
4750
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
4851

4952
rules_proto_dependencies()

examples/testing/multi_frameworks_toolchain/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ load(
3535
"@io_bazel_rules_scala//scala:scala.bzl",
3636
"rules_scala_setup",
3737
"rules_scala_toolchain_deps_repositories",
38+
"scala_toolchains_repo",
3839
)
3940

4041
rules_scala_setup()
4142

4243
rules_scala_toolchain_deps_repositories(fetch_sources = True)
4344

45+
scala_toolchains_repo()
46+
4447
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
4548

4649
rules_proto_dependencies()

examples/testing/scalatest_repositories/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ load(
3535
"@io_bazel_rules_scala//scala:scala.bzl",
3636
"rules_scala_setup",
3737
"rules_scala_toolchain_deps_repositories",
38+
"scala_toolchains_repo",
3839
)
3940

4041
rules_scala_setup()
4142

4243
rules_scala_toolchain_deps_repositories(fetch_sources = True)
4344

45+
scala_toolchains_repo()
46+
4447
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
4548

4649
rules_proto_dependencies()

examples/testing/specs2_junit_repositories/WORKSPACE

+3
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,15 @@ load(
3535
"@io_bazel_rules_scala//scala:scala.bzl",
3636
"rules_scala_setup",
3737
"rules_scala_toolchain_deps_repositories",
38+
"scala_toolchains_repo",
3839
)
3940

4041
rules_scala_setup()
4142

4243
rules_scala_toolchain_deps_repositories(fetch_sources = True)
4344

45+
scala_toolchains_repo()
46+
4447
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")
4548

4649
rules_proto_dependencies()

scala/BUILD

+24-60
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,49 @@
1-
load("@rules_java//java:defs.bzl", "java_import", "java_library")
2-
load("//scala:providers.bzl", "declare_deps_provider")
31
load("//scala:scala_cross_version.bzl", "version_suffix")
4-
load("//scala/private:macros/setup_scala_toolchain.bzl", "default_deps", "setup_scala_toolchain")
5-
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION", "SCALA_VERSIONS")
2+
load("//scala:scala_toolchain.bzl", "scala_toolchain")
3+
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION")
4+
load("@rules_java//java:defs.bzl", "java_import", "java_library")
65

76
toolchain_type(
87
name = "toolchain_type",
98
visibility = ["//visibility:public"],
109
)
1110

12-
[
13-
setup_scala_toolchain(
14-
name = "toolchain" + version_suffix(scala_version),
15-
scala_version = scala_version,
16-
use_argument_file_in_runner = True,
17-
)
18-
for scala_version in SCALA_VERSIONS
19-
]
20-
2111
# Alias for backward compatibility
2212
alias(
2313
name = "default_toolchain",
24-
actual = "toolchain" + version_suffix(SCALA_VERSION),
14+
actual = (
15+
"@io_bazel_rules_scala_toolchains//scala:toolchain" +
16+
version_suffix(SCALA_VERSION)
17+
),
2518
)
2619

27-
setup_scala_toolchain(
28-
name = "unused_dependency_checker_error_toolchain",
20+
scala_toolchain(
21+
name = "unused_dependency_checker_error_toolchain_impl",
2922
dependency_tracking_method = "ast-plus",
3023
unused_dependency_checker_mode = "error",
3124
)
3225

33-
setup_scala_toolchain(
34-
name = "minimal_direct_source_deps",
26+
scala_toolchain(
27+
name = "minimal_direct_source_deps_impl",
3528
dependency_mode = "plus-one",
3629
dependency_tracking_method = "ast",
3730
strict_deps_mode = "error",
3831
unused_dependency_checker_mode = "error",
3932
)
4033

34+
[
35+
toolchain(
36+
name = tc,
37+
toolchain = tc + "_impl",
38+
toolchain_type = "//scala:toolchain_type",
39+
visibility = ["//visibility:public"],
40+
)
41+
for tc in [
42+
"unused_dependency_checker_error_toolchain",
43+
"minimal_direct_source_deps",
44+
]
45+
]
46+
4147
java_import(
4248
name = "bazel_test_runner_deploy",
4349
jars = ["@bazel_tools//tools/jdk:TestRunner_deploy.jar"],
@@ -49,45 +55,3 @@ java_library(
4955
srcs = ["PlaceHolderClassToCreateEmptyJarForScalaImport.java"],
5056
visibility = ["//visibility:public"],
5157
)
52-
53-
declare_deps_provider(
54-
name = "scala_compile_classpath_provider",
55-
deps_id = "scala_compile_classpath",
56-
visibility = ["//visibility:public"],
57-
deps = default_deps("scala_compile_classpath", SCALA_VERSION),
58-
)
59-
60-
declare_deps_provider(
61-
name = "scala_library_classpath_provider",
62-
deps_id = "scala_library_classpath",
63-
visibility = ["//visibility:public"],
64-
deps = default_deps("scala_library_classpath", SCALA_VERSION),
65-
)
66-
67-
declare_deps_provider(
68-
name = "scala_macro_classpath_provider",
69-
deps_id = "scala_macro_classpath",
70-
visibility = ["//visibility:public"],
71-
deps = default_deps("scala_macro_classpath", SCALA_VERSION),
72-
)
73-
74-
declare_deps_provider(
75-
name = "scala_xml_provider",
76-
deps_id = "scala_xml",
77-
visibility = ["//visibility:public"],
78-
deps = default_deps("scala_xml", SCALA_VERSION),
79-
)
80-
81-
declare_deps_provider(
82-
name = "parser_combinators_provider",
83-
deps_id = "parser_combinators",
84-
visibility = ["//visibility:public"],
85-
deps = default_deps("parser_combinators", SCALA_VERSION),
86-
)
87-
88-
declare_deps_provider(
89-
name = "semanticdb_provider",
90-
deps_id = "semanticdb",
91-
visibility = ["//visibility:public"],
92-
deps = default_deps("semanticdb", SCALA_VERSION),
93-
)

scala/private/extensions/BUILD

Whitespace-only changes.
+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""Creates a repo containing Scala toolchain packages"""
2+
3+
def _scala_toolchains_repo_impl(repository_ctx):
4+
repo_attr = repository_ctx.attr
5+
format_args = {
6+
"rules_scala_repo": Label("//:all").repo_name,
7+
}
8+
toolchains = {}
9+
10+
if repo_attr.scala:
11+
toolchains["scala"] = _SCALA_TOOLCHAIN_BUILD
12+
13+
if len(toolchains) == 0:
14+
fail("no toolchains specified")
15+
16+
for pkg, build in toolchains.items():
17+
repository_ctx.file(
18+
pkg + "/BUILD",
19+
content = build.format(**format_args),
20+
executable = False,
21+
)
22+
23+
_scala_toolchains_repo = repository_rule(
24+
implementation = _scala_toolchains_repo_impl,
25+
attrs = {
26+
"scala": attr.bool(default = True),
27+
},
28+
)
29+
30+
def scala_toolchains_repo(**kwargs):
31+
_scala_toolchains_repo(
32+
name = "io_bazel_rules_scala_toolchains",
33+
**kwargs
34+
)
35+
36+
_SCALA_TOOLCHAIN_BUILD = """
37+
load(
38+
"@@{rules_scala_repo}//scala/private:macros/setup_scala_toolchain.bzl",
39+
"default_deps",
40+
"setup_scala_toolchain",
41+
)
42+
load("@@{rules_scala_repo}//scala:providers.bzl", "declare_deps_provider")
43+
load("@@{rules_scala_repo}//scala:scala_cross_version.bzl", "version_suffix")
44+
load(
45+
"@io_bazel_rules_scala_config//:config.bzl",
46+
"SCALA_VERSION",
47+
"SCALA_VERSIONS",
48+
)
49+
50+
[
51+
setup_scala_toolchain(
52+
name = "toolchain" + version_suffix(scala_version),
53+
scala_version = scala_version,
54+
use_argument_file_in_runner = True,
55+
)
56+
for scala_version in SCALA_VERSIONS
57+
]
58+
59+
[
60+
declare_deps_provider(
61+
name = deps_id + "_provider",
62+
deps_id = deps_id,
63+
visibility = ["//visibility:public"],
64+
deps = default_deps(deps_id, SCALA_VERSION),
65+
)
66+
for deps_id in [
67+
"scala_xml",
68+
"parser_combinators",
69+
"scala_compile_classpath",
70+
"scala_library_classpath",
71+
"scala_macro_classpath",
72+
"semanticdb",
73+
]
74+
]
75+
"""

scala/private/macros/setup_scala_toolchain.bzl

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
load("//scala:scala_toolchain.bzl", "scala_toolchain")
22
load("//scala:providers.bzl", "declare_deps_provider")
3-
load("//scala:scala_cross_version.bzl", "version_suffix")
3+
load("//scala:scala_cross_version.bzl", "repositories", "version_suffix")
44
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION")
55

66
def setup_scala_toolchain(
@@ -97,7 +97,7 @@ def setup_scala_toolchain(
9797
native.toolchain(
9898
name = name,
9999
toolchain = ":%s_impl" % name,
100-
toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type",
100+
toolchain_type = Label("//scala:toolchain_type"),
101101
target_settings = ["@io_bazel_rules_scala_config//:scala_version" + version_suffix(scala_version)],
102102
visibility = visibility,
103103
)
@@ -155,4 +155,4 @@ _DEFAULT_DEPS = {
155155
def default_deps(deps_id, scala_version):
156156
versions = _DEFAULT_DEPS[deps_id]
157157
deps = versions.get("any", []) + versions.get(scala_version[0], [])
158-
return [dep + version_suffix(scala_version) for dep in deps]
158+
return repositories(scala_version, deps)

0 commit comments

Comments
 (0)