Skip to content

Commit 75a7d9f

Browse files
committed
Add scala_toolchains macro for WORKSPACE, Bzlmod
Extracted a single `scala_toolchains` macro to share between `WORKSPACE` and the `deps.bzl` module extension. This will make it easier to ensure `WORKSPACE` compatibility, and to add a Bazel module extension as a thin layer on top. Part of #1482. This change includes updates to `rules_scala_setup` and `scala_repositories` to support this, while preserving compatibility with existing `WORKSPACE` calls. The next commit will replace many existing `WORKSPACE` calls with `scala_toolchains`.
1 parent b756fe1 commit 75a7d9f

File tree

5 files changed

+123
-13
lines changed

5 files changed

+123
-13
lines changed

jmh/jmh.bzl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
load("//scala:scala.bzl", "scala_binary", "scala_library")
1+
load("//scala/private:rules/scala_binary.bzl", "scala_binary")
2+
load("//scala/private:rules/scala_library.bzl", "scala_library")
23
load(
34
"//scala:scala_cross_version.bzl",
45
"default_maven_server_urls",

scala/private/macros/scala_repositories.bzl

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
21
load(
3-
"@io_bazel_rules_scala//scala:scala_cross_version.bzl",
2+
"//scala:scala_cross_version.bzl",
43
"extract_major_version",
54
"extract_minor_version",
65
"version_suffix",
76
_default_maven_server_urls = "default_maven_server_urls",
87
)
98
load("//third_party/repositories:repositories.bzl", "repositories")
9+
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
1010
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSIONS")
1111

1212
def _dt_patched_compiler_impl(rctx):
@@ -24,7 +24,6 @@ dt_patched_compiler = repository_rule(
2424
},
2525
implementation = _dt_patched_compiler_impl,
2626
)
27-
2827
_COMPILER_SOURCE_ALIAS_TEMPLATE = """alias(
2928
name = "src",
3029
visibility = ["//visibility:public"],
@@ -69,15 +68,19 @@ def _validate_scalac_srcjar(srcjar):
6968
def dt_patched_compiler_setup(scala_version, scala_compiler_srcjar = None):
7069
scala_major_version = extract_major_version(scala_version)
7170
scala_minor_version = extract_minor_version(scala_version)
72-
patch = "@io_bazel_rules_scala//dt_patches:dt_compiler_%s.patch" % scala_major_version
71+
patch = Label("//dt_patches:dt_compiler_%s.patch" % scala_major_version)
7372

7473
minor_version = int(scala_minor_version)
7574

7675
if scala_major_version == "2.12":
7776
if minor_version >= 1 and minor_version <= 7:
78-
patch = "@io_bazel_rules_scala//dt_patches:dt_compiler_%s.1.patch" % scala_major_version
77+
patch = Label(
78+
"//dt_patches:dt_compiler_%s.1.patch" % scala_major_version,
79+
)
7980
elif minor_version <= 11:
80-
patch = "@io_bazel_rules_scala//dt_patches:dt_compiler_%s.8.patch" % scala_major_version
81+
patch = Label(
82+
"//dt_patches:dt_compiler_%s.8.patch" % scala_major_version,
83+
)
8184

8285
build_file_content = "\n".join([
8386
"package(default_visibility = [\"//visibility:public\"])",
@@ -112,7 +115,9 @@ def dt_patched_compiler_setup(scala_version, scala_compiler_srcjar = None):
112115
integrity = srcjar.get("integrity"),
113116
)
114117

115-
def rules_scala_setup(scala_compiler_srcjar = None):
118+
def rules_scala_setup(
119+
scala_compiler_srcjar = None,
120+
setup_compiler_sources = True):
116121
if not native.existing_rule("bazel_skylib"):
117122
http_archive(
118123
name = "bazel_skylib",
@@ -165,8 +170,26 @@ def rules_scala_setup(scala_compiler_srcjar = None):
165170
url = "https://github.com/bazelbuild/rules_proto/releases/download/6.0.2/rules_proto-6.0.2.tar.gz",
166171
)
167172

173+
if setup_compiler_sources:
174+
srcs = {version: scala_compiler_srcjar for version in SCALA_VERSIONS}
175+
_setup_scala_compiler_sources(srcs)
176+
177+
def _setup_scala_compiler_sources(srcjars = {}):
178+
"""Generates Scala compiler source repos used internally by rules_scala.
179+
180+
Args:
181+
srcjars: optional dictionary of Scala version string to compiler srcjar
182+
metadata dictionaries containing:
183+
- exactly one "label", "url", or "urls" key
184+
- optional "integrity" or "sha256" keys
185+
"""
168186
for scala_version in SCALA_VERSIONS:
169-
dt_patched_compiler_setup(scala_version, scala_compiler_srcjar)
187+
dt_patched_compiler_setup(scala_version, srcjars.get(scala_version))
188+
189+
compiler_sources_repo(
190+
name = "scala_compiler_sources",
191+
scala_versions = SCALA_VERSIONS,
192+
)
170193

171194
compiler_sources_repo(
172195
name = "scala_compiler_sources",
@@ -213,13 +236,19 @@ def scala_repositories(
213236
overriden_artifacts = {},
214237
load_dep_rules = True,
215238
load_jar_deps = True,
216-
fetch_sources = False):
239+
fetch_sources = False,
240+
validate_scala_version = True,
241+
scala_compiler_srcjars = {}):
217242
if load_dep_rules:
218-
rules_scala_setup()
243+
# When `WORKSPACE` goes away, so can this case.
244+
rules_scala_setup(setup_compiler_sources = False)
245+
246+
_setup_scala_compiler_sources(scala_compiler_srcjars)
219247

220248
if load_jar_deps:
221249
rules_scala_toolchain_deps_repositories(
222250
maven_servers,
223251
overriden_artifacts,
224252
fetch_sources,
253+
validate_scala_version,
225254
)

scala/private/macros/toolchains.bzl

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
"""Macro to instantiate @io_bazel_rules_scala_toolchains"""
2+
3+
load(":macros/toolchains_repo.bzl", "scala_toolchains_repo")
4+
load("//scala/private:macros/scala_repositories.bzl", "scala_repositories")
5+
load("//scala:scala_cross_version.bzl", "default_maven_server_urls")
6+
7+
def scala_toolchains(
8+
maven_servers = default_maven_server_urls(),
9+
overridden_artifacts = {},
10+
load_rules_scala_dependencies = True,
11+
load_scala_toolchain_dependencies = True,
12+
fetch_sources = False,
13+
validate_scala_version = True,
14+
scala_compiler_srcjars = {},
15+
scala = True):
16+
"""Instantiates @io_bazel_rules_scala_toolchains and all its dependencies.
17+
18+
Provides a unified interface to configuring rules_scala both directly in a
19+
`WORKSPACE` file and in a Bazel module extension.
20+
21+
Instantiates the `@io_bazel_rules_scala_toolchains` repository. Under
22+
`WORKSPACE`, you will need to call `register_toolchains` at some point.
23+
Under Bzlmod, rules_scala does this automatically.
24+
25+
```starlark
26+
register_toolchains("@io_bazel_rules_scala_toolchains//...:all")
27+
```
28+
29+
All arguments are optional.
30+
31+
Args:
32+
maven_servers: Maven servers used to fetch dependency jar files
33+
overridden_artifacts: specific dependency jar files to use instead of
34+
those from `maven_servers`, in the format:
35+
```starlark
36+
"repo_name": {
37+
"artifact": "<maven coordinates>",
38+
"sha256": "<checksum>",
39+
"deps": [
40+
"repository_names_of_dependencies",
41+
],
42+
}
43+
```
44+
load_rules_scala_dependencies: whether load rules_scala repository
45+
dependencies
46+
load_scala_toolchain_dependencies: whether to load repository
47+
dependencies of the core Scala language toolchain
48+
fetch_sources: whether to download dependency source jars
49+
validate_scala_version: whether to check if the configured Scala version
50+
matches the default version supported by rules_scala
51+
scala_compiler_srcjars: optional dictionary of Scala version string to
52+
compiler srcjar metadata dictionaries containing:
53+
- exactly one "label", "url", or "urls" key
54+
- optional "integrity" or "sha256" keys
55+
scala: whether to instantiate the core Scala toolchain
56+
"""
57+
num_toolchains = 0
58+
59+
if scala:
60+
num_toolchains += 1
61+
scala_repositories(
62+
maven_servers = maven_servers,
63+
# Note the internal macro parameter misspells "overriden".
64+
overriden_artifacts = overridden_artifacts,
65+
load_dep_rules = load_rules_scala_dependencies,
66+
load_jar_deps = load_scala_toolchain_dependencies,
67+
fetch_sources = fetch_sources,
68+
validate_scala_version = validate_scala_version,
69+
scala_compiler_srcjars = scala_compiler_srcjars,
70+
)
71+
72+
if num_toolchains != 0:
73+
scala_toolchains_repo(
74+
scala = scala,
75+
)

scala/private/extensions/toolchains.bzl renamed to scala/private/macros/toolchains_repo.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Creates a repo containing Scala toolchain packages"""
1+
"""Repository rule to instantiate @io_bazel_rules_scala_toolchains"""
22

33
def _scala_toolchains_repo_impl(repository_ctx):
44
repo_attr = repository_ctx.attr

scala/scala.bzl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ load(
33
_specs2_junit_dependencies = "specs2_junit_dependencies",
44
)
55
load(
6-
"//scala/private/extensions:toolchains.bzl",
6+
"//scala/private:macros/toolchains.bzl",
7+
_scala_toolchains = "scala_toolchains",
8+
)
9+
load(
10+
"//scala/private:macros/toolchains_repo.bzl",
711
_scala_toolchains_repo = "scala_toolchains_repo",
812
)
913
load(
@@ -85,4 +89,5 @@ scala_test = _scala_test
8589
scala_test_suite = _scala_test_suite
8690
setup_scala_testing_toolchain = _setup_scala_testing_toolchain
8791
setup_scala_toolchain = _setup_scala_toolchain
92+
scala_toolchains = _scala_toolchains
8893
scala_toolchains_repo = _scala_toolchains_repo

0 commit comments

Comments
 (0)