From 7b1d93d16dfbaeaf05b155d7d8c87d2ae2810d42 Mon Sep 17 00:00:00 2001 From: Timothy Gu Date: Wed, 6 Mar 2024 08:31:54 -0800 Subject: [PATCH] test --- README.md | 10 ++++++++++ WORKSPACE | 11 +++++++++++ examples/scala3/WORKSPACE | 11 +++++++++++ examples/semanticdb/WORKSPACE | 11 +++++++++++ .../testing/multi_frameworks_toolchain/WORKSPACE | 11 +++++++++++ examples/testing/scalatest_repositories/WORKSPACE | 11 +++++++++++ .../testing/specs2_junit_repositories/WORKSPACE | 11 +++++++++++ scala/private/common_attributes.bzl | 6 +++++- scala/private/macros/scala_repositories.bzl | 8 ++++++++ scala/private/phases/phase_compile.bzl | 10 +++++++++- scala/private/phases/phase_write_executable.bzl | 9 +++++++++ scala/scala_import.bzl | 15 +++++++++++++-- test_version/WORKSPACE.template | 11 +++++++++++ 13 files changed, 131 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 068cc71b1..46c1ba5b4 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,16 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") +bazel_features_deps() + # See https://github.com/bazelbuild/rules_scala/releases for up to date version information. http_archive( name = "io_bazel_rules_scala", diff --git a/WORKSPACE b/WORKSPACE index 733a7652e..afbc03ce9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,6 +15,17 @@ load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") bazel_skylib_workspace() +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + _build_tools_release = "5.1.0" http_archive( diff --git a/examples/scala3/WORKSPACE b/examples/scala3/WORKSPACE index b235319df..ca6050e47 100644 --- a/examples/scala3/WORKSPACE +++ b/examples/scala3/WORKSPACE @@ -11,6 +11,17 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + local_repository( name = "io_bazel_rules_scala", path = "../..", diff --git a/examples/semanticdb/WORKSPACE b/examples/semanticdb/WORKSPACE index d569fcf4c..5d1b3aba8 100644 --- a/examples/semanticdb/WORKSPACE +++ b/examples/semanticdb/WORKSPACE @@ -14,6 +14,17 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + local_repository( name = "io_bazel_rules_scala", path = "../..", diff --git a/examples/testing/multi_frameworks_toolchain/WORKSPACE b/examples/testing/multi_frameworks_toolchain/WORKSPACE index ea4eb2f35..065ac1092 100644 --- a/examples/testing/multi_frameworks_toolchain/WORKSPACE +++ b/examples/testing/multi_frameworks_toolchain/WORKSPACE @@ -11,6 +11,17 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + local_repository( name = "io_bazel_rules_scala", path = "../../..", diff --git a/examples/testing/scalatest_repositories/WORKSPACE b/examples/testing/scalatest_repositories/WORKSPACE index 546f9e00b..c23ccda33 100644 --- a/examples/testing/scalatest_repositories/WORKSPACE +++ b/examples/testing/scalatest_repositories/WORKSPACE @@ -11,6 +11,17 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + local_repository( name = "io_bazel_rules_scala", path = "../../..", diff --git a/examples/testing/specs2_junit_repositories/WORKSPACE b/examples/testing/specs2_junit_repositories/WORKSPACE index 3d67bf00d..fcfb2b1b3 100644 --- a/examples/testing/specs2_junit_repositories/WORKSPACE +++ b/examples/testing/specs2_junit_repositories/WORKSPACE @@ -11,6 +11,17 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + local_repository( name = "io_bazel_rules_scala", path = "../../..", diff --git a/scala/private/common_attributes.bzl b/scala/private/common_attributes.bzl index 756b12510..25a237afb 100644 --- a/scala/private/common_attributes.bzl +++ b/scala/private/common_attributes.bzl @@ -1,5 +1,6 @@ """Shared attributes for rules""" +load("@bazel_features//:features.bzl", "bazel_features") load( "@io_bazel_rules_scala//scala/private:coverage_replacements_provider.bzl", _coverage_replacements_provider = "coverage_replacements_provider", @@ -48,7 +49,10 @@ common_attrs_for_plugin_bootstrapping = { default = False, mandatory = False, ), -} +} | ({ + "add_exports": attr.string_list(), + "add_opens": attr.string_list(), +} if bazel_features.java.java_info_constructor_module_flags else {}) common_attrs = {} diff --git a/scala/private/macros/scala_repositories.bzl b/scala/private/macros/scala_repositories.bzl index e35655c78..61df9ea82 100644 --- a/scala/private/macros/scala_repositories.bzl +++ b/scala/private/macros/scala_repositories.bzl @@ -92,6 +92,14 @@ def rules_scala_setup(scala_compiler_srcjar = None): ], ) + if not native.existing_rule("bazel_features"): + http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", + ) + if not native.existing_rule("rules_cc"): http_archive( name = "rules_cc", diff --git a/scala/private/phases/phase_compile.bzl b/scala/private/phases/phase_compile.bzl index d1534aabb..7679f3a6b 100644 --- a/scala/private/phases/phase_compile.bzl +++ b/scala/private/phases/phase_compile.bzl @@ -3,6 +3,7 @@ # # DOCUMENT THIS # +load("@bazel_features//:features.bzl", "bazel_features") load( "@io_bazel_rules_scala//scala/private:paths.bzl", _get_files_with_extension = "get_files_with_extension", @@ -298,7 +299,7 @@ def _create_scala_compilation_provider(ctx, ijar, source_jar, deps_providers): runtime_deps = [] if hasattr(ctx.attr, "runtime_deps"): runtime_deps = [dep[JavaInfo] for dep in ctx.attr.runtime_deps] - return JavaInfo( + kwargs = dict( output_jar = ctx.outputs.jar, compile_jar = ijar, source_jar = source_jar, @@ -308,6 +309,13 @@ def _create_scala_compilation_provider(ctx, ijar, source_jar, deps_providers): neverlink = ctx.attr.neverlink, ) + # The JavaInfo constructor's add_exports and add_opens flags were added in Bazel 7: + # https://github.com/bazelbuild/bazel/issues/20033 + if bazel_features.java.java_info_constructor_module_flags: + kwargs["add_exports"] = getattr(ctx.attr, "add_exports", []) + kwargs["add_opens"] = getattr(ctx.attr, "add_opens", []) + return JavaInfo(**kwargs) + def _pack_source_jar(ctx, scala_srcs, input_srcjars): # https://github.com/bazelbuild/bazel/blob/ff6c0333e4f957bb9f7ab5401b01dbf3e9b515b1/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java#L180-L183 # java_common.pack_sources checks for no srcs and only a single input jar diff --git a/scala/private/phases/phase_write_executable.bzl b/scala/private/phases/phase_write_executable.bzl index 76edaab05..054644acc 100644 --- a/scala/private/phases/phase_write_executable.bzl +++ b/scala/private/phases/phase_write_executable.bzl @@ -73,6 +73,15 @@ def _phase_write_executable( executable = p.declare_executable.executable wrapper = p.java_wrapper + # Add --add-exports / --add-opens flags + merged_java_info = p.compile.merged_provider + add_exports = merged_java_info.module_flags_info.add_exports + add_opens = merged_java_info.module_flags_info.add_opens + if add_exports or add_opens: + jvm_flags = list(jvm_flags) + jvm_flags += ["--add-exports=%s=ALL-UNNAMED" % x for x in add_exports.to_list()] + jvm_flags += ["--add-opens=%s=ALL-UNNAMED" % x for x in add_opens.to_list()] + if (is_windows(ctx)): return _write_executable_windows(ctx, executable, rjars, main_class, jvm_flags, wrapper, use_jacoco) else: diff --git a/scala/scala_import.bzl b/scala/scala_import.bzl index 2ff83b3a7..ac3c21bea 100644 --- a/scala/scala_import.bzl +++ b/scala/scala_import.bzl @@ -1,3 +1,4 @@ +load("@bazel_features//:features.bzl", "bazel_features") load("@io_bazel_rules_scala//scala:jars_to_labels.bzl", "JarsToLabelsInfo") load("//scala/settings:stamp_settings.bzl", "StampScalaImport") load( @@ -68,7 +69,7 @@ def _scala_import_impl(ctx): ] def _new_java_info(ctx, jar, stamped_jar): - return JavaInfo( + kwargs = dict( output_jar = jar, compile_jar = stamped_jar, exports = [target[JavaInfo] for target in ctx.attr.exports], @@ -78,6 +79,13 @@ def _new_java_info(ctx, jar, stamped_jar): neverlink = ctx.attr.neverlink, ) + # The JavaInfo constructor's add_exports and add_opens flags were added in Bazel 7: + # https://github.com/bazelbuild/bazel/issues/20033 + if bazel_features.java.java_info_constructor_module_flags: + kwargs["add_exports"] = ctx.attr.add_exports + kwargs["add_opens"] = ctx.attr.add_opens + return JavaInfo(**kwargs) + def _add_labels_of_current_code_jars(code_jars, label, jars2labels): for jar in code_jars.to_list(): jars2labels[jar.path] = label @@ -148,6 +156,9 @@ scala_import = rule( "java_compile_toolchain": attr.label( default = Label("@bazel_tools//tools/jdk:current_java_toolchain"), ), - }, + } | ({ + "add_exports": attr.string_list(), + "add_opens": attr.string_list(), + } if bazel_features.java.java_info_constructor_module_flags else {}), toolchains = ["@bazel_tools//tools/jdk:toolchain_type"], ) diff --git a/test_version/WORKSPACE.template b/test_version/WORKSPACE.template index 34c499f2f..c15331519 100644 --- a/test_version/WORKSPACE.template +++ b/test_version/WORKSPACE.template @@ -11,6 +11,17 @@ http_archive( ], ) +http_archive( + name = "bazel_features", + sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", + strip_prefix = "bazel_features-1.9.1", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", +) + +load("@bazel_features//:deps.bzl", "bazel_features_deps") + +bazel_features_deps() + http_archive( name = "rules_proto", sha256 = "8e7d59a5b12b233be5652e3d29f42fba01c7cbab09f6b3a8d0a57ed6d1e9a0da",