Skip to content

Commit 4622b97

Browse files
toolchain scalac
1 parent 2688885 commit 4622b97

File tree

9 files changed

+189
-5
lines changed

9 files changed

+189
-5
lines changed

scala/private/common_attributes.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ load(
88
"@io_bazel_rules_scala//scala:plusone.bzl",
99
_collect_plus_one_deps_aspect = "collect_plus_one_deps_aspect",
1010
)
11+
load("//scala/versions:versions.bzl", "sanitize_version")
12+
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSIONS")
1113

1214
common_attrs_for_plugin_bootstrapping = {
1315
"srcs": attr.label_list(allow_files = [

scala/private/macros/setup_scala_toolchain.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,10 @@ def setup_scala_toolchain(
160160

161161
scala_toolchain(
162162
name = "%s_impl" % name,
163-
scala_version = scala_version,
164163
dep_providers = dep_providers,
165164
enable_semanticdb = enable_semanticdb,
166165
visibility = visibility,
166+
scalac = Label("@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac:scalac_" + sanitize_version(scala_version)) if scala_version else None,
167167
**kwargs
168168
)
169169

scala/private/phases/phase_compile.bzl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ load(
1818
)
1919
load(":resources.bzl", _resource_paths = "paths")
2020
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION")
21+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "extract_major_version", "extract_minor_version")
22+
load("//scala/versions:versions.bzl", "sanitize_version")
2123

2224
buildijar_default_value = True if SCALA_VERSION.startswith("2.") else False
2325

@@ -221,7 +223,7 @@ def _compile_or_empty(
221223
ctx.attr.expect_java_output,
222224
ctx.attr.scalac_jvm_flags,
223225
scalacopts,
224-
ctx.executable._scalac,
226+
_select_scalac(ctx),
225227
dependency_info,
226228
unused_dependency_checker_ignored_targets,
227229
additional_outputs,
@@ -390,3 +392,9 @@ def _interim_java_provider_for_java_compilation(scala_output):
390392
compile_jar = scala_output,
391393
neverlink = True,
392394
)
395+
396+
def _select_scalac(ctx):
397+
scalac = ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scalac
398+
if (scalac):
399+
return scalac.files_to_run
400+
return ctx.attr._scalac

scala/scala_toolchain.bzl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def _scala_toolchain_impl(ctx):
101101
enable_semanticdb = ctx.attr.enable_semanticdb,
102102
semanticdb_bundle_in_jar = ctx.attr.semanticdb_bundle_in_jar,
103103
use_argument_file_in_runner = ctx.attr.use_argument_file_in_runner,
104-
scala_version = ctx.attr.scala_version,
104+
scalac = ctx.attr.scalac,
105105
)
106106
return [toolchain]
107107

@@ -174,7 +174,9 @@ scala_toolchain = rule(
174174
default = False,
175175
doc = "Changes java binaries scripts (including tests) to use argument files and not classpath jars to improve performance, requires java > 8",
176176
),
177-
"scala_version": attr.string(),
177+
"scalac": attr.label(
178+
allow_files = True,
179+
),
178180
},
179181
fragments = ["java"],
180182
)

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,32 @@ filegroup(
5959
),
6060
visibility = ["//visibility:public"],
6161
)
62+
63+
load("//src/java/io/bazel/rulesscala/scalac:scalac.bzl", "source_jar")
64+
65+
source_jar(
66+
name = "scalac_2",
67+
srcs = [
68+
"ReportableMainClass.java",
69+
"ScalacInvoker.java",
70+
"ScalacInvokerResults.java",
71+
"ScalacWorker.java",
72+
],
73+
outs = "scalac_2.srcjar",
74+
visibility = ["//visibility:public"],
75+
)
76+
77+
source_jar(
78+
name = "scalac_3",
79+
srcs = [
80+
"ScalacInvoker3.java",
81+
"ScalacInvokerResults.java",
82+
"ScalacWorker.java",
83+
],
84+
outs = "scalac_3.srcjar",
85+
visibility = ["//visibility:public"],
86+
)
87+
88+
load("//src/java/io/bazel/rulesscala/scalac:scalac.bzl", "setup_scalac")
89+
90+
setup_scalac()

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ java_library(
44
name = "compileoptions",
55
srcs = ["CompileOptions.java"],
66
visibility = ["//visibility:public"],
7-
deps = ["//scala/private/toolchain_deps:scala_compile_classpath"],
87
)
98

109
java_test(

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,19 @@ filegroup(
1111
],
1212
visibility = ["//visibility:public"],
1313
)
14+
15+
load("//src/java/io/bazel/rulesscala/scalac:scalac.bzl", "source_jar")
16+
17+
[
18+
source_jar(
19+
name = d,
20+
srcs = glob(["%s/*.java" % d]),
21+
outs = "%s.srcjar" % d,
22+
visibility = ["//visibility:public"],
23+
)
24+
for d in [
25+
"after_2_12_13_and_before_2_13_12",
26+
"after_2_13_12",
27+
"before_2_12_13",
28+
]
29+
]

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,26 @@ java_proto_library(
3434
visibility = ["//visibility:public"],
3535
deps = [":scala_deps_proto"],
3636
)
37+
38+
load("//src/java/io/bazel/rulesscala/scalac:scalac.bzl", "source_jar")
39+
40+
[
41+
source_jar(
42+
name = d,
43+
srcs = glob(["%s/*.java" % d]),
44+
outs = "%s.srcjar" % d,
45+
visibility = ["//visibility:public"],
46+
)
47+
for d in [
48+
"after_2_12_13_and_before_2_13_12",
49+
"after_2_13_12",
50+
"before_2_12_13",
51+
]
52+
]
53+
54+
source_jar(
55+
name = "scala_3",
56+
srcs = ["PlaceholderForEmptyScala3Lib.java"],
57+
outs = "scala_3.srcjar",
58+
visibility = ["//visibility:public"],
59+
)
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
load("@rules_java//java:defs.bzl", "java_binary", "java_library")
2+
load("//scala/versions:versions.bzl", "sanitize_version")
3+
load("@io_bazel_rules_scala_config//:config.bzl", "SCALA_VERSION", "SCALA_VERSIONS")
4+
load("@io_bazel_rules_scala//scala:scala_cross_version.bzl", "extract_major_version", "extract_minor_version")
5+
6+
_SCALA_COMPILE_CLASSPATH_DEPS = {
7+
"2": [
8+
"@io_bazel_rules_scala_scala_compiler",
9+
"@io_bazel_rules_scala_scala_library",
10+
"@io_bazel_rules_scala_scala_reflect",
11+
],
12+
"3": [
13+
"@io_bazel_rules_scala_scala_compiler",
14+
"@io_bazel_rules_scala_scala_library",
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+
],
20+
}
21+
22+
def setup_scalac():
23+
for scala_version in SCALA_VERSIONS:
24+
_scalac(scala_version)
25+
26+
def _scalac(scala_version):
27+
compiler_deps = _compiler_deps(scala_version)
28+
version_suffix = "_" + sanitize_version(scala_version)
29+
30+
java_library(
31+
name = "scalac_reporter" + version_suffix,
32+
srcs = _reporter_srcs(extract_major_version(scala_version), extract_minor_version(scala_version)),
33+
deps = compiler_deps + [
34+
"@io_bazel_rules_scala//src/protobuf/io/bazel/rules_scala:diagnostics_java_proto",
35+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/compileoptions",
36+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:scala_deps_java_proto",
37+
],
38+
)
39+
java_binary(
40+
name = "scalac" + version_suffix,
41+
srcs = _scalac_srcs(scala_version),
42+
main_class = "io.bazel.rulesscala.scalac.ScalacWorker",
43+
visibility = ["//visibility:public"],
44+
javacopts = [
45+
"-source 1.8",
46+
"-target 1.8",
47+
],
48+
deps = compiler_deps + [
49+
":scalac_reporter" + version_suffix,
50+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/io_utils",
51+
"@bazel_tools//src/main/protobuf:worker_protocol_java_proto",
52+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/jar",
53+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/worker",
54+
"@io_bazel_rules_scala//src/protobuf/io/bazel/rules_scala:diagnostics_java_proto",
55+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/compileoptions",
56+
],
57+
)
58+
59+
def _compiler_deps(scala_version):
60+
suffix = "_" + sanitize_version(scala_version)
61+
return [dep + suffix for dep in _SCALA_COMPILE_CLASSPATH_DEPS[scala_version[0:1]]]
62+
63+
def _reporter_srcs(scala_major_version, scala_minor_version):
64+
if (scala_major_version == "2.11") or (scala_major_version == "2.12" and int(scala_minor_version) < 13):
65+
return [
66+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:before_2_12_13",
67+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:before_2_12_13",
68+
]
69+
elif (scala_major_version == "2.12" and int(scala_minor_version) >= 13) or (scala_major_version == "2.13" and int(scala_minor_version) < 12):
70+
return [
71+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:after_2_12_13_and_before_2_13_12",
72+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:after_2_12_13_and_before_2_13_12",
73+
]
74+
elif (scala_major_version == "2.13" and int(scala_minor_version) >= 12):
75+
return [
76+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/deps_tracking_reporter:after_2_13_12",
77+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:after_2_13_12",
78+
]
79+
else:
80+
return [
81+
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac/reporter:scala_3",
82+
]
83+
84+
def _scalac_srcs(scala_version):
85+
if scala_version.startswith("2"):
86+
return ["@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac:scalac_2"]
87+
else:
88+
return ["@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac:scalac_3"]
89+
90+
def _source_jar(ctx):
91+
java_common.pack_sources(
92+
ctx.actions,
93+
sources = ctx.files.srcs,
94+
output_source_jar = ctx.outputs.outs,
95+
java_toolchain = ctx.toolchains["@bazel_tools//tools/jdk:toolchain_type"].java,
96+
)
97+
98+
source_jar = rule(
99+
implementation = _source_jar,
100+
attrs = {
101+
"srcs": attr.label_list(mandatory = True, allow_empty = False, allow_files = True),
102+
"outs": attr.output(mandatory = True),
103+
},
104+
toolchains = ["@bazel_tools//tools/jdk:toolchain_type"],
105+
)

0 commit comments

Comments
 (0)