Skip to content

Commit 21d6ed0

Browse files
refactor scalac java_binary target creation (#1677)
I'd like to remove Scala compiler extensions from the Scala toolchain, that I could be potentially building myself (in the same monorepo, build the compiler extension, but also use it). Till now the only way to add Scala compiler dependencies was a toolchain. If I left the compiler extension as a toolchain dependency there, I could not build the compiler extension due to a cycle in deps (building the compiler extension would depend on itself through the toolchain). I'd like to work this around by defining my own scalac java_binary target, where I can define my own dependencies (and then create rule names with macros that override the scalac target). To do this without duplicating code from rules_scala, refactor SCALAC_DEPS parameter and scalac target definitions to a Starlark file to make them reusable for outside users. Added: - define_scalac() - define_scalac_bootstrap() A user could do: ``` EXTENDED_SCALAC_DEPS = DEFAULT_SCALAC_DEPS + [ "@//my/compiler/dependency:library", ] define_scalac( name = "scalac_with_extensions", deps = EXTENDED_SCALAC_DEPS, ) ``` And then build that compiler library in the same monorepo, this way, providing compiler dependencies without toolchains (that would cause cycles for this usecase). See #1674 for more information.
1 parent c80fcde commit 21d6ed0

File tree

2 files changed

+52
-42
lines changed

2 files changed

+52
-42
lines changed

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

+4-42
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,15 @@
1-
load("@rules_java//java:defs.bzl", "java_binary")
2-
load("@io_bazel_rules_scala_config//:config.bzl", "ENABLE_COMPILER_DEPENDENCY_TRACKING")
31
load("//scala:scala_cross_version_select.bzl", "select_for_scala_version")
2+
load("//src/java/io/bazel/rulesscala/scalac:definitions.bzl", "define_scalac", "define_scalac_bootstrap")
43

5-
SCALAC_DEPS = [
6-
"//scala/private/toolchain_deps:scala_compile_classpath",
7-
"//src/java/io/bazel/rulesscala/io_utils",
8-
"@bazel_tools//src/main/protobuf:worker_protocol_java_proto",
9-
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/jar",
10-
"@io_bazel_rules_scala//src/java/io/bazel/rulesscala/worker",
11-
"@io_bazel_rules_scala//src/protobuf/io/bazel/rules_scala:diagnostics_java_proto",
12-
"//src/java/io/bazel/rulesscala/scalac/compileoptions",
13-
"//src/java/io/bazel/rulesscala/scalac/reporter",
14-
]
4+
define_scalac()
155

16-
java_binary(
17-
name = "scalac",
18-
srcs = [
19-
":scalac_files",
20-
],
21-
javacopts = [
22-
"-source 1.8",
23-
"-target 1.8",
24-
],
25-
main_class = "io.bazel.rulesscala.scalac.ScalacWorker",
26-
visibility = ["//visibility:public"],
27-
deps = ([
28-
"//third_party/dependency_analyzer/src/main/io/bazel/rulesscala/dependencyanalyzer/compiler:dep_reporting_compiler",
29-
] if ENABLE_COMPILER_DEPENDENCY_TRACKING else []) + SCALAC_DEPS,
30-
)
31-
32-
java_binary(
33-
name = "scalac_bootstrap",
34-
srcs = [
35-
":scalac_files",
36-
],
37-
javacopts = [
38-
"-source 1.8",
39-
"-target 1.8",
40-
],
41-
main_class = "io.bazel.rulesscala.scalac.ScalacWorker",
42-
visibility = ["//visibility:public"],
43-
deps = SCALAC_DEPS,
44-
)
6+
define_scalac_bootstrap()
457

468
filegroup(
479
name = "scalac_files",
4810
srcs = [
49-
"ScalacWorker.java",
5011
"ScalacInvokerResults.java",
12+
"ScalacWorker.java",
5113
] + select_for_scala_version(
5214
any_2 = glob(["scala_2/*.java"]),
5315
any_3 = glob(["scala_3/*.java"]),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
load("@io_bazel_rules_scala_config//:config.bzl", "ENABLE_COMPILER_DEPENDENCY_TRACKING")
2+
load("@rules_java//java:defs.bzl", "java_binary")
3+
4+
DEFAULT_SCALAC_DEPS = [
5+
Label(dep)
6+
for dep in [
7+
"//scala/private/toolchain_deps:scala_compile_classpath",
8+
"//src/java/io/bazel/rulesscala/io_utils",
9+
"//src/java/io/bazel/rulesscala/jar",
10+
"//src/java/io/bazel/rulesscala/worker",
11+
"//src/protobuf/io/bazel/rules_scala:diagnostics_java_proto",
12+
"//src/java/io/bazel/rulesscala/scalac/compileoptions",
13+
"//src/java/io/bazel/rulesscala/scalac/reporter",
14+
"@bazel_tools//src/main/protobuf:worker_protocol_java_proto",
15+
]
16+
]
17+
18+
DEFAULT_SRCS = [
19+
Label("//src/java/io/bazel/rulesscala/scalac:scalac_files"),
20+
]
21+
22+
def define_scalac(name = "scalac", srcs = DEFAULT_SRCS, deps = DEFAULT_SCALAC_DEPS):
23+
java_binary(
24+
name = name,
25+
srcs = srcs,
26+
javacopts = [
27+
"-source 1.8",
28+
"-target 1.8",
29+
],
30+
main_class = "io.bazel.rulesscala.scalac.ScalacWorker",
31+
visibility = ["//visibility:public"],
32+
deps = ([
33+
Label("//third_party/dependency_analyzer/src/main/io/bazel/rulesscala/dependencyanalyzer/compiler:dep_reporting_compiler"),
34+
] if ENABLE_COMPILER_DEPENDENCY_TRACKING else []) + deps,
35+
)
36+
37+
def define_scalac_bootstrap(name = "scalac_bootstrap", srcs = DEFAULT_SRCS, deps = DEFAULT_SCALAC_DEPS):
38+
java_binary(
39+
name = name,
40+
srcs = srcs,
41+
javacopts = [
42+
"-source 1.8",
43+
"-target 1.8",
44+
],
45+
main_class = "io.bazel.rulesscala.scalac.ScalacWorker",
46+
visibility = ["//visibility:public"],
47+
deps = deps,
48+
)

0 commit comments

Comments
 (0)