diff --git a/docs/scala_proto_library.md b/docs/scala_proto_library.md index b682ac75b..ba4753ab7 100644 --- a/docs/scala_proto_library.md +++ b/docs/scala_proto_library.md @@ -34,6 +34,7 @@ To configure ScalaPB options, configure a different `scala_proto_toolchain` and ```python load("@io_bazel_rules_scala//scala_proto:scala_proto_toolchain.bzl", "scala_proto_toolchain") +load("@io_bazel_rules_scala//scala:providers.bzl", "declare_deps_provider") scala_proto_toolchain( name = "scala_proto_toolchain_configuration", @@ -41,6 +42,7 @@ scala_proto_toolchain( with_flat_package = False, with_single_line_to_string = False, visibility = ["//visibility:public"], + dep_providers = [":my_grpc_deps", ":my_compile_deps"], ) toolchain( @@ -49,6 +51,20 @@ toolchain( toolchain_type = "@io_bazel_rules_scala//scala_proto:toolchain_type", visibility = ["//visibility:public"], ) + +declare_deps_provider( + name = "my_compile_deps", + deps_id = "scalapb_compile_deps", + deps = ["@dep1", "@dep2"], + visibility = ["//visibility:public"], +) + +declare_deps_provider( + name = "my_grpc_deps", + deps_id = "scalapb_grpc_deps", + deps = ["@dep3", "@dep4"], + visibility = ["//visibility:public"], +) ``` ### Toolchain Attributes @@ -63,6 +79,5 @@ toolchain( | code_generator | `Label, optional (has default)`
Which code generator to use. A sensible default is provided. | named_generators | `String dict, optional`
| extra_generator_dependencies | `List of labels, optional`
-| grpc_deps | `List of labels, optional (has default)`
gRPC dependencies. A sensible default is provided. -| implicit_compile_deps | `List of labels, optional (has default)`
ScalaPB dependencies. A sensible default is provided. | scalac | `Label, optional (has default)`
Target for scalac. A sensible default is provided. +| dep_providers | `List of labels, optional (has default)`
allows inject gRPC (deps_id - `scalapb_grpc_deps`) and ScalaPB (deps_id `scalapb_compile_deps`) dependencies diff --git a/scala_proto/BUILD b/scala_proto/BUILD index a7c0bc0c9..376ca213e 100644 --- a/scala_proto/BUILD +++ b/scala_proto/BUILD @@ -1,12 +1,32 @@ load("@rules_java//java:defs.bzl", "java_library") -load("//scala_proto:scala_proto_toolchain.bzl", "scala_proto_toolchain") -load("//scala_proto:default_dep_sets.bzl", "DEFAULT_SCALAPB_COMPILE_DEPS", "DEFAULT_SCALAPB_GRPC_DEPS") +load( + "//scala_proto:scala_proto_toolchain.bzl", + "export_scalapb_toolchain_deps", + "scala_proto_deps_toolchain", + "scala_proto_toolchain", +) +load( + "//scala_proto:default_dep_sets.bzl", + "DEFAULT_SCALAPB_COMPILE_DEPS", + "DEFAULT_SCALAPB_GRPC_DEPS", +) +load("//scala:providers.bzl", "declare_deps_provider") toolchain_type( name = "toolchain_type", visibility = ["//visibility:public"], ) +toolchain_type( + name = "deps_toolchain_type", + visibility = ["//visibility:public"], +) + +scala_proto_deps_toolchain( + name = "default_deps_toolchain_impl", + visibility = ["//visibility:public"], +) + scala_proto_toolchain( name = "default_toolchain_impl", visibility = ["//visibility:public"], @@ -22,6 +42,12 @@ toolchain( visibility = ["//visibility:public"], ) +toolchain( + name = "default_deps_toolchain", + toolchain = ":default_deps_toolchain_impl", + toolchain_type = ":deps_toolchain_type", +) + scala_proto_toolchain( name = "enable_all_options_toolchain_impl", visibility = ["//visibility:public"], @@ -38,14 +64,33 @@ toolchain( visibility = ["//visibility:public"], ) -java_library( - name = "default_scalapb_compile_dependencies", +declare_deps_provider( + name = "scalapb_compile_deps_provider", + deps_id = "scalapb_compile_deps", + visibility = ["//visibility:public"], + deps = DEFAULT_SCALAPB_COMPILE_DEPS, +) + +declare_deps_provider( + name = "scalapb_grpc_deps_provider", + deps_id = "scalapb_grpc_deps", + visibility = ["//visibility:public"], + deps = DEFAULT_SCALAPB_GRPC_DEPS, +) + +declare_deps_provider( + name = "scalapb_worker_deps_provider", + deps_id = "scalapb_worker_deps", visibility = ["//visibility:public"], - exports = DEFAULT_SCALAPB_COMPILE_DEPS, + deps = [ + "//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java", + "//external:io_bazel_rules_scala/dependency/proto/protoc_bridge", + "//external:io_bazel_rules_scala/dependency/proto/scalapb_plugin", + ], ) -java_library( - name = "default_scalapb_grpc_dependencies", +export_scalapb_toolchain_deps( + name = "scalapb_worker_deps", + deps_id = "scalapb_worker_deps", visibility = ["//visibility:public"], - exports = DEFAULT_SCALAPB_GRPC_DEPS, ) diff --git a/scala_proto/private/scala_proto_default_repositories.bzl b/scala_proto/private/scala_proto_default_repositories.bzl index e71f4fa65..17404a3aa 100644 --- a/scala_proto/private/scala_proto_default_repositories.bzl +++ b/scala_proto/private/scala_proto_default_repositories.bzl @@ -198,3 +198,5 @@ def scala_proto_default_repositories( name = "io_bazel_rules_scala/dependency/proto/opencensus_contrib_grpc_metrics", actual = "@scala_proto_rules_opencensus_contrib_grpc_metrics//jar", ) + + native.register_toolchains("@io_bazel_rules_scala//scala_proto:default_deps_toolchain") diff --git a/scala_proto/private/scalapb_aspect.bzl b/scala_proto/private/scalapb_aspect.bzl index 7c1da1792..eabea5da2 100644 --- a/scala_proto/private/scalapb_aspect.bzl +++ b/scala_proto/private/scalapb_aspect.bzl @@ -3,6 +3,7 @@ load("//scala/private:common.bzl", "write_manifest_file") load("//scala/private:dependency.bzl", "legacy_unclear_dependency_info_for_protobuf_scrooge") load("//scala/private:rule_impls.bzl", "compile_scala") load("//scala_proto/private:proto_to_scala_src.bzl", "proto_to_scala_src") +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "find_deps_info_on", "java_info_for_deps") ScalaPBAspectInfo = provider(fields = [ "proto_info", @@ -139,13 +140,23 @@ def _scalapb_aspect_impl(target, ctx): compile_protos = sorted(target_ti.direct_sources) transitive_protos = sorted(target_ti.transitive_sources.to_list()) - toolchain = ctx.toolchains["@io_bazel_rules_scala//scala_proto:toolchain_type"] + deps_toolchain_type_label = "@io_bazel_rules_scala//scala_proto:deps_toolchain_type" + toolchain_type_label = "@io_bazel_rules_scala//scala_proto:toolchain_type" + toolchain = ctx.toolchains[toolchain_type_label] flags = [] - imps = [j[JavaInfo] for j in ctx.attr._implicit_compile_deps] + + compile_deps = find_deps_info_on( + ctx, + deps_toolchain_type_label, + "scalapb_compile_deps", + ).deps + + imps = [dep[JavaInfo] for dep in compile_deps] if toolchain.with_grpc: + grpc_deps = find_deps_info_on(ctx, deps_toolchain_type_label, "scalapb_grpc_deps").deps flags.append("grpc") - imps.extend([j[JavaInfo] for j in ctx.attr._grpc_deps]) + imps.extend([dep[JavaInfo] for dep in grpc_deps]) if toolchain.with_flat_package: flags.append("flat_package") @@ -233,16 +244,16 @@ scalapb_aspect = aspect( [ScalaPBImport], ], attrs = { - "_protoc": attr.label(executable = True, cfg = "host", default = "@com_google_protobuf//:protoc"), - "_implicit_compile_deps": attr.label_list(cfg = "target", default = [ - "//external:io_bazel_rules_scala/dependency/proto/implicit_compile_deps", - ]), - "_grpc_deps": attr.label_list(cfg = "target", default = [ - "//external:io_bazel_rules_scala/dependency/proto/grpc_deps", - ]), + "_protoc": attr.label( + executable = True, + cfg = "exec", + default = "@com_google_protobuf//:protoc", + ), }, + incompatible_use_toolchain_transition = True, toolchains = [ "@io_bazel_rules_scala//scala:toolchain_type", "@io_bazel_rules_scala//scala_proto:toolchain_type", + "@io_bazel_rules_scala//scala_proto:deps_toolchain_type", ], ) diff --git a/scala_proto/scala_proto_toolchain.bzl b/scala_proto/scala_proto_toolchain.bzl index d13aa2b47..4a12f9ca9 100644 --- a/scala_proto/scala_proto_toolchain.bzl +++ b/scala_proto/scala_proto_toolchain.bzl @@ -1,4 +1,6 @@ load("//scala_proto:default_dep_sets.bzl", "DEFAULT_SCALAPB_COMPILE_DEPS", "DEFAULT_SCALAPB_GRPC_DEPS") +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps") def _scala_proto_toolchain_impl(ctx): toolchain = platform_common.ToolchainInfo( @@ -28,7 +30,7 @@ scala_proto_toolchain = rule( "blacklisted_protos": attr.label_list(default = []), "code_generator": attr.label( executable = True, - cfg = "host", + cfg = "exec", default = Label("@io_bazel_rules_scala//src/scala/scripts:scalapb_worker"), allow_files = True, ), @@ -43,3 +45,38 @@ scala_proto_toolchain = rule( ), }, ) + +def _scala_proto_deps_toolchain(ctx): + toolchain = platform_common.ToolchainInfo( + dep_providers = ctx.attr.dep_providers, + ) + return [toolchain] + +scala_proto_deps_toolchain = rule( + _scala_proto_deps_toolchain, + attrs = { + "dep_providers": attr.label_list( + default = [ + "@io_bazel_rules_scala//scala_proto:scalapb_compile_deps_provider", + "@io_bazel_rules_scala//scala_proto:scalapb_grpc_deps_provider", + "@io_bazel_rules_scala//scala_proto:scalapb_worker_deps_provider", + ], + cfg = "target", + providers = [DepsInfo], + ), + }, +) + +def _export_scalapb_toolchain_deps(ctx): + return expose_toolchain_deps(ctx, "@io_bazel_rules_scala//scala_proto:deps_toolchain_type") + +export_scalapb_toolchain_deps = rule( + _export_scalapb_toolchain_deps, + attrs = { + "deps_id": attr.string( + mandatory = True, + ), + }, + incompatible_use_toolchain_transition = True, + toolchains = ["@io_bazel_rules_scala//scala_proto:deps_toolchain_type"], +) diff --git a/src/scala/scripts/BUILD b/src/scala/scripts/BUILD index 6f2169809..1df47fba8 100644 --- a/src/scala/scripts/BUILD +++ b/src/scala/scripts/BUILD @@ -31,18 +31,10 @@ scala_library( scala_library( name = "scalapb_worker_lib", srcs = ["ScalaPBWorker.scala"], - unused_dependency_checker_ignored_targets = [ - "//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java", - ], visibility = ["//visibility:public"], - runtime_deps = [ - "//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java", - ], deps = [ ":scala_proto_request_extractor", - "//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java", - "//external:io_bazel_rules_scala/dependency/proto/protoc_bridge", - "//external:io_bazel_rules_scala/dependency/proto/scalapb_plugin", + "//scala_proto:scalapb_worker_deps", "//src/java/io/bazel/rulesscala/io_utils", "//src/java/io/bazel/rulesscala/jar", "//src/java/io/bazel/rulesscala/worker", diff --git a/test/src/main/scala/scalarules/test/extra_protobuf_generator/BUILD b/test/src/main/scala/scalarules/test/extra_protobuf_generator/BUILD index 01cbc4fb0..b14f392ee 100644 --- a/test/src/main/scala/scalarules/test/extra_protobuf_generator/BUILD +++ b/test/src/main/scala/scalarules/test/extra_protobuf_generator/BUILD @@ -5,8 +5,6 @@ scala_library( srcs = ["ExtraProtobufGenerator.scala"], visibility = ["//visibility:public"], deps = [ - "//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java", - "//external:io_bazel_rules_scala/dependency/proto/protoc_bridge", - "//external:io_bazel_rules_scala/dependency/proto/scalapb_plugin", + "//scala_proto:scalapb_worker_deps", ], )