From 50418688569147af6aad4843c26fc80591c32cc3 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Fri, 11 Sep 2020 11:08:44 +0300 Subject: [PATCH 1/7] Inject Scalapb deps via providers on the toolchain --- scala_proto/BUILD | 15 +++++++++------ scala_proto/private/scalapb_aspect.bzl | 24 ++++++++++++++---------- scala_proto/scala_proto_toolchain.bzl | 9 +++++++++ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/scala_proto/BUILD b/scala_proto/BUILD index a7c0bc0c9..8538e230a 100644 --- a/scala_proto/BUILD +++ b/scala_proto/BUILD @@ -1,6 +1,7 @@ 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:providers.bzl", "declare_deps_provider") toolchain_type( name = "toolchain_type", @@ -38,14 +39,16 @@ toolchain( visibility = ["//visibility:public"], ) -java_library( - name = "default_scalapb_compile_dependencies", +declare_deps_provider( + name = "scalapb_compile_deps", + deps_id = "scalapb_compile_deps", + deps = DEFAULT_SCALAPB_COMPILE_DEPS, visibility = ["//visibility:public"], - exports = DEFAULT_SCALAPB_COMPILE_DEPS, ) -java_library( - name = "default_scalapb_grpc_dependencies", +declare_deps_provider( + name = "scalapb_grpc_deps", + deps_id = "scalapb_grpc_deps", + deps = DEFAULT_SCALAPB_GRPC_DEPS, visibility = ["//visibility:public"], - exports = DEFAULT_SCALAPB_GRPC_DEPS, ) diff --git a/scala_proto/private/scalapb_aspect.bzl b/scala_proto/private/scalapb_aspect.bzl index 7c1da1792..9d44ae360 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,18 @@ 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"] + 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, 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, 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,13 +239,11 @@ 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 = "host", + default = "@com_google_protobuf//:protoc", + ), }, toolchains = [ "@io_bazel_rules_scala//scala:toolchain_type", diff --git a/scala_proto/scala_proto_toolchain.bzl b/scala_proto/scala_proto_toolchain.bzl index d13aa2b47..a0f6760b3 100644 --- a/scala_proto/scala_proto_toolchain.bzl +++ b/scala_proto/scala_proto_toolchain.bzl @@ -1,4 +1,5 @@ load("//scala_proto:default_dep_sets.bzl", "DEFAULT_SCALAPB_COMPILE_DEPS", "DEFAULT_SCALAPB_GRPC_DEPS") +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") def _scala_proto_toolchain_impl(ctx): toolchain = platform_common.ToolchainInfo( @@ -10,6 +11,7 @@ def _scala_proto_toolchain_impl(ctx): extra_generator_dependencies = ctx.attr.extra_generator_dependencies, scalac = ctx.attr.scalac, named_generators = ctx.attr.named_generators, + dep_providers = ctx.attr.dep_providers, ) return [toolchain] @@ -41,5 +43,12 @@ scala_proto_toolchain = rule( "@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac", ), ), + "dep_providers": attr.label_list( + default = [ + "//scala_proto:scalapb_compile_deps", + "//scala_proto:scalapb_grpc_deps", + ], + providers = [DepsInfo], + ), }, ) From 86b63cfcae09d43a0c9e8666f53dba2d334090a0 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Fri, 11 Sep 2020 11:16:04 +0300 Subject: [PATCH 2/7] Update scalapb toolchain deps docs --- docs/scala_proto_library.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) 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 From 3b66e898413277e73864fea178d67d7bbd92c7fe Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Mon, 14 Sep 2020 10:32:41 +0300 Subject: [PATCH 3/7] Lint --- scala_proto/BUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scala_proto/BUILD b/scala_proto/BUILD index 8538e230a..b22b1a942 100644 --- a/scala_proto/BUILD +++ b/scala_proto/BUILD @@ -42,13 +42,13 @@ toolchain( declare_deps_provider( name = "scalapb_compile_deps", deps_id = "scalapb_compile_deps", - deps = DEFAULT_SCALAPB_COMPILE_DEPS, visibility = ["//visibility:public"], + deps = DEFAULT_SCALAPB_COMPILE_DEPS, ) declare_deps_provider( name = "scalapb_grpc_deps", deps_id = "scalapb_grpc_deps", - deps = DEFAULT_SCALAPB_GRPC_DEPS, visibility = ["//visibility:public"], + deps = DEFAULT_SCALAPB_GRPC_DEPS, ) From 258a02a5920d0314e1cd4b946ef54a3f8b49dab6 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Mon, 14 Sep 2020 11:15:59 +0300 Subject: [PATCH 4/7] Use external names for default labels --- scala_proto/scala_proto_toolchain.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scala_proto/scala_proto_toolchain.bzl b/scala_proto/scala_proto_toolchain.bzl index a0f6760b3..0b462021f 100644 --- a/scala_proto/scala_proto_toolchain.bzl +++ b/scala_proto/scala_proto_toolchain.bzl @@ -45,8 +45,8 @@ scala_proto_toolchain = rule( ), "dep_providers": attr.label_list( default = [ - "//scala_proto:scalapb_compile_deps", - "//scala_proto:scalapb_grpc_deps", + "@io_bazel_rules_scala//scala_proto:scalapb_compile_deps", + "@io_bazel_rules_scala//scala_proto:scalapb_grpc_deps", ], providers = [DepsInfo], ), From f9a18bfecfb9d4a0b2790088df86deae241a82c0 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Thu, 17 Sep 2020 11:40:14 +0300 Subject: [PATCH 5/7] 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. --- scala_proto/BUILD | 50 +++++++++++++++++-- .../scala_proto_default_repositories.bzl | 2 + scala_proto/private/scalapb_aspect.bzl | 10 +++- scala_proto/scala_proto_toolchain.bzl | 32 ++++++++++-- src/scala/scripts/BUILD | 10 +--- .../test/extra_protobuf_generator/BUILD | 4 +- 6 files changed, 87 insertions(+), 21 deletions(-) diff --git a/scala_proto/BUILD b/scala_proto/BUILD index b22b1a942..376ca213e 100644 --- a/scala_proto/BUILD +++ b/scala_proto/BUILD @@ -1,6 +1,15 @@ 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( @@ -8,6 +17,16 @@ 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"], @@ -23,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"], @@ -40,15 +65,32 @@ toolchain( ) declare_deps_provider( - name = "scalapb_compile_deps", + 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", + 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"], + 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", + ], +) + +export_scalapb_toolchain_deps( + name = "scalapb_worker_deps", + deps_id = "scalapb_worker_deps", + visibility = ["//visibility:public"], +) 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 9d44ae360..bbfa1de51 100644 --- a/scala_proto/private/scalapb_aspect.bzl +++ b/scala_proto/private/scalapb_aspect.bzl @@ -140,16 +140,21 @@ def _scalapb_aspect_impl(target, ctx): compile_protos = sorted(target_ti.direct_sources) transitive_protos = sorted(target_ti.transitive_sources.to_list()) + 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 = [] - compile_deps = find_deps_info_on(ctx, toolchain_type_label, "scalapb_compile_deps").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, toolchain_type_label, "scalapb_grpc_deps").deps + grpc_deps = find_deps_info_on(ctx, deps_toolchain_type_label, "scalapb_grpc_deps").deps flags.append("grpc") imps.extend([dep[JavaInfo] for dep in grpc_deps]) @@ -248,5 +253,6 @@ scalapb_aspect = aspect( 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 0b462021f..b888b80e3 100644 --- a/scala_proto/scala_proto_toolchain.bzl +++ b/scala_proto/scala_proto_toolchain.bzl @@ -1,5 +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( @@ -11,7 +12,6 @@ def _scala_proto_toolchain_impl(ctx): extra_generator_dependencies = ctx.attr.extra_generator_dependencies, scalac = ctx.attr.scalac, named_generators = ctx.attr.named_generators, - dep_providers = ctx.attr.dep_providers, ) return [toolchain] @@ -43,12 +43,38 @@ scala_proto_toolchain = rule( "@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac", ), ), + }, +) + +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", - "@io_bazel_rules_scala//scala_proto:scalapb_grpc_deps", + "@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", ], 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, + ), + }, + 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", ], ) From 7aa5c17859951df2606b62e7c2a2d736b553b330 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Fri, 18 Sep 2020 13:09:08 +0300 Subject: [PATCH 6/7] Update toolchain transitions --- scala_proto/scala_proto_toolchain.bzl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scala_proto/scala_proto_toolchain.bzl b/scala_proto/scala_proto_toolchain.bzl index b888b80e3..f32d98ea2 100644 --- a/scala_proto/scala_proto_toolchain.bzl +++ b/scala_proto/scala_proto_toolchain.bzl @@ -30,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, ), @@ -61,6 +61,7 @@ scala_proto_deps_toolchain = rule( "@io_bazel_rules_scala//scala_proto:scalapb_grpc_deps_provider", "@io_bazel_rules_scala//scala_proto:scalapb_worker_deps_provider", ], + cfg = "target", providers = [DepsInfo], ), }, From 5e51126b857eb5d553c2efa2f06eaadacbac6c3c Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Fri, 16 Oct 2020 17:25:09 +0300 Subject: [PATCH 7/7] Use incompatible_use_toolchain_transition --- scala_proto/private/scalapb_aspect.bzl | 3 ++- scala_proto/scala_proto_toolchain.bzl | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/scala_proto/private/scalapb_aspect.bzl b/scala_proto/private/scalapb_aspect.bzl index bbfa1de51..eabea5da2 100644 --- a/scala_proto/private/scalapb_aspect.bzl +++ b/scala_proto/private/scalapb_aspect.bzl @@ -246,10 +246,11 @@ scalapb_aspect = aspect( attrs = { "_protoc": attr.label( executable = True, - cfg = "host", + 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", diff --git a/scala_proto/scala_proto_toolchain.bzl b/scala_proto/scala_proto_toolchain.bzl index f32d98ea2..4a12f9ca9 100644 --- a/scala_proto/scala_proto_toolchain.bzl +++ b/scala_proto/scala_proto_toolchain.bzl @@ -77,5 +77,6 @@ export_scalapb_toolchain_deps = rule( mandatory = True, ), }, + incompatible_use_toolchain_transition = True, toolchains = ["@io_bazel_rules_scala//scala_proto:deps_toolchain_type"], )