diff --git a/src/scala/io/bazel/rules_scala/scrooge_support/BUILD b/src/scala/io/bazel/rules_scala/scrooge_support/BUILD index 9e6f177dc..b363e6454 100644 --- a/src/scala/io/bazel/rules_scala/scrooge_support/BUILD +++ b/src/scala/io/bazel/rules_scala/scrooge_support/BUILD @@ -2,24 +2,14 @@ load("//scala:scala.bzl", "scala_library") scala_library( name = "compiler", - srcs = ["Compiler.scala"], + srcs = [ + "Compiler.scala", + "FocusedZipImporter.scala", + ], # util_core is still needed as a dep for older versions of scrooge unused_dependency_checker_mode = "off", visibility = ["//visibility:public"], deps = [ - ":focused_zip_importer", - "//external:io_bazel_rules_scala/dependency/scala/parser_combinators", - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator", - "//external:io_bazel_rules_scala/dependency/thrift/util_core", - "//external:io_bazel_rules_scala/dependency/thrift/util_logging", - ], -) - -scala_library( - name = "focused_zip_importer", - srcs = ["FocusedZipImporter.scala"], - visibility = ["//visibility:public"], - deps = [ - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator", + "//twitter_scrooge:compiler_classpath", ], ) diff --git a/src/scala/scripts/BUILD b/src/scala/scripts/BUILD index 6f2169809..a34e2fbb0 100644 --- a/src/scala/scripts/BUILD +++ b/src/scala/scripts/BUILD @@ -5,11 +5,11 @@ scala_library( srcs = ["ScroogeWorker.scala"], visibility = ["//visibility:public"], deps = [ - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator", "//src/java/io/bazel/rulesscala/io_utils", "//src/java/io/bazel/rulesscala/jar", "//src/java/io/bazel/rulesscala/worker", "//src/scala/io/bazel/rules_scala/scrooge_support:compiler", + "//twitter_scrooge:scrooge_generator_classpath", ], ) diff --git a/test/shell/test_deps.sh b/test/shell/test_deps.sh index 78a41bdb2..e1815e990 100755 --- a/test/shell/test_deps.sh +++ b/test/shell/test_deps.sh @@ -31,6 +31,21 @@ scala_pb_library_targets_do_not_have_host_deps() { fi } +scrooge_library_targets_do_not_have_host_deps() { + set -e + bazel build //test/src/main/scala/scalarules/test/twitter_scrooge:test_binary_to_ensure_no_host_deps + set +e + find bazel-bin/test/src/main/scala/scalarules/test/twitter_scrooge/test_binary_to_ensure_no_host_deps.runfiles -name '*.jar' -exec readlink {} \; | grep 'bazel-out/host' + RET=$? + set -e + if [ "$RET" == "0" ]; then + echo "Host deps exist in output of target:" + echo "Possibly toolchains limitation?" + find bazel-bin/test/proto/test_binary_to_ensure_no_host_deps.runfiles -name '*.jar' -exec readlink {} \; | grep 'bazel-out/host' + exit 1 + fi +} + test_scala_import_expect_failure_on_missing_direct_deps_warn_mode() { dependency_target1='//test_expect_failure/scala_import:cats' dependency_target2='//test_expect_failure/scala_import:guava' @@ -57,5 +72,6 @@ test_plus_one_ast_analyzer_strict_deps() { $runner test_scala_import_library_passes_labels_of_direct_deps $runner test_plus_one_deps_only_works_for_java_info_targets $runner scala_pb_library_targets_do_not_have_host_deps +$runner scrooge_library_targets_do_not_have_host_deps $runner test_scala_import_expect_failure_on_missing_direct_deps_warn_mode $runner test_plus_one_ast_analyzer_strict_deps diff --git a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD index d4624d1e7..f22dff9bf 100644 --- a/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD +++ b/test/src/main/scala/scalarules/test/twitter_scrooge/BUILD @@ -218,6 +218,14 @@ scala_library( deps = [":justscrooge3"], ) +scala_binary( + name = "test_binary_to_ensure_no_host_deps", + main_class = "scalarules.test.twitter_scrooge.JustScrooge2b", + deps = [ + ":justscrooge2b", + ], +) + scala_binary( name = "twodeep_binary", main_class = "scalarules.test.twitter_scrooge.Twodeep", diff --git a/thrift/thrift.bzl b/thrift/thrift.bzl index d7ffae671..5aeefb5bd 100644 --- a/thrift/thrift.bzl +++ b/thrift/thrift.bzl @@ -43,13 +43,11 @@ def _thrift_library_impl(ctx): if len(found_prefixes) == 0: fail( - "could not find prefix from available prefixes: {prefixes} in the common prefix: {common_prefix}" - .format(prefixes = ",".join(prefixes), common_prefix = common_prefix), + "could not find prefix from available prefixes: {prefixes} in the common prefix: {common_prefix}".format(prefixes = ",".join(prefixes), common_prefix = common_prefix), ) elif len(found_prefixes) > 1: fail( - "Too many not prefixes found, matched: {found_prefixes} in the common prefix: {common_prefix}" - .format( + "Too many not prefixes found, matched: {found_prefixes} in the common prefix: {common_prefix}".format( found_prefixes = ",".join(found_prefixes), common_prefix = common_prefix, ), @@ -164,7 +162,7 @@ thrift_library = rule( "external_jars": attr.label_list(allow_files = [".jar"]), "_zipper": attr.label( executable = True, - cfg = "host", + cfg = "exec", default = Label("@bazel_tools//tools/zip:zipper"), allow_files = True, ), diff --git a/twitter_scrooge/BUILD b/twitter_scrooge/BUILD index e69de29bb..1bd1a0a98 100644 --- a/twitter_scrooge/BUILD +++ b/twitter_scrooge/BUILD @@ -0,0 +1,83 @@ +load("//twitter_scrooge/toolchain:toolchain.bzl", "export_scrooge_deps", "scrooge_toolchain") +load("//scala:providers.bzl", "declare_deps_provider") + +scrooge_toolchain( + name = "scrooge_toolchain_impl", + visibility = ["//visibility:public"], +) + +toolchain( + name = "scrooge_toolchain", + toolchain = ":scrooge_toolchain_impl", + toolchain_type = "@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type", + visibility = ["//visibility:public"], +) + +declare_deps_provider( + name = "aspect_compile_classpath_provider", + deps_id = "aspect_compile_classpath", + visibility = ["//visibility:public"], + deps = [ + "//external:io_bazel_rules_scala/dependency/thrift/javax_annotation_api", + "//external:io_bazel_rules_scala/dependency/thrift/libthrift", + "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core", + "//external:io_bazel_rules_scala/dependency/thrift/util_core", + "//scala/private/toolchain_deps:scala_library_classpath", + ], +) + +declare_deps_provider( + name = "compile_classpath_provider", + deps_id = "compile_classpath", + visibility = ["//visibility:public"], + deps = [ + "//external:io_bazel_rules_scala/dependency/thrift/libthrift", + "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core", + "//scala/private/toolchain_deps:scala_library_classpath", + ], +) + +declare_deps_provider( + name = "scrooge_generator_classpath_provider", + deps_id = "scrooge_generator_classpath", + visibility = ["//visibility:public"], + deps = [ + "//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator", + ], +) + +declare_deps_provider( + name = "compiler_classpath_provider", + deps_id = "compiler_classpath", + visibility = ["//visibility:public"], + deps = [ + "//external:io_bazel_rules_scala/dependency/thrift/scrooge_generator", + "//external:io_bazel_rules_scala/dependency/thrift/util_core", + "//external:io_bazel_rules_scala/dependency/thrift/util_logging", + "//scala/private/toolchain_deps:parser_combinators", + ], +) + +export_scrooge_deps( + name = "compile_classpath", + deps_id = "compile_classpath", + visibility = ["//visibility:public"], +) + +export_scrooge_deps( + name = "aspect_compile_classpath", + deps_id = "aspect_compile_classpath", + visibility = ["//visibility:public"], +) + +export_scrooge_deps( + name = "scrooge_generator_classpath", + deps_id = "scrooge_generator_classpath", + visibility = ["//visibility:public"], +) + +export_scrooge_deps( + name = "compiler_classpath", + deps_id = "compiler_classpath", + visibility = ["//visibility:public"], +) diff --git a/twitter_scrooge/toolchain/BUILD b/twitter_scrooge/toolchain/BUILD new file mode 100644 index 000000000..0d9e1073a --- /dev/null +++ b/twitter_scrooge/toolchain/BUILD @@ -0,0 +1,4 @@ +toolchain_type( + name = "scrooge_toolchain_type", + visibility = ["//visibility:public"], +) diff --git a/twitter_scrooge/toolchain/toolchain.bzl b/twitter_scrooge/toolchain/toolchain.bzl new file mode 100644 index 000000000..60b4a67a9 --- /dev/null +++ b/twitter_scrooge/toolchain/toolchain.bzl @@ -0,0 +1,42 @@ +load("@io_bazel_rules_scala//scala:providers.bzl", "DepsInfo") +load( + "@io_bazel_rules_scala//scala/private/toolchain_deps:toolchain_deps.bzl", + "expose_toolchain_deps", +) + +def _scrooge_toolchain_impl(ctx): + toolchain = platform_common.ToolchainInfo( + dep_providers = ctx.attr.dep_providers, + ) + return [toolchain] + +scrooge_toolchain = rule( + _scrooge_toolchain_impl, + attrs = { + "dep_providers": attr.label_list( + default = [ + "@io_bazel_rules_scala//twitter_scrooge:compile_classpath_provider", + "@io_bazel_rules_scala//twitter_scrooge:aspect_compile_classpath_provider", + "@io_bazel_rules_scala//twitter_scrooge:compiler_classpath_provider", + "@io_bazel_rules_scala//twitter_scrooge:scrooge_generator_classpath_provider", + ], + providers = [DepsInfo], + ), + }, +) + +def _export_scrooge_deps_impl(ctx): + return expose_toolchain_deps( + ctx, + "@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type", + ) + +export_scrooge_deps = rule( + _export_scrooge_deps_impl, + attrs = { + "deps_id": attr.string( + mandatory = True, + ), + }, + toolchains = ["@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type"], +) diff --git a/twitter_scrooge/twitter_scrooge.bzl b/twitter_scrooge/twitter_scrooge.bzl index fb3b1b084..eee9c0d49 100644 --- a/twitter_scrooge/twitter_scrooge.bzl +++ b/twitter_scrooge/twitter_scrooge.bzl @@ -23,6 +23,11 @@ load( "merge_thrift_infos", ) load("//third_party/repositories:repositories.bzl", "repositories") +load( + "@io_bazel_rules_scala//scala/private/toolchain_deps:toolchain_deps.bzl", + "find_deps_info_on", + "java_info_for_deps", +) _jar_extension = ".jar" @@ -137,6 +142,8 @@ def twitter_scrooge( actual = "@io_bazel_rules_scala_javax_annotation_api", ) + native.register_toolchains("@io_bazel_rules_scala//twitter_scrooge:scrooge_toolchain") + def _colon_paths(data): return ":".join([f.path for f in sorted(data)]) @@ -416,7 +423,7 @@ def _scrooge_java_aspect_impl(target, ctx): common_attrs = { "_pluck_scrooge_scala": attr.label( executable = True, - cfg = "host", + cfg = "exec", default = Label("//src/scala/scripts:scrooge_worker"), allow_files = True, ), @@ -424,19 +431,7 @@ common_attrs = { providers = [JavaInfo], default = [ Label( - "//scala/private/toolchain_deps:scala_library_classpath", - ), - Label( - "//external:io_bazel_rules_scala/dependency/thrift/libthrift", - ), - Label( - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core", - ), - Label( - "//external:io_bazel_rules_scala/dependency/thrift/util_core", - ), - Label( - "//external:io_bazel_rules_scala/dependency/thrift/javax_annotation_api", + "@io_bazel_rules_scala//twitter_scrooge:aspect_compile_classpath", ), ], ), @@ -457,11 +452,15 @@ scrooge_scala_aspect = aspect( default = Label( "@io_bazel_rules_scala//src/java/io/bazel/rulesscala/scalac", ), + cfg = "exec", ), }, ), required_aspect_providers = common_aspect_providers, - toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"], + toolchains = [ + "@io_bazel_rules_scala//scala:toolchain_type", + "@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type", + ], ) scrooge_java_aspect = aspect( @@ -471,11 +470,17 @@ scrooge_java_aspect = aspect( common_attrs, { "_java_toolchain": attr.label(default = Label("@bazel_tools//tools/jdk:current_java_toolchain")), - "_host_javabase": attr.label(default = Label("@bazel_tools//tools/jdk:current_java_runtime"), cfg = "host"), + "_host_javabase": attr.label( + default = Label("@bazel_tools//tools/jdk:current_java_runtime"), + cfg = "exec", + ), }, ), required_aspect_providers = common_aspect_providers, - toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"], + toolchains = [ + "@io_bazel_rules_scala//scala:toolchain_type", + "@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type", + ], fragments = ["java"], ) @@ -545,16 +550,11 @@ scrooge_scala_import = rule( providers = [JavaInfo], default = [ Label( - "//scala/private/toolchain_deps:scala_library_classpath", - ), - Label( - "//external:io_bazel_rules_scala/dependency/thrift/libthrift", - ), - Label( - "//external:io_bazel_rules_scala/dependency/thrift/scrooge_core", + "@io_bazel_rules_scala//twitter_scrooge:compile_classpath", ), ], ), }, provides = [ThriftInfo, JavaInfo, ScroogeImport], + toolchains = ["@io_bazel_rules_scala//twitter_scrooge/toolchain:scrooge_toolchain_type"], )