Skip to content

Commit 919471a

Browse files
committed
Declare scala version in a separate repository
Similar to what rules_java does with repote_java_repository Generated repository compiles scalac worker and exposes it as a toolchain together with scala dependencies Toolchains could be constrained with config_setting Pass simple case bazel build //test:HelloLib Could be part of scala_config which could take a list of structs to generate repositories Probably could be mapped in bzlmod with extensions and tag_class
1 parent 27bcfab commit 919471a

File tree

13 files changed

+230
-24
lines changed

13 files changed

+230
-24
lines changed

WORKSPACE

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,24 @@ rules_scala_setup()
3434

3535
rules_scala_toolchain_deps_repositories(fetch_sources = True)
3636

37+
load("//scala/runtime:repository.bzl", "scala_runtime")
38+
39+
scala_runtime(
40+
name = "scala_toolchain_2.12.18",
41+
compiler = "@io_bazel_rules_scala_scala_compiler",
42+
library = [
43+
"@io_bazel_rules_scala_scala_library",
44+
"@io_bazel_rules_scala_scala_reflect",
45+
],
46+
version = "2.12.18",
47+
)
48+
49+
register_toolchains("@scala_toolchain_2.12.18//:all")
50+
51+
load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_toolchains")
52+
53+
scala_register_toolchains()
54+
3755
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
3856

3957
# Declares @com_google_protobuf//:protoc pointing to released binary
@@ -97,9 +115,9 @@ local_repository(
97115
path = "third_party/test/example_external_workspace",
98116
)
99117

100-
load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_unused_deps_toolchains")
118+
#load("@io_bazel_rules_scala//scala:toolchains.bzl", "scala_register_unused_deps_toolchains")
101119

102-
scala_register_unused_deps_toolchains()
120+
#scala_register_unused_deps_toolchains()
103121

104122
register_toolchains("@io_bazel_rules_scala//test/proto:scalapb_toolchain")
105123

scala/private/common_attributes.bzl

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,6 @@ implicit_deps = {
8484
"_java_runtime": attr.label(
8585
default = Label("@bazel_tools//tools/jdk:current_java_runtime"),
8686
),
87-
"_scalac": attr.label(
88-
executable = True,
89-
cfg = "exec",
90-
default = Label("@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac"),
91-
allow_files = True,
92-
),
9387
"_exe": attr.label(
9488
executable = True,
9589
cfg = "exec",

scala/private/phases/phase_compile.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ def _compile_or_empty(
221221
ctx.attr.expect_java_output,
222222
ctx.attr.scalac_jvm_flags,
223223
scalacopts,
224-
ctx.executable._scalac,
224+
ctx.toolchains["@io_bazel_rules_scala//scala/runtime:toolchain_type"].compiler,
225225
dependency_info,
226226
unused_dependency_checker_ignored_targets,
227227
additional_outputs,

scala/private/phases/phase_scalac_provider.bzl

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,13 @@ load(
77
"@io_bazel_rules_scala//scala:providers.bzl",
88
_ScalacProvider = "ScalacProvider",
99
)
10-
load(
11-
"@io_bazel_rules_scala//scala/private/toolchain_deps:toolchain_deps.bzl",
12-
"find_deps_info_on",
13-
)
1410

1511
def phase_scalac_provider(ctx, p):
16-
toolchain_type_label = "@io_bazel_rules_scala//scala:toolchain_type"
12+
tc = ctx.toolchains["@io_bazel_rules_scala//scala/runtime:toolchain_type"]
1713

18-
library_classpath = find_deps_info_on(ctx, toolchain_type_label, "scala_library_classpath").deps
19-
compile_classpath = find_deps_info_on(ctx, toolchain_type_label, "scala_compile_classpath").deps
20-
macro_classpath = find_deps_info_on(ctx, toolchain_type_label, "scala_macro_classpath").deps
14+
library_classpath = tc.library
15+
compile_classpath = []
16+
macro_classpath = tc.library
2117

2218
return _ScalacProvider(
2319
default_classpath = library_classpath,

scala/private/rules/scala_library.bzl

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ def make_scala_library(*extras):
100100
*[extra["outputs"] for extra in extras if "outputs" in extra]
101101
),
102102
toolchains = [
103+
"@io_bazel_rules_scala//scala/runtime:toolchain_type",
103104
"@io_bazel_rules_scala//scala:toolchain_type",
104105
"@bazel_tools//tools/jdk:toolchain_type",
105106
],
@@ -169,12 +170,6 @@ _scala_library_for_plugin_bootstrapping_attrs.update(implicit_deps)
169170
# which does not contain plugin related attributes, and thus avoids the cyclic dependency issue
170171
_scala_library_for_plugin_bootstrapping_attrs.update({
171172
"build_ijar": attr.bool(default = True),
172-
"_scalac": attr.label(
173-
executable = True,
174-
cfg = "exec",
175-
default = Label("@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac:scalac_bootstrap"),
176-
allow_files = True,
177-
),
178173
})
179174

180175
_scala_library_for_plugin_bootstrapping_attrs.update(_library_attrs)
@@ -198,6 +193,7 @@ def make_scala_library_for_plugin_bootstrapping(*extras):
198193
*[extra["outputs"] for extra in extras if "outputs" in extra]
199194
),
200195
toolchains = [
196+
"@io_bazel_rules_scala//scala/runtime:toolchain_type",
201197
"@io_bazel_rules_scala//scala:toolchain_type",
202198
"@bazel_tools//tools/jdk:toolchain_type",
203199
],
@@ -270,6 +266,7 @@ def make_scala_macro_library(*extras):
270266
*[extra["outputs"] for extra in extras if "outputs" in extra]
271267
),
272268
toolchains = [
269+
"@io_bazel_rules_scala//scala/runtime:toolchain_type",
273270
"@io_bazel_rules_scala//scala:toolchain_type",
274271
"@bazel_tools//tools/jdk:toolchain_type",
275272
],

scala/runtime/BUILD.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
toolchain_type(
2+
name = "toolchain_type",
3+
visibility = ["//visibility:public"],
4+
)

scala/runtime/bootstrap.bzl

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
load("@rules_java//java:defs.bzl", "java_binary", "java_library")
2+
load("//scala:scala_cross_version.bzl", "extract_major_version", "extract_minor_version")
3+
4+
def worker(name, scala_version, classpath):
5+
scala_major_version = extract_major_version(scala_version)
6+
scala_minor_version = extract_minor_version(scala_version)
7+
8+
java_library(
9+
name = "%s_reporter" % name,
10+
srcs = _reporter_srcs(scala_major_version, scala_minor_version),
11+
deps = classpath + [
12+
"@io_bazel_rules_scala//src/protobuf/io/bazel/rules_scala:diagnostics_java_proto",
13+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/compileoptions",
14+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:scala_deps_java_proto",
15+
],
16+
)
17+
18+
java_binary(
19+
name = name,
20+
srcs = _scalac_srcs(scala_major_version),
21+
deps = classpath + [
22+
":%s_reporter" % name,
23+
"@bazel_tools//src/main/protobuf:worker_protocol_java_proto",
24+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/io_utils",
25+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/jar",
26+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/worker",
27+
"@io_bazel_rules_scala//src/protobuf/io/bazel/rules_scala:diagnostics_java_proto",
28+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/compileoptions",
29+
],
30+
main_class = "io.bazel.rulesscala.scalac.ScalacWorker",
31+
)
32+
33+
def _reporter_srcs(scala_major_version, scala_minor_version):
34+
if (scala_major_version == "2.11") or (scala_major_version == "2.12" and int(scala_minor_version) < 13):
35+
return [
36+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:before_2_12_13",
37+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:before_2_12_13",
38+
]
39+
elif (scala_major_version == "2.12" and int(scala_minor_version) >= 13) or (scala_major_version == "2.13" and int(scala_minor_version) < 12):
40+
return [
41+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:after_2_12_13_and_before_2_13_12",
42+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:after_2_12_13_and_before_2_13_12",
43+
]
44+
elif (scala_major_version == "2.13" and int(scala_minor_version) >= 12):
45+
return [
46+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:after_2_13_12",
47+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:after_2_13_12",
48+
]
49+
else:
50+
return [
51+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:after_2_13_12", # ???
52+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:scala_3",
53+
]
54+
55+
def _scalac_srcs(scala_major_version):
56+
if scala_major_version.startswith("2"):
57+
return ["@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac:scalac_2"]
58+
else:
59+
return ["@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac:scalac_3"]
60+
61+
def _source_jar(ctx):
62+
java_common.pack_sources(
63+
ctx.actions,
64+
sources = ctx.files.srcs,
65+
output_source_jar = ctx.outputs.outs,
66+
java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java,
67+
)
68+
69+
source_jar = rule(
70+
implementation = _source_jar,
71+
attrs = {
72+
"srcs": attr.label_list(mandatory = True, allow_empty = False, allow_files = True),
73+
"outs": attr.output(mandatory = True),
74+
},
75+
toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
76+
)

scala/runtime/repository.bzl

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
def _scala_runtime(repository_ctx):
2+
build = """
3+
load("@io_bazel_rules_scala//scala/runtime:bootstrap.bzl", "worker")
4+
5+
worker("scalac", "{version}", ["{compiler}", {library}])
6+
7+
load("@io_bazel_rules_scala//scala/runtime:toolchain.bzl", "runtime")
8+
9+
runtime(
10+
name = "_runtime",
11+
version = "{version}",
12+
compiler = ":scalac",
13+
library = [{library}],
14+
visibility = ["//visibility:public"],
15+
)
16+
17+
toolchain(
18+
name = "runtime",
19+
toolchain = ":_runtime",
20+
toolchain_type = "@io_bazel_rules_scala//scala/runtime:toolchain_type",
21+
visibility = ["//visibility:public"],
22+
)
23+
""".format(
24+
version = repository_ctx.attr.version,
25+
compiler = str(repository_ctx.attr.compiler),
26+
library = _comma_separated_strings(repository_ctx.attr.library),
27+
)
28+
29+
repository_ctx.file("BUILD", build)
30+
31+
scala_runtime = repository_rule(
32+
_scala_runtime,
33+
attrs = {
34+
"version": attr.string(),
35+
"compiler": attr.label(providers = [JavaInfo]),
36+
"library": attr.label_list(providers = [JavaInfo]),
37+
},
38+
)
39+
40+
def _comma_separated_strings(values):
41+
return ", ".join(["\"%s\"" % v for v in values])

scala/runtime/toolchain.bzl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
def _runtime(ctx):
2+
return platform_common.ToolchainInfo(
3+
compiler = ctx.attr.compiler.files_to_run,
4+
library = ctx.attr.library,
5+
version = ctx.attr.version,
6+
)
7+
8+
runtime = rule(
9+
_runtime,
10+
attrs = {
11+
"compiler": attr.label(executable = True, cfg = "exec", allow_files = True),
12+
"library": attr.label_list(providers = [JavaInfo]),
13+
"version": attr.string(),
14+
},
15+
)

src/java/io/bazel/rulesscala/scalac/BUILD

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,30 @@ filegroup(
5959
),
6060
visibility = ["//visibility:public"],
6161
)
62+
63+
# filegroup or export_files doesn't work because java_binary emits warning about misplaced sources
64+
# packaging sources to srcjar does solve this issue
65+
load("//scala/runtime:bootstrap.bzl", "source_jar")
66+
67+
source_jar(
68+
name = "scalac_2",
69+
srcs = [
70+
"ReportableMainClass.java",
71+
"ScalacInvoker.java",
72+
"ScalacInvokerResults.java",
73+
"ScalacWorker.java",
74+
],
75+
outs = "scalac_2.srcjar",
76+
visibility = ["//visibility:public"],
77+
)
78+
79+
source_jar(
80+
name = "scalac_3",
81+
srcs = [
82+
"ReportableMainClass.java",
83+
"ScalacInvoker.java",
84+
"ScalacInvoker3.java",
85+
],
86+
outs = "scalac_3.srcjar",
87+
visibility = ["//visibility:public"],
88+
)

0 commit comments

Comments
 (0)