From d64671e8cd136a8c1e02dc91b0b0d82e6d81e882 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Wed, 1 Jul 2020 14:27:39 +0300 Subject: [PATCH 1/5] Add deps toolchain infra --- scala/private/toolchain_deps/BUILD | 0 .../private/toolchain_deps/toolchain_deps.bzl | 18 ++ scala/providers.bzl | 21 +++ scala/toolchains/BUILD | 1 + scala/toolchains/README.md | 176 ++++++++++++++++++ scala/toolchains/toolchains.bzl | 16 ++ 6 files changed, 232 insertions(+) create mode 100644 scala/private/toolchain_deps/BUILD create mode 100644 scala/private/toolchain_deps/toolchain_deps.bzl create mode 100644 scala/toolchains/BUILD create mode 100644 scala/toolchains/README.md create mode 100644 scala/toolchains/toolchains.bzl diff --git a/scala/private/toolchain_deps/BUILD b/scala/private/toolchain_deps/BUILD new file mode 100644 index 000000000..e69de29bb diff --git a/scala/private/toolchain_deps/toolchain_deps.bzl b/scala/private/toolchain_deps/toolchain_deps.bzl new file mode 100644 index 000000000..15fd822e4 --- /dev/null +++ b/scala/private/toolchain_deps/toolchain_deps.bzl @@ -0,0 +1,18 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") + +def _log_required_provider_id(target, toolchain_type_label, provider_id): + fail(target + " requires mapping of " + provider_id + " provider id on the toolchain " + toolchain_type_label) + +def java_info_for_deps(deps): + return [java_common.merge([dep[JavaInfo] for dep in deps])] + +def expose_toolchain_deps(ctx, toolchain_type_label): + dep_provider_id = ctx.attr.provider_id + dep_providers_map = getattr(ctx.toolchains[toolchain_type_label], "dep_providers") + dep_provider = {v: k for k, v in dep_providers_map.items()}.get(dep_provider_id) + + if dep_provider == None: + _log_required_provider_id(ctx.attr.name, toolchain_type_label, dep_provider_id) + + deps = dep_provider[DepsInfo].deps + return java_info_for_deps(deps) diff --git a/scala/providers.bzl b/scala/providers.bzl index 66fc97f0b..339f3ca4b 100644 --- a/scala/providers.bzl +++ b/scala/providers.bzl @@ -24,3 +24,24 @@ declare_scalac_provider = rule( "default_macro_classpath": attr.label_list(allow_files = True), }, ) + +DepsInfo = provider( + doc = "Dependencies needed for specifc rules", + fields = [ + "deps", + ], +) + +def _declare_deps_provider(ctx): + return [ + DepsInfo( + deps = ctx.attr.deps, + ), + ] + +declare_deps_provider = rule( + implementation = _declare_deps_provider, + attrs = { + "deps": attr.label_list(allow_files = True), + }, +) diff --git a/scala/toolchains/BUILD b/scala/toolchains/BUILD new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/scala/toolchains/BUILD @@ -0,0 +1 @@ + diff --git a/scala/toolchains/README.md b/scala/toolchains/README.md new file mode 100644 index 000000000..db13b7447 --- /dev/null +++ b/scala/toolchains/README.md @@ -0,0 +1,176 @@ +# Toolchains for Deps + +## Motivation and design patterns + +Provide a way to configure rules_scala without using [problematic](https://github.com/bazelbuild/bazel/issues/1952) bind. + +### Patterns +- Dependency providers on toolchains for toolchain aware rules + +This is recommended pattern, when a rule implementation knows how to consume information from a toolchain. + +- Rules to export deps as targets to be depended on by other rules not aware of toolchains + +This pattern is used to pass dependencies to rules, which are not aware of particular toolchain. For example, Scala +compile classpath deps which are defined on Scala toolchains can be made available to non scala rules by creating a +toolchain aware rule to export deps. + +### Usage +Users who want to customize dependecies for a feature will have to declare deps providers and wire them up in the + toolchain. Eg.: + +```python +declare_deps_provider( + name = "scalapb_compile_deps_provider", + visibility = ["//visibility:public"], + deps = [ + "@com_lihaoyi_fastparse_2_12", + "@com_thesamet_scalapb_lenses_2_12", + "@com_thesamet_scalapb_scalapb_runtime_2_12", + "@io_grpc_grpc_protobuf", + "@org_scala_lang_scala_library", + ], +) + +declare_deps_provider( + name = "scalapb_grpc_deps_provider", + visibility = ["//visibility:public"], + deps = [ + "@com_google_guava_guava", + "@com_google_instrumentation_instrumentation_api", + "@com_lmax_disruptor", + "@com_thesamet_scalapb_scalapb_runtime_grpc_2_12", + "@io_grpc_grpc_api", + "@io_grpc_grpc_context", + "@io_grpc_grpc_core", + "@io_grpc_grpc_netty", + "@io_grpc_grpc_protobuf", + "@io_grpc_grpc_stub", + "@io_netty_netty_buffer", + "@io_netty_netty_codec", + "@io_netty_netty_codec_http", + "@io_netty_netty_codec_http2", + "@io_netty_netty_codec_socks", + "@io_netty_netty_common", + "@io_netty_netty_handler", + "@io_netty_netty_handler_proxy", + "@io_netty_netty_resolver", + "@io_netty_netty_transport", + "@io_opencensus_opencensus_api", + "@io_opencensus_opencensus_contrib_grpc_metrics", + "@io_opencensus_opencensus_impl", + "@io_opencensus_opencensus_impl_core", + "@io_perfmark_perfmark_api", + ], +) + +declare_deps_toolchain( + name = "proto_deps_toolchain_impl", + dep_providers = { + ":scalapb_compile_deps_provider": "compile_deps", + ":scalapb_grpc_deps_provider": "grpc_deps", + }, + visibility = ["//visibility:public"], +) + +toolchain( + name = "proto_deps_toolchain", + toolchain = ":proto_deps_toolchain_impl", + toolchain_type = "@io_bazel_rules_scala//scala_proto/toolchain:proto_toolchain_type", + visibility = ["//visibility:public"], +) +``` +## Exporting deps via toolchains + +Toolchains can be used to provide dependencies indirectly. For rules which are not aware of specific toolchains, +dependencies can be provided by adding to deps a target which knows how to export from a toolchain. Eg.: +```python +# target which exports toolchain deps from provider with ID "compile_deps" +proto_toolchain_deps( + name = "default_scalapb_compile_dependencies", + provider_id = "compile_deps", + visibility = ["//visibility:public"], +) + +# provider declaration +declare_deps_provider( + name = "scalapb_grpc_deps_provider", + deps = ["@dep1", "@dep2"], + visibility = ["//visibility:public"], +) + +# toolchain declaration: +toolchain_type( + name = "proto_toolchain_type", + visibility = ["//visibility:public"], +) + +toolchain( + name = "proto_toolchain", + toolchain = ":proto_toolchain_impl", + toolchain_type = ":proto_toolchain_type", + visibility = ["//visibility:public"], +) + +declare_deps_toolchain( + name = "proto_toolchain_impl", + dep_providers = { + ":scalapb_compile_deps_provider": "compile_deps", + ":scalapb_grpc_deps_provider": "grpc_deps" + }, + visibility = ["//visibility:public"], +) +``` + +To define toolchain deps with deps exporting, the follwoing steps need to be taken: +1. Declare dep providers with `declare_deps_provider` +2. Define `toolchain_type`, declare toolchain with infra helper `declare_deps_toolchain`, wire them up with `toolchain` +3. Create rule exposing toolchain deps using infra helper `expose_toolchain_deps` +4. Declare deps targets +5. Use deps targets instead of bind targets! + +## Reusable infra code to define toolchains for dependencies + +### Reusable symbols +- provider `DepsProvider` - provider with a field `deps`, which contains dep list to be provided via toolchain +- rule `declare_deps_provider` - used to declare target with `DepsProvider`. Eg.: +```python +declare_deps_provider( + name = "scalapb_grpc_deps_provider", + deps = ["@dep1", "@dep2"], + visibility = ["//visibility:public"], +) +``` +- rule `declare_deps_toolchain` - used to declare toolchains for deps providers. Eg.: +```python +declare_deps_toolchain( + name = "proto_toolchain_impl", + dep_providers = { + ":scalapb_compile_deps_provider": "compile_deps", + ":scalapb_grpc_deps_provider": "grpc_deps" + }, + visibility = ["//visibility:public"], +) + +``` +Attribute `dep_providers` is maps dep provider label to an id used for indirection in toolchain exporting rules + +- `def expose_toolchain_deps(ctx, toolchain_type_label)` - helper to export export deps from toolchain. Intended to be +used when defining toolchain deps exporting rules. Eg.: +```python +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps") + +def _toolchain_deps(ctx): + toolchain_type_label = "@io_bazel_rules_scala//scala_proto/toolchain:proto_toolchain_type" + return expose_toolchain_deps(ctx, toolchain_type_label) + +proto_toolchain_deps = rule( + implementation = _toolchain_deps, + attrs = { + "provider_id": attr.string( + mandatory = True, + ), + }, + toolchains = ["@io_bazel_rules_scala//scala_proto/toolchain:proto_toolchain_type"], +) +``` diff --git a/scala/toolchains/toolchains.bzl b/scala/toolchains/toolchains.bzl new file mode 100644 index 000000000..36a685b49 --- /dev/null +++ b/scala/toolchains/toolchains.bzl @@ -0,0 +1,16 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") + +def _deps_toolchain(ctx): + toolchain_info = platform_common.ToolchainInfo( + dep_providers = ctx.attr.dep_providers, + ) + return [toolchain_info] + +declare_deps_toolchain = rule( + attrs = { + "dep_providers": attr.label_keyed_string_dict( + providers = [DepsInfo], + ), + }, + implementation = _deps_toolchain, +) From 0e877d7ef15cab230aa58beca7dfebac7c9873f5 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Tue, 7 Jul 2020 23:13:32 +0300 Subject: [PATCH 2/5] Use deps toolchain instead of binds --- scala/BUILD | 35 +++++++++++++++++++ scala/private/common_attributes.bzl | 2 +- scala/private/rules/scala_junit_test.bzl | 2 +- scala/private/rules/scala_test.bzl | 2 +- scala/private/toolchain_deps/BUILD | 27 ++++++++++++++ .../toolchain_deps/toolchain_dep_rules.bzl | 29 +++++++++++++++ scala/support/BUILD | 2 +- scala/toolchains.bzl | 6 +++- scala_proto/default_dep_sets.bzl | 2 +- specs2/BUILD | 6 ++-- specs2/specs2_junit.bzl | 4 ++- src/java/io/bazel/rulesscala/scalac/BUILD | 10 +----- .../scalac/jvm_export_toolchain.bzl | 23 ------------ .../bazel/rules_scala/scaladoc_support/BUILD | 8 ++--- .../io/bazel/rules_scala/tut_support/BUILD | 2 +- test/BUILD | 2 +- .../dependency_analyzer/src/main/BUILD | 6 ++-- third_party/utils/src/test/BUILD | 3 +- tut_rule/tut.bzl | 2 +- twitter_scrooge/twitter_scrooge.bzl | 4 +-- 20 files changed, 118 insertions(+), 59 deletions(-) create mode 100644 scala/private/toolchain_deps/toolchain_dep_rules.bzl delete mode 100644 src/java/io/bazel/rulesscala/scalac/jvm_export_toolchain.bzl diff --git a/scala/BUILD b/scala/BUILD index 55dc0b9d8..b5f5356fe 100644 --- a/scala/BUILD +++ b/scala/BUILD @@ -4,6 +4,8 @@ load( _declare_scalac_provider = "declare_scalac_provider", ) load("//scala:scala_toolchain.bzl", "scala_toolchain") +load("//scala/toolchains:toolchains.bzl", "declare_deps_toolchain") +load("//scala:providers.bzl", "declare_deps_provider") toolchain_type( name = "toolchain_type", @@ -94,3 +96,36 @@ java_library( srcs = ["PlaceHolderClassToCreateEmptyJarForScalaImport.java"], visibility = ["//visibility:public"], ) + +toolchain_type( + name = "deps_toolchain_type", + visibility = ["//visibility:public"], +) + +toolchain( + name = "deps_toolchain", + toolchain = "@io_bazel_rules_scala//scala:deps_toolchain_impl", + toolchain_type = "@io_bazel_rules_scala//scala:deps_toolchain_type", + visibility = ["//visibility:public"], +) + +declare_deps_provider( + name = "scala_xml_provider", + visibility = ["//visibility:public"], + deps = ["//external:io_bazel_rules_scala/dependency/scala/scala_xml"], +) + +declare_deps_provider( + name = "parser_combinators_provider", + visibility = ["//visibility:public"], + deps = ["//external:io_bazel_rules_scala/dependency/scala/parser_combinators"], +) + +declare_deps_toolchain( + name = "deps_toolchain_impl", + dep_providers = { + "@io_bazel_rules_scala//scala:scala_xml_provider": "scala_xml", + "@io_bazel_rules_scala//scala:parser_combinators_provider": "parser_combinators", + }, + visibility = ["//visibility:public"], +) diff --git a/scala/private/common_attributes.bzl b/scala/private/common_attributes.bzl index 93b84751c..9a7046e0f 100644 --- a/scala/private/common_attributes.bzl +++ b/scala/private/common_attributes.bzl @@ -118,7 +118,7 @@ resolve_deps = { "_scala_toolchain": attr.label_list( default = [ Label( - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "@io_bazel_rules_scala//scala/private/toolchain_deps:scala_library_classpath", ), ], allow_files = False, diff --git a/scala/private/rules/scala_junit_test.bzl b/scala/private/rules/scala_junit_test.bzl index 93792f989..e76059c05 100644 --- a/scala/private/rules/scala_junit_test.bzl +++ b/scala/private/rules/scala_junit_test.bzl @@ -91,7 +91,7 @@ _junit_resolve_deps = { "_scala_toolchain": attr.label_list( default = [ Label( - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "@io_bazel_rules_scala//scala/private/toolchain_deps:scala_library_classpath", ), Label("//external:io_bazel_rules_scala/dependency/junit/junit"), Label( diff --git a/scala/private/rules/scala_test.bzl b/scala/private/rules/scala_test.bzl index 75e94ca52..be119900c 100644 --- a/scala/private/rules/scala_test.bzl +++ b/scala/private/rules/scala_test.bzl @@ -81,7 +81,7 @@ _test_resolve_deps = { "_scala_toolchain": attr.label_list( default = [ Label( - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "@io_bazel_rules_scala//scala/private/toolchain_deps:scala_library_classpath", ), Label( "//external:io_bazel_rules_scala/dependency/scalatest/scalatest", diff --git a/scala/private/toolchain_deps/BUILD b/scala/private/toolchain_deps/BUILD index e69de29bb..824b9c46d 100644 --- a/scala/private/toolchain_deps/BUILD +++ b/scala/private/toolchain_deps/BUILD @@ -0,0 +1,27 @@ +load(":toolchain_dep_rules.bzl", "common_toolchain_deps", "scala_toolchain_deps") + +# dependencies from ScalacProvider +scala_toolchain_deps( + name = "scala_compile_classpath", + from_classpath = "default_repl_classpath", + visibility = ["//visibility:public"], +) + +scala_toolchain_deps( + name = "scala_library_classpath", + from_classpath = "default_classpath", + visibility = ["//visibility:public"], +) + +# dependencies from DepsInfo +common_toolchain_deps( + name = "scala_xml", + provider_id = "scala_xml", + visibility = ["//visibility:public"], +) + +common_toolchain_deps( + name = "parser_combinators", + provider_id = "parser_combinators", + visibility = ["//visibility:public"], +) diff --git a/scala/private/toolchain_deps/toolchain_dep_rules.bzl b/scala/private/toolchain_deps/toolchain_dep_rules.bzl new file mode 100644 index 000000000..1dae7b8bc --- /dev/null +++ b/scala/private/toolchain_deps/toolchain_dep_rules.bzl @@ -0,0 +1,29 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", _ScalacProvider = "ScalacProvider") +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps", "java_info_for_deps") + +def _scala_toolchain_deps(ctx): + _toolchain_type = "@io_bazel_rules_scala//scala:toolchain_type" + from_classpath = ctx.attr.from_classpath + + scalac_provider = ctx.toolchains[_toolchain_type].scalac_provider_attr[_ScalacProvider] + classpath_deps = getattr(scalac_provider, from_classpath) + return java_info_for_deps(classpath_deps) + +scala_toolchain_deps = rule( + implementation = _scala_toolchain_deps, + attrs = { + "from_classpath": attr.string(mandatory = True), + }, + toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"], +) + +def _common_toolchain_deps(ctx): + return expose_toolchain_deps(ctx, "@io_bazel_rules_scala//scala:deps_toolchain_type") + +common_toolchain_deps = rule( + implementation = _common_toolchain_deps, + attrs = { + "provider_id": attr.string(mandatory = True), + }, + toolchains = ["@io_bazel_rules_scala//scala:deps_toolchain_type"], +) diff --git a/scala/support/BUILD b/scala/support/BUILD index 2f70647da..d6e557705 100644 --- a/scala/support/BUILD +++ b/scala/support/BUILD @@ -24,7 +24,7 @@ scala_library( ], visibility = ["//visibility:public"], deps = [ - "//external:io_bazel_rules_scala/dependency/scala/scala_xml", "//external:io_bazel_rules_scala/dependency/scalatest/scalatest", + "//scala/private/toolchain_deps:scala_xml", ], ) diff --git a/scala/toolchains.bzl b/scala/toolchains.bzl index 89a2bdc08..77c934767 100644 --- a/scala/toolchains.bzl +++ b/scala/toolchains.bzl @@ -1,7 +1,11 @@ def scala_register_toolchains(): - native.register_toolchains("@io_bazel_rules_scala//scala:default_toolchain") + native.register_toolchains( + "@io_bazel_rules_scala//scala:deps_toolchain", + "@io_bazel_rules_scala//scala:default_toolchain", + ) def scala_register_unused_deps_toolchains(): native.register_toolchains( + "@io_bazel_rules_scala//scala:deps_toolchain", "@io_bazel_rules_scala//scala:unused_dependency_checker_error_toolchain", ) diff --git a/scala_proto/default_dep_sets.bzl b/scala_proto/default_dep_sets.bzl index ee8a0b6f3..58aa63d44 100644 --- a/scala_proto/default_dep_sets.bzl +++ b/scala_proto/default_dep_sets.bzl @@ -11,7 +11,7 @@ DEFAULT_SCALAPB_COMPILE_DEPS = [ "//external:io_bazel_rules_scala/dependency/com_google_protobuf/protobuf_java", "//external:io_bazel_rules_scala/dependency/proto/scalapb_lenses", "//external:io_bazel_rules_scala/dependency/proto/scalapb_fastparse", - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", ] DEFAULT_SCALAPB_GRPC_DEPS = [ diff --git a/specs2/BUILD b/specs2/BUILD index fda8ee13e..7b792d43c 100644 --- a/specs2/BUILD +++ b/specs2/BUILD @@ -12,9 +12,7 @@ java_import( "@io_bazel_rules_scala_org_specs2_specs2_matcher", ], deps = [ - "//external:io_bazel_rules_scala/dependency/scala/parser_combinators", - "//external:io_bazel_rules_scala/dependency/scala/scala_library", - "//external:io_bazel_rules_scala/dependency/scala/scala_reflect", - "//external:io_bazel_rules_scala/dependency/scala/scala_xml", + "//scala/private/toolchain_deps:scala_library_classpath", + "//scala/private/toolchain_deps:scala_xml", ], ) diff --git a/specs2/specs2_junit.bzl b/specs2/specs2_junit.bzl index 9c9885b2c..f5bd29a9e 100644 --- a/specs2/specs2_junit.bzl +++ b/specs2/specs2_junit.bzl @@ -52,7 +52,9 @@ def specs2_junit_repositories( actual = "@io_bazel_rules_scala_org_specs2_specs2_junit", ) + native.register_toolchains("@io_bazel_rules_scala//specs2/toolchain:specs2_toolchain") + def specs2_junit_dependencies(): return specs2_dependencies() + [ - "//external:io_bazel_rules_scala/dependency/specs2/specs2_junit", + "@io_bazel_rules_scala//specs2:specs2_junit_classpath", ] diff --git a/src/java/io/bazel/rulesscala/scalac/BUILD b/src/java/io/bazel/rulesscala/scalac/BUILD index 6c7841905..14b07251c 100644 --- a/src/java/io/bazel/rulesscala/scalac/BUILD +++ b/src/java/io/bazel/rulesscala/scalac/BUILD @@ -1,12 +1,4 @@ load("@rules_java//java:defs.bzl", "java_binary") -load( - ":jvm_export_toolchain.bzl", - _export_scalac_repositories_from_toolchain_to_jvm = "export_scalac_repositories_from_toolchain_to_jvm", -) - -_export_scalac_repositories_from_toolchain_to_jvm( - name = "exported_scalac_repositories_from_toolchain_to_jvm", -) java_binary( name = "scalac", @@ -20,8 +12,8 @@ java_binary( main_class = "io.bazel.rulesscala.scalac.ScalacWorker", visibility = ["//visibility:public"], deps = [ - ":exported_scalac_repositories_from_toolchain_to_jvm", "//external:io_bazel_rules_scala/dependency/commons_io/commons_io", + "//scala/private/toolchain_deps:scala_compile_classpath", "//third_party/bazel/src/main/protobuf:worker_protocol_java_proto", "@io_bazel_rules_scala//src/java/io/bazel/rulesscala/jar", "@io_bazel_rules_scala//src/java/io/bazel/rulesscala/worker", diff --git a/src/java/io/bazel/rulesscala/scalac/jvm_export_toolchain.bzl b/src/java/io/bazel/rulesscala/scalac/jvm_export_toolchain.bzl deleted file mode 100644 index 6636a3add..000000000 --- a/src/java/io/bazel/rulesscala/scalac/jvm_export_toolchain.bzl +++ /dev/null @@ -1,23 +0,0 @@ -load( - "@io_bazel_rules_scala//scala:providers.bzl", - _ScalacProvider = "ScalacProvider", -) - -def _files_of(deps): - files = [] - for dep in deps: - files.append(dep[JavaInfo].transitive_compile_time_jars) - return depset(transitive = files) - -def _export_scalac_repositories_from_toolchain_to_jvm_impl(ctx): - default_repl_classpath_deps = ctx.toolchains["@io_bazel_rules_scala//scala:toolchain_type"].scalac_provider_attr[_ScalacProvider].default_repl_classpath - default_repl_classpath_files = _files_of( - default_repl_classpath_deps, - ).to_list() - providers = [JavaInfo(output_jar = jar, compile_jar = jar) for jar in default_repl_classpath_files] - return [java_common.merge(providers)] - -export_scalac_repositories_from_toolchain_to_jvm = rule( - _export_scalac_repositories_from_toolchain_to_jvm_impl, - toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"], -) diff --git a/src/scala/io/bazel/rules_scala/scaladoc_support/BUILD b/src/scala/io/bazel/rules_scala/scaladoc_support/BUILD index b48ad5fb4..1b73504c2 100644 --- a/src/scala/io/bazel/rules_scala/scaladoc_support/BUILD +++ b/src/scala/io/bazel/rules_scala/scaladoc_support/BUILD @@ -8,10 +8,8 @@ scala_binary( main_class = "scala.tools.nsc.ScalaDoc", visibility = ["//visibility:public"], runtime_deps = [ - "//external:io_bazel_rules_scala/dependency/scala/parser_combinators", - "//external:io_bazel_rules_scala/dependency/scala/scala_compiler", - "//external:io_bazel_rules_scala/dependency/scala/scala_library", - "//external:io_bazel_rules_scala/dependency/scala/scala_reflect", - "//external:io_bazel_rules_scala/dependency/scala/scala_xml", + "//scala/private/toolchain_deps:parser_combinators", + "//scala/private/toolchain_deps:scala_compile_classpath", + "//scala/private/toolchain_deps:scala_xml", ], ) diff --git a/src/scala/io/bazel/rules_scala/tut_support/BUILD b/src/scala/io/bazel/rules_scala/tut_support/BUILD index cf4a31eec..bc710c665 100644 --- a/src/scala/io/bazel/rules_scala/tut_support/BUILD +++ b/src/scala/io/bazel/rules_scala/tut_support/BUILD @@ -5,7 +5,7 @@ scala_library( srcs = ["TutCompiler.scala"], visibility = ["//visibility:public"], runtime_deps = [ - "//external:io_bazel_rules_scala/dependency/scala/scala_compiler", + "//scala/private/toolchain_deps:scala_compile_classpath", ], deps = [ "//external:io_bazel_rules_scala/dependency/tut/tut_core", diff --git a/test/BUILD b/test/BUILD index 5ff5302c1..997c82e5c 100644 --- a/test/BUILD +++ b/test/BUILD @@ -30,7 +30,7 @@ java_binary( main_class = "scalarules.test.JavaBinary", runtime_deps = [ ":OtherJavaLib", - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", ], deps = [ ":Exported", diff --git a/third_party/dependency_analyzer/src/main/BUILD b/third_party/dependency_analyzer/src/main/BUILD index e9e00a221..b6151e3eb 100644 --- a/third_party/dependency_analyzer/src/main/BUILD +++ b/third_party/dependency_analyzer/src/main/BUILD @@ -12,8 +12,7 @@ scala_library_for_plugin_bootstrapping( resources = ["resources/scalac-plugin.xml"], visibility = ["//visibility:public"], deps = [ - "//external:io_bazel_rules_scala/dependency/scala/scala_compiler", - "//external:io_bazel_rules_scala/dependency/scala/scala_reflect", + "//scala/private/toolchain_deps:scala_compile_classpath", ], ) @@ -30,7 +29,6 @@ scala_library_for_plugin_bootstrapping( visibility = ["//visibility:public"], deps = [ ":scala_version", - "//external:io_bazel_rules_scala/dependency/scala/scala_compiler", - "//external:io_bazel_rules_scala/dependency/scala/scala_reflect", + "//scala/private/toolchain_deps:scala_compile_classpath", ], ) diff --git a/third_party/utils/src/test/BUILD b/third_party/utils/src/test/BUILD index 9c3e8bafb..efc3cbc08 100644 --- a/third_party/utils/src/test/BUILD +++ b/third_party/utils/src/test/BUILD @@ -10,8 +10,7 @@ scala_library( ], visibility = ["//visibility:public"], deps = [ - "//external:io_bazel_rules_scala/dependency/scala/scala_compiler", - "//external:io_bazel_rules_scala/dependency/scala/scala_reflect", + "//scala/private/toolchain_deps:scala_compile_classpath", "//third_party/dependency_analyzer/src/main:dependency_analyzer", ], ) diff --git a/tut_rule/tut.bzl b/tut_rule/tut.bzl index 924b21ea6..97e5a12bb 100644 --- a/tut_rule/tut.bzl +++ b/tut_rule/tut.bzl @@ -50,7 +50,7 @@ def scala_tut_doc(**kw): main_class = "io.bazel.rules_scala.tut_support.TutCompiler", deps = deps + [ "@io_bazel_rules_scala//src/scala/io/bazel/rules_scala/tut_support:tut_compiler_lib", - "//external:io_bazel_rules_scala/dependency/scala/scala_reflect", + "//scala/private/toolchain_deps:scala_library_classpath", ], ) native.genrule( diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index 2b6ca6658..aa4f61da2 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -430,7 +430,7 @@ common_attrs = { providers = [JavaInfo], default = [ Label( - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", ), Label( "//external:io_bazel_rules_scala/dependency/thrift/libthrift", @@ -548,7 +548,7 @@ scrooge_scala_import = rule( providers = [JavaInfo], default = [ Label( - "//external:io_bazel_rules_scala/dependency/scala/scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", ), Label( "//external:io_bazel_rules_scala/dependency/thrift/libthrift", From bddcfb5ee1f259cb42760fcc802d51e0b92e1b29 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Wed, 1 Jul 2020 14:30:03 +0300 Subject: [PATCH 3/5] Add deps toolchain for ScalaPB --- scala_proto/BUILD | 10 ++++--- scala_proto/private/scalapb_aspect.bzl | 4 +-- scala_proto/scala_proto.bzl | 13 ++------- scala_proto/toolchain/BUILD | 37 ++++++++++++++++++++++++++ scala_proto/toolchain/toolchain.bzl | 16 +++++++++++ 5 files changed, 63 insertions(+), 17 deletions(-) create mode 100644 scala_proto/toolchain/BUILD create mode 100644 scala_proto/toolchain/toolchain.bzl diff --git a/scala_proto/BUILD b/scala_proto/BUILD index a7c0bc0c9..52adf72ca 100644 --- a/scala_proto/BUILD +++ b/scala_proto/BUILD @@ -38,14 +38,16 @@ toolchain( visibility = ["//visibility:public"], ) -java_library( +load("//scala_proto/toolchain:toolchain.bzl", "proto_toolchain_deps") + +proto_toolchain_deps( name = "default_scalapb_compile_dependencies", + provider_id = "compile_deps", visibility = ["//visibility:public"], - exports = DEFAULT_SCALAPB_COMPILE_DEPS, ) -java_library( +proto_toolchain_deps( name = "default_scalapb_grpc_dependencies", + provider_id = "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 0844933f2..a818fbfba 100644 --- a/scala_proto/private/scalapb_aspect.bzl +++ b/scala_proto/private/scalapb_aspect.bzl @@ -230,10 +230,10 @@ scalapb_aspect = aspect( 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", + "@io_bazel_rules_scala//scala_proto:default_scalapb_compile_dependencies", ]), "_grpc_deps": attr.label_list(cfg = "target", default = [ - "//external:io_bazel_rules_scala/dependency/proto/grpc_deps", + "@io_bazel_rules_scala//scala_proto:default_scalapb_grpc_dependencies", ]), }, toolchains = [ diff --git a/scala_proto/scala_proto.bzl b/scala_proto/scala_proto.bzl index 2dd296f86..202558a00 100644 --- a/scala_proto/scala_proto.bzl +++ b/scala_proto/scala_proto.bzl @@ -20,17 +20,8 @@ load( ) def register_default_proto_dependencies(): - if native.existing_rule("io_bazel_rules_scala/dependency/proto/grpc_deps") == None: - native.bind( - name = "io_bazel_rules_scala/dependency/proto/grpc_deps", - actual = "@io_bazel_rules_scala//scala_proto:default_scalapb_grpc_dependencies", - ) - - if native.existing_rule("io_bazel_rules_scala/dependency/proto/implicit_compile_deps") == None: - native.bind( - name = "io_bazel_rules_scala/dependency/proto/implicit_compile_deps", - actual = "@io_bazel_rules_scala//scala_proto:default_scalapb_compile_dependencies", - ) + # for backwards compatibility register toolchain for deps + native.register_toolchains("@io_bazel_rules_scala//scala_proto/toolchain:proto_toolchain") def scala_proto_repositories( scala_version = _default_scala_version(), diff --git a/scala_proto/toolchain/BUILD b/scala_proto/toolchain/BUILD new file mode 100644 index 000000000..e5262ed13 --- /dev/null +++ b/scala_proto/toolchain/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "declare_deps_provider") +load("//scala/toolchains:toolchains.bzl", "declare_deps_toolchain") +load(":toolchain.bzl", "proto_toolchain_deps") +load("//scala_proto:default_dep_sets.bzl", "DEFAULT_SCALAPB_COMPILE_DEPS", "DEFAULT_SCALAPB_GRPC_DEPS") + +toolchain_type( + name = "proto_toolchain_type", + visibility = ["//visibility:public"], +) + +toolchain( + name = "proto_toolchain", + toolchain = ":proto_toolchain_impl", + toolchain_type = ":proto_toolchain_type", + visibility = ["//visibility:public"], +) + +declare_deps_provider( + name = "scalapb_compile_deps_provider", + visibility = ["//visibility:public"], + deps = DEFAULT_SCALAPB_COMPILE_DEPS, +) + +declare_deps_provider( + name = "scalapb_grpc_deps_provider", + visibility = ["//visibility:public"], + deps = DEFAULT_SCALAPB_GRPC_DEPS, +) + +declare_deps_toolchain( + name = "proto_toolchain_impl", + dep_providers = { + ":scalapb_compile_deps_provider": "compile_deps", + ":scalapb_grpc_deps_provider": "grpc_deps", + }, + visibility = ["//visibility:public"], +) diff --git a/scala_proto/toolchain/toolchain.bzl b/scala_proto/toolchain/toolchain.bzl new file mode 100644 index 000000000..058ac940d --- /dev/null +++ b/scala_proto/toolchain/toolchain.bzl @@ -0,0 +1,16 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps") + +def _toolchain_deps(ctx): + toolchain_type_label = "@io_bazel_rules_scala//scala_proto/toolchain:proto_toolchain_type" + return expose_toolchain_deps(ctx, toolchain_type_label) + +proto_toolchain_deps = rule( + implementation = _toolchain_deps, + attrs = { + "provider_id": attr.string( + mandatory = True, + ), + }, + toolchains = ["@io_bazel_rules_scala//scala_proto/toolchain:proto_toolchain_type"], +) From 5c2568a89729cef4558626985b8cabf298823ef4 Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Tue, 7 Jul 2020 23:14:05 +0300 Subject: [PATCH 4/5] Add deps toolchain for Specs2 --- specs2/BUILD | 21 ++++++++++++----- specs2/specs2.bzl | 2 +- specs2/toolchain/BUILD | 42 ++++++++++++++++++++++++++++++++++ specs2/toolchain/toolchain.bzl | 17 ++++++++++++++ test/aspect/aspect.bzl | 24 ++++++++----------- 5 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 specs2/toolchain/BUILD create mode 100644 specs2/toolchain/toolchain.bzl diff --git a/specs2/BUILD b/specs2/BUILD index 7b792d43c..8744c088a 100644 --- a/specs2/BUILD +++ b/specs2/BUILD @@ -1,4 +1,5 @@ load("@rules_java//java:defs.bzl", "java_import") +load("//specs2/toolchain:toolchain.bzl", "specs2_toolchain_deps") package(default_visibility = ["//visibility:public"]) @@ -6,13 +7,21 @@ java_import( name = "specs2", jars = [], exports = [ - "@io_bazel_rules_scala_org_specs2_specs2_common", - "@io_bazel_rules_scala_org_specs2_specs2_core", - "@io_bazel_rules_scala_org_specs2_specs2_fp", - "@io_bazel_rules_scala_org_specs2_specs2_matcher", + ":specs2_classpath", ], deps = [ - "//scala/private/toolchain_deps:scala_library_classpath", - "//scala/private/toolchain_deps:scala_xml", + "@io_bazel_rules_scala//scala/private/toolchain_deps:parser_combinators", + "@io_bazel_rules_scala//scala/private/toolchain_deps:scala_library_classpath", + "@io_bazel_rules_scala//scala/private/toolchain_deps:scala_xml", ], ) + +specs2_toolchain_deps( + name = "specs2_classpath", + provider_id = "specs2", +) + +specs2_toolchain_deps( + name = "specs2_junit_classpath", + provider_id = "specs2_junit", +) diff --git a/specs2/specs2.bzl b/specs2/specs2.bzl index 623d0e0db..e25b3fdea 100644 --- a/specs2/specs2.bzl +++ b/specs2/specs2.bzl @@ -91,4 +91,4 @@ def specs2_repositories( ) def specs2_dependencies(): - return ["//external:io_bazel_rules_scala/dependency/specs2/specs2"] + return ["@io_bazel_rules_scala//specs2:specs2"] diff --git a/specs2/toolchain/BUILD b/specs2/toolchain/BUILD new file mode 100644 index 000000000..2d267d25a --- /dev/null +++ b/specs2/toolchain/BUILD @@ -0,0 +1,42 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "declare_deps_provider") +load("//scala/toolchains:toolchains.bzl", "declare_deps_toolchain") + +toolchain_type( + name = "specs2_toolchain_type", + visibility = ["//visibility:public"], +) + +toolchain( + name = "specs2_toolchain", + toolchain = ":specs2_toolchain_impl", + toolchain_type = ":specs2_toolchain_type", + visibility = ["//visibility:public"], +) + +declare_deps_provider( + name = "specs2_deps_provider", + visibility = ["//visibility:public"], + deps = [ + "@io_bazel_rules_scala_org_specs2_specs2_common", + "@io_bazel_rules_scala_org_specs2_specs2_core", + "@io_bazel_rules_scala_org_specs2_specs2_fp", + "@io_bazel_rules_scala_org_specs2_specs2_matcher", + ], +) + +declare_deps_provider( + name = "specs2_junit_deps_provider", + visibility = ["//visibility:public"], + deps = [ + "//external:io_bazel_rules_scala/dependency/specs2/specs2_junit", + ], +) + +declare_deps_toolchain( + name = "specs2_toolchain_impl", + dep_providers = { + ":specs2_deps_provider": "specs2", + ":specs2_junit_deps_provider": "specs2_junit", + }, + visibility = ["//visibility:public"], +) diff --git a/specs2/toolchain/toolchain.bzl b/specs2/toolchain/toolchain.bzl new file mode 100644 index 000000000..913c97f7a --- /dev/null +++ b/specs2/toolchain/toolchain.bzl @@ -0,0 +1,17 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps") + +toolchain_type_label = "@io_bazel_rules_scala//specs2/toolchain:specs2_toolchain_type" + +def _toolchain_deps(ctx): + return expose_toolchain_deps(ctx, toolchain_type_label) + +specs2_toolchain_deps = rule( + implementation = _toolchain_deps, + attrs = { + "provider_id": attr.string( + mandatory = True, + ), + }, + toolchains = [toolchain_type_label], +) diff --git a/test/aspect/aspect.bzl b/test/aspect/aspect.bzl index 5ff91072d..c4ae79a09 100644 --- a/test/aspect/aspect.bzl +++ b/test/aspect/aspect.bzl @@ -23,36 +23,30 @@ def _rule_impl(ctx): expected_deps = { "scala_library": [ "//test/aspect:scala_library", - "@io_bazel_rules_scala_scala_library//:io_bazel_rules_scala_scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", ], "scala_test": [ "//test/aspect:scala_test", - "@io_bazel_rules_scala_scala_library//:io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala//scala/scalatest:scalatest", + "//scala/private/toolchain_deps:scala_library_classpath", + "//scala/scalatest/toolchain:scalatest_classapth", ], "scala_junit_test": [ "//test/aspect:scala_junit_test", - "@io_bazel_rules_scala_scala_library//:io_bazel_rules_scala_scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", "@io_bazel_rules_scala_junit_junit//:io_bazel_rules_scala_junit_junit", "@io_bazel_rules_scala_org_hamcrest_hamcrest_core//:io_bazel_rules_scala_org_hamcrest_hamcrest_core", ], "scala_specs2_junit_test": [ "//test/aspect:scala_specs2_junit_test", - "@io_bazel_rules_scala_scala_library//:io_bazel_rules_scala_scala_library", + "//scala/private/toolchain_deps:scala_library_classpath", "@io_bazel_rules_scala_junit_junit//:io_bazel_rules_scala_junit_junit", "@io_bazel_rules_scala_org_hamcrest_hamcrest_core//:io_bazel_rules_scala_org_hamcrest_hamcrest_core", # From specs2/specs2.bzl:specs2_dependencies() - "@io_bazel_rules_scala//specs2:specs2", - "@io_bazel_rules_scala_org_specs2_specs2_common//:io_bazel_rules_scala_org_specs2_specs2_common", - "@io_bazel_rules_scala_org_specs2_specs2_core//:io_bazel_rules_scala_org_specs2_specs2_core", - "@io_bazel_rules_scala_org_specs2_specs2_fp//:io_bazel_rules_scala_org_specs2_specs2_fp", - "@io_bazel_rules_scala_org_specs2_specs2_matcher//:io_bazel_rules_scala_org_specs2_specs2_matcher", - "@io_bazel_rules_scala_scala_xml//:io_bazel_rules_scala_scala_xml", - "@io_bazel_rules_scala_scala_parser_combinators//:io_bazel_rules_scala_scala_parser_combinators", - "@io_bazel_rules_scala_scala_library//:io_bazel_rules_scala_scala_library", - "@io_bazel_rules_scala_scala_reflect//:io_bazel_rules_scala_scala_reflect", + "//specs2:specs2", + "//scala/private/toolchain_deps:scala_xml", + "//scala/private/toolchain_deps:parser_combinators", # From specs2/specs2_junit.bzl:specs2_junit_dependencies() - "@io_bazel_rules_scala_org_specs2_specs2_junit//:io_bazel_rules_scala_org_specs2_specs2_junit", + "//specs2:specs2_junit_classpath", ], } content = "" From ee2c951f68794e8023e09c4c5c371c5a9692921f Mon Sep 17 00:00:00 2001 From: Vaidas Pilkauskas Date: Wed, 8 Jul 2020 08:51:35 +0300 Subject: [PATCH 5/5] Add deps toolchain for ScalaTest --- scala/private/macros/scala_repositories.bzl | 7 +++- scala/private/rules/scala_test.bzl | 4 +-- scala/scalatest/BUILD | 3 +- scala/scalatest/toolchain/BUILD | 37 +++++++++++++++++++++ scala/scalatest/toolchain/toolchain.bzl | 16 +++++++++ 5 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 scala/scalatest/toolchain/BUILD create mode 100644 scala/scalatest/toolchain/toolchain.bzl diff --git a/scala/private/macros/scala_repositories.bzl b/scala/private/macros/scala_repositories.bzl index ad964498e..5d782e39d 100644 --- a/scala/private/macros/scala_repositories.bzl +++ b/scala/private/macros/scala_repositories.bzl @@ -59,7 +59,8 @@ def scala_repositories( ), maven_servers = _default_maven_server_urls(), scala_extra_jars = _default_scala_extra_jars(), - fetch_sources = False): + fetch_sources = False, + register_scalatest_toolchain = True): (scala_version, scala_version_jar_shas) = scala_version_shas major_version = _extract_major_version(scala_version) @@ -250,3 +251,7 @@ def scala_repositories( name = "io_bazel_rules_scala/dependency/scala/scalactic/scalactic", actual = "@io_bazel_rules_scala_scalactic", ) + + # for bakcwards compatibility + if register_scalatest_toolchain: + native.register_toolchains("@io_bazel_rules_scala//scala/scalatest/toolchain:scalatest_toolchain") diff --git a/scala/private/rules/scala_test.bzl b/scala/private/rules/scala_test.bzl index be119900c..27139ae7f 100644 --- a/scala/private/rules/scala_test.bzl +++ b/scala/private/rules/scala_test.bzl @@ -59,7 +59,7 @@ _scala_test_attrs = { "jvm_flags": attr.string_list(), "_scalatest": attr.label( default = Label( - "//external:io_bazel_rules_scala/dependency/scalatest/scalatest", + "@io_bazel_rules_scala//scala/scalatest/toolchain:scalatest_classapth", ), ), "_scalatest_runner": attr.label( @@ -84,7 +84,7 @@ _test_resolve_deps = { "@io_bazel_rules_scala//scala/private/toolchain_deps:scala_library_classpath", ), Label( - "//external:io_bazel_rules_scala/dependency/scalatest/scalatest", + "@io_bazel_rules_scala//scala/scalatest/toolchain:scalatest_classapth", ), ], allow_files = False, diff --git a/scala/scalatest/BUILD b/scala/scalatest/BUILD index 4e7439e96..70d985f61 100644 --- a/scala/scalatest/BUILD +++ b/scala/scalatest/BUILD @@ -6,7 +6,6 @@ scala_import( name = "scalatest", jars = [], exports = [ - "//external:io_bazel_rules_scala/dependency/scala/scalactic/scalactic", - "//external:io_bazel_rules_scala/dependency/scala/scalatest/scalatest", + "//scala/scalatest/toolchain:scalatest_classapth", ], ) diff --git a/scala/scalatest/toolchain/BUILD b/scala/scalatest/toolchain/BUILD new file mode 100644 index 000000000..9806427b4 --- /dev/null +++ b/scala/scalatest/toolchain/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_scala//scala/toolchains:toolchains.bzl", "declare_deps_toolchain") +load("@io_bazel_rules_scala//scala:providers.bzl", "declare_deps_provider") +load("//scala/scalatest/toolchain:toolchain.bzl", "scalatest_toolchain_deps") + +toolchain_type( + name = "scalatest_toolchain_type", + visibility = ["//visibility:public"], +) + +toolchain( + name = "scalatest_toolchain", + toolchain = ":scalatest_toolchain_impl", + toolchain_type = ":scalatest_toolchain_type", + visibility = ["//visibility:public"], +) + +declare_deps_provider( + name = "scalatest_deps_provider", + deps = [ + "//external:io_bazel_rules_scala/dependency/scala/scalactic/scalactic", + "//external:io_bazel_rules_scala/dependency/scala/scalatest/scalatest", + ], +) + +declare_deps_toolchain( + name = "scalatest_toolchain_impl", + dep_providers = { + ":scalatest_deps_provider": "scalatest_classpath", + }, + visibility = ["//visibility:public"], +) + +scalatest_toolchain_deps( + name = "scalatest_classapth", + provider_id = "scalatest_classpath", + visibility = ["//visibility:public"], +) diff --git a/scala/scalatest/toolchain/toolchain.bzl b/scala/scalatest/toolchain/toolchain.bzl new file mode 100644 index 000000000..6ce270cec --- /dev/null +++ b/scala/scalatest/toolchain/toolchain.bzl @@ -0,0 +1,16 @@ +load("//scala/private/toolchain_deps:toolchain_deps.bzl", "expose_toolchain_deps") + +toolchain_type_label = "@io_bazel_rules_scala//scala/scalatest/toolchain:scalatest_toolchain_type" + +def _scalatest_toolchain_deps(ctx): + return expose_toolchain_deps(ctx, toolchain_type_label) + +scalatest_toolchain_deps = rule( + toolchains = [toolchain_type_label], + attrs = { + "provider_id": attr.string( + mandatory = True, + ), + }, + implementation = _scalatest_toolchain_deps, +)