Skip to content

Commit 5333ee3

Browse files
liucijusBorja Lorente
authored andcommitted
ScalaPB deps toolchain (bazel-contrib#1104)
* Inject Scalapb deps via providers on the toolchain * Update scalapb toolchain deps docs * Lint * Use external names for default labels * Add proto toolchain only for deps `//scala_proto:deps_toolchain_type` is required to uncycle dependency between `//scala_proto:toolchain_type` and generators which depend on the same proto libraries and need to be initialized before the toolchain creation. * Update toolchain transitions * Use incompatible_use_toolchain_transition
1 parent 76c1d88 commit 5333ee3

File tree

7 files changed

+133
-33
lines changed

7 files changed

+133
-33
lines changed

docs/scala_proto_library.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@ To configure ScalaPB options, configure a different `scala_proto_toolchain` and
3434

3535
```python
3636
load("@io_bazel_rules_scala//scala_proto:scala_proto_toolchain.bzl", "scala_proto_toolchain")
37+
load("@io_bazel_rules_scala//scala:providers.bzl", "declare_deps_provider")
3738

3839
scala_proto_toolchain(
3940
name = "scala_proto_toolchain_configuration",
4041
with_grpc = False,
4142
with_flat_package = False,
4243
with_single_line_to_string = False,
4344
visibility = ["//visibility:public"],
45+
dep_providers = [":my_grpc_deps", ":my_compile_deps"],
4446
)
4547

4648
toolchain(
@@ -49,6 +51,20 @@ toolchain(
4951
toolchain_type = "@io_bazel_rules_scala//scala_proto:toolchain_type",
5052
visibility = ["//visibility:public"],
5153
)
54+
55+
declare_deps_provider(
56+
name = "my_compile_deps",
57+
deps_id = "scalapb_compile_deps",
58+
deps = ["@dep1", "@dep2"],
59+
visibility = ["//visibility:public"],
60+
)
61+
62+
declare_deps_provider(
63+
name = "my_grpc_deps",
64+
deps_id = "scalapb_grpc_deps",
65+
deps = ["@dep3", "@dep4"],
66+
visibility = ["//visibility:public"],
67+
)
5268
```
5369

5470
### Toolchain Attributes
@@ -63,6 +79,5 @@ toolchain(
6379
| code_generator | `Label, optional (has default)` <br> Which code generator to use. A sensible default is provided.
6480
| named_generators | `String dict, optional` <br>
6581
| extra_generator_dependencies | `List of labels, optional` <br>
66-
| grpc_deps | `List of labels, optional (has default)` <br> gRPC dependencies. A sensible default is provided.
67-
| implicit_compile_deps | `List of labels, optional (has default)` <br> ScalaPB dependencies. A sensible default is provided.
6882
| scalac | `Label, optional (has default)` <br> Target for scalac. A sensible default is provided.
83+
| dep_providers | `List of labels, optional (has default)` <br> allows inject gRPC (deps_id - `scalapb_grpc_deps`) and ScalaPB (deps_id `scalapb_compile_deps`) dependencies

scala_proto/BUILD

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
11
load("@rules_java//java:defs.bzl", "java_library")
2-
load("//scala_proto:scala_proto_toolchain.bzl", "scala_proto_toolchain")
3-
load("//scala_proto:default_dep_sets.bzl", "DEFAULT_SCALAPB_COMPILE_DEPS", "DEFAULT_SCALAPB_GRPC_DEPS")
2+
load(
3+
"//scala_proto:scala_proto_toolchain.bzl",
4+
"export_scalapb_toolchain_deps",
5+
"scala_proto_deps_toolchain",
6+
"scala_proto_toolchain",
7+
)
8+
load(
9+
"//scala_proto:default_dep_sets.bzl",
10+
"DEFAULT_SCALAPB_COMPILE_DEPS",
11+
"DEFAULT_SCALAPB_GRPC_DEPS",
12+
)
13+
load("//scala:providers.bzl", "declare_deps_provider")
414

515
toolchain_type(
616
name = "toolchain_type",
717
visibility = ["//visibility:public"],
818
)
919

20+
toolchain_type(
21+
name = "deps_toolchain_type",
22+
visibility = ["//visibility:public"],
23+
)
24+
25+
scala_proto_deps_toolchain(
26+
name = "default_deps_toolchain_impl",
27+
visibility = ["//visibility:public"],
28+
)
29+
1030
scala_proto_toolchain(
1131
name = "default_toolchain_impl",
1232
visibility = ["//visibility:public"],
@@ -22,6 +42,12 @@ toolchain(
2242
visibility = ["//visibility:public"],
2343
)
2444

45+
toolchain(
46+
name = "default_deps_toolchain",
47+
toolchain = ":default_deps_toolchain_impl",
48+
toolchain_type = ":deps_toolchain_type",
49+
)
50+
2551
scala_proto_toolchain(
2652
name = "enable_all_options_toolchain_impl",
2753
visibility = ["//visibility:public"],
@@ -38,14 +64,33 @@ toolchain(
3864
visibility = ["//visibility:public"],
3965
)
4066

41-
java_library(
42-
name = "default_scalapb_compile_dependencies",
67+
declare_deps_provider(
68+
name = "scalapb_compile_deps_provider",
69+
deps_id = "scalapb_compile_deps",
70+
visibility = ["//visibility:public"],
71+
deps = DEFAULT_SCALAPB_COMPILE_DEPS,
72+
)
73+
74+
declare_deps_provider(
75+
name = "scalapb_grpc_deps_provider",
76+
deps_id = "scalapb_grpc_deps",
77+
visibility = ["//visibility:public"],
78+
deps = DEFAULT_SCALAPB_GRPC_DEPS,
79+
)
80+
81+
declare_deps_provider(
82+
name = "scalapb_worker_deps_provider",
83+
deps_id = "scalapb_worker_deps",
4384
visibility = ["//visibility:public"],
44-
exports = DEFAULT_SCALAPB_COMPILE_DEPS,
85+
deps = [
86+
"//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java",
87+
"//external:io_bazel_rules_scala/dependency/proto/protoc_bridge",
88+
"//external:io_bazel_rules_scala/dependency/proto/scalapb_plugin",
89+
],
4590
)
4691

47-
java_library(
48-
name = "default_scalapb_grpc_dependencies",
92+
export_scalapb_toolchain_deps(
93+
name = "scalapb_worker_deps",
94+
deps_id = "scalapb_worker_deps",
4995
visibility = ["//visibility:public"],
50-
exports = DEFAULT_SCALAPB_GRPC_DEPS,
5196
)

scala_proto/private/scala_proto_default_repositories.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,3 +198,5 @@ def scala_proto_default_repositories(
198198
name = "io_bazel_rules_scala/dependency/proto/opencensus_contrib_grpc_metrics",
199199
actual = "@scala_proto_rules_opencensus_contrib_grpc_metrics//jar",
200200
)
201+
202+
native.register_toolchains("@io_bazel_rules_scala//scala_proto:default_deps_toolchain")

scala_proto/private/scalapb_aspect.bzl

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ load("//scala/private:common.bzl", "write_manifest_file")
33
load("//scala/private:dependency.bzl", "legacy_unclear_dependency_info_for_protobuf_scrooge")
44
load("//scala/private:rule_impls.bzl", "compile_scala")
55
load("//scala_proto/private:proto_to_scala_src.bzl", "proto_to_scala_src")
6+
load("//scala/private/toolchain_deps:toolchain_deps.bzl", "find_deps_info_on", "java_info_for_deps")
67

78
ScalaPBAspectInfo = provider(fields = [
89
"proto_info",
@@ -139,13 +140,23 @@ def _scalapb_aspect_impl(target, ctx):
139140
compile_protos = sorted(target_ti.direct_sources)
140141
transitive_protos = sorted(target_ti.transitive_sources.to_list())
141142

142-
toolchain = ctx.toolchains["@io_bazel_rules_scala//scala_proto:toolchain_type"]
143+
deps_toolchain_type_label = "@io_bazel_rules_scala//scala_proto:deps_toolchain_type"
144+
toolchain_type_label = "@io_bazel_rules_scala//scala_proto:toolchain_type"
145+
toolchain = ctx.toolchains[toolchain_type_label]
143146
flags = []
144-
imps = [j[JavaInfo] for j in ctx.attr._implicit_compile_deps]
147+
148+
compile_deps = find_deps_info_on(
149+
ctx,
150+
deps_toolchain_type_label,
151+
"scalapb_compile_deps",
152+
).deps
153+
154+
imps = [dep[JavaInfo] for dep in compile_deps]
145155

146156
if toolchain.with_grpc:
157+
grpc_deps = find_deps_info_on(ctx, deps_toolchain_type_label, "scalapb_grpc_deps").deps
147158
flags.append("grpc")
148-
imps.extend([j[JavaInfo] for j in ctx.attr._grpc_deps])
159+
imps.extend([dep[JavaInfo] for dep in grpc_deps])
149160

150161
if toolchain.with_flat_package:
151162
flags.append("flat_package")
@@ -233,16 +244,16 @@ scalapb_aspect = aspect(
233244
[ScalaPBImport],
234245
],
235246
attrs = {
236-
"_protoc": attr.label(executable = True, cfg = "host", default = "@com_google_protobuf//:protoc"),
237-
"_implicit_compile_deps": attr.label_list(cfg = "target", default = [
238-
"//external:io_bazel_rules_scala/dependency/proto/implicit_compile_deps",
239-
]),
240-
"_grpc_deps": attr.label_list(cfg = "target", default = [
241-
"//external:io_bazel_rules_scala/dependency/proto/grpc_deps",
242-
]),
247+
"_protoc": attr.label(
248+
executable = True,
249+
cfg = "exec",
250+
default = "@com_google_protobuf//:protoc",
251+
),
243252
},
253+
incompatible_use_toolchain_transition = True,
244254
toolchains = [
245255
"@io_bazel_rules_scala//scala:toolchain_type",
246256
"@io_bazel_rules_scala//scala_proto:toolchain_type",
257+
"@io_bazel_rules_scala//scala_proto:deps_toolchain_type",
247258
],
248259
)

scala_proto/scala_proto_toolchain.bzl

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
load("//scala_proto:default_dep_sets.bzl", "DEFAULT_SCALAPB_COMPILE_DEPS", "DEFAULT_SCALAPB_GRPC_DEPS")
2+
load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo")
3+
load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps")
24

35
def _scala_proto_toolchain_impl(ctx):
46
toolchain = platform_common.ToolchainInfo(
@@ -28,7 +30,7 @@ scala_proto_toolchain = rule(
2830
"blacklisted_protos": attr.label_list(default = []),
2931
"code_generator": attr.label(
3032
executable = True,
31-
cfg = "host",
33+
cfg = "exec",
3234
default = Label("@io_bazel_rules_scala//src/scala/scripts:scalapb_worker"),
3335
allow_files = True,
3436
),
@@ -43,3 +45,38 @@ scala_proto_toolchain = rule(
4345
),
4446
},
4547
)
48+
49+
def _scala_proto_deps_toolchain(ctx):
50+
toolchain = platform_common.ToolchainInfo(
51+
dep_providers = ctx.attr.dep_providers,
52+
)
53+
return [toolchain]
54+
55+
scala_proto_deps_toolchain = rule(
56+
_scala_proto_deps_toolchain,
57+
attrs = {
58+
"dep_providers": attr.label_list(
59+
default = [
60+
"@io_bazel_rules_scala//scala_proto:scalapb_compile_deps_provider",
61+
"@io_bazel_rules_scala//scala_proto:scalapb_grpc_deps_provider",
62+
"@io_bazel_rules_scala//scala_proto:scalapb_worker_deps_provider",
63+
],
64+
cfg = "target",
65+
providers = [DepsInfo],
66+
),
67+
},
68+
)
69+
70+
def _export_scalapb_toolchain_deps(ctx):
71+
return expose_toolchain_deps(ctx, "@io_bazel_rules_scala//scala_proto:deps_toolchain_type")
72+
73+
export_scalapb_toolchain_deps = rule(
74+
_export_scalapb_toolchain_deps,
75+
attrs = {
76+
"deps_id": attr.string(
77+
mandatory = True,
78+
),
79+
},
80+
incompatible_use_toolchain_transition = True,
81+
toolchains = ["@io_bazel_rules_scala//scala_proto:deps_toolchain_type"],
82+
)

src/scala/scripts/BUILD

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,10 @@ scala_library(
3131
scala_library(
3232
name = "scalapb_worker_lib",
3333
srcs = ["ScalaPBWorker.scala"],
34-
unused_dependency_checker_ignored_targets = [
35-
"//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java",
36-
],
3734
visibility = ["//visibility:public"],
38-
runtime_deps = [
39-
"//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java",
40-
],
4135
deps = [
4236
":scala_proto_request_extractor",
43-
"//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java",
44-
"//external:io_bazel_rules_scala/dependency/proto/protoc_bridge",
45-
"//external:io_bazel_rules_scala/dependency/proto/scalapb_plugin",
37+
"//scala_proto:scalapb_worker_deps",
4638
"//src/java/io/bazel/rulesscala/io_utils",
4739
"//src/java/io/bazel/rulesscala/jar",
4840
"//src/java/io/bazel/rulesscala/worker",

test/src/main/scala/scalarules/test/extra_protobuf_generator/BUILD

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ scala_library(
55
srcs = ["ExtraProtobufGenerator.scala"],
66
visibility = ["//visibility:public"],
77
deps = [
8-
"//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java",
9-
"//external:io_bazel_rules_scala/dependency/proto/protoc_bridge",
10-
"//external:io_bazel_rules_scala/dependency/proto/scalapb_plugin",
8+
"//scala_proto:scalapb_worker_deps",
119
],
1210
)

0 commit comments

Comments
 (0)