Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Toolchainize //scala:toolchain_type #1633

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Commits on Nov 12, 2024

  1. Toolchainize //scala:toolchain_type

    Moves the `toolchain` targets for `//scala:toolchain_type` to a new
    `@io_bazel_rules_scala_toolchains` repository as a step towards
    Bzlmodification. Part of bazelbuild#1482.
    
    Instantiating toolchains in their own repository enables module
    extensions to define the the repositories required by those toolchains
    within the extension's own namespace. Bzlmod users can then register the
    toolchains from this repository without having to import all the
    toolchains' dependencies into their own namespace via `use_repo()`.
    
    ---
    
    The `scala_toolchains_repo()` macro wraps the underlying repository rule
    and assigns it the standard name `io_bazel_rules_scala_toolchains`.
    Right now it's only instantiating the main Scala toolchain via the
    default `scala = True` parameter. Future changes will expand this
    macro and repository rule with more boolean parameters to instantiate
    other toolchains, specifically:
    
    - `scalatest`
    - `junit`
    - `specs2`
    - `twitter_scrooge`
    - `jmh`
    - `scala_proto` and `scala_proto_enable_all_options`
    - `testing` (includes all of `scalatest`, `junit`, and `specs2`)
    - `scalafmt`
    
    ---
    
    `WORKSPACE` users will now have to import and call the
    `scala_toolchains_repo()` macro to instantiate
    `@io_bazel_rules_scala_toolchains`.
    
    ```py
    load("@io_bazel_rules_scala//:scala_config.bzl", "scala_config")
    
    scala_config()
    
    load(
        "//scala:scala.bzl",
        "rules_scala_setup",
        "rules_scala_toolchain_deps_repositories",
        "scala_toolchains_repo",
    )
    
    rules_scala_setup()
    
    rules_scala_toolchain_deps_repositories()
    
    scala_toolchains_repo()
    
    register_toolchains("@io_bazel_rules_scala_toolchains//...:all")
    ```
    
    This is what the corresponding `MODULE.bazel` setup would look like:
    
    ```py
    module(name = "rules_scala", version = "7.0.0")
    
    scala_config = use_extension(
        "//scala/extensions:config.bzl", "scala_config"
    )
    scala_config.settings(scala_version = "2.13.14")
    
    scala_deps = use_extension("//scala/extensions:deps.bzl", "scala_deps")
    scala_deps.toolchains()
    ```
    
    The `register_toolchains()` call in `WORKSPACE` isn't strictly required
    at this point, but is recommended. However, all the `WORKSPACE` files in
    this repo already register their required toolchains using existing
    macros, which have been updated in this change.
    
    In fact, calling `register_toolchains()` right after
    `scala_toolchains_repo()` as shown above breaks two tests that depend on
    the existing `WORKSPACE` toolchain registration:
    
    - `test_compilation_fails_with_plus_one_deps_undefined` from
      `test/shell/test_compilation.sh` depends on
      `scala_register_unused_deps_toolchains()` setting up its toolchain to
      resolve first. `//scala:unused_dependency_checker_error_toolchain`
      sets the `scala_toolchain()` parameters `dependency_tracking_method =
      "ast-plus"` and `unused_dependency_checker_mode = "error"`, and the
      `@io_bazel_rules_scala_toolchains//scala` toolchains don't.
    
    - `test_scala_binary_allows_opt_in_to_use_of_argument_file_in_runner_for_improved_performance`
      from `test/shell/test_scala_binary.sh` depends on the
      `use_argument_file_in_runner` parameter of `scala_toolchain` being
      `False`. This is the default, but the
      `@io_bazel_rules_scala_toolchains//scala` toolchains explicitly set
      this to `True` instead.
    
    In the Bzlmod case, the `register_toolchains()` call isn't necessary at
    all. This is because `@io_bazel_rules_scala_toolchains` includes one
    package per set of toolchains, and the rules_scala `MODULE.bazel` calls
    `register_toolchains("@io_bazel_rules_scala_toolchains//...:all")`. This
    will automatically register all configured rules_scala toolchains, while
    allowing users to override any of them using `register_toolchains()` in
    their own `MODULE.bazel` files.
    
    Technically, the `scala_deps.toolchains()` call isn't required when only
    using the default `scala = True` parameter; the rules_scala
    `MODULE.bazel` will instantiate this automatically, too.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    b650581 View commit details
    Browse the repository at this point in the history
  2. Add scala_toolchains macro for WORKSPACE, Bzlmod

    Extracted a single `scala_toolchains` macro to share between `WORKSPACE`
    and the `deps.bzl` module extension. This will make it easier to ensure
    `WORKSPACE` compatibility, and to add a Bazel module extension as a thin
    layer on top. Part of bazelbuild#1482.
    
    This change includes updates to `rules_scala_setup` and
    `scala_repositories` to support this, while preserving compatibility
    with existing `WORKSPACE` calls. The next commit will replace many
    existing `WORKSPACE` calls with `scala_toolchains`.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    85cc82a View commit details
    Browse the repository at this point in the history
  3. Replace WORKSPACE calls with scala_toolchains()

    Also added `@io_bazel_rules_scala_toolchains//...:all` to
    `register_toolchains()` calls everywhere, even when not specifically
    necessary. This proves the mechanism is safe and works with `WORKSPACE`
    now, and will make future updates to consolidate other toolchains less
    noisy.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    ce63988 View commit details
    Browse the repository at this point in the history
  4. Remove obsolete WORKSPACE toolchain calls

    Should've been included in the previous commit. All tests still pass.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    9015826 View commit details
    Browse the repository at this point in the history
  5. Replace scala_register_unused_deps_toolchains call

    Missed this one in third_party/test/proto earlier. Also removed
    unnecessary `USE_BAZEL_VERSION` expression in
    test_scala_proto_library.sh. If `USE_BAZEL_VERSION` is set, it takes
    precedence to begin with, and third_party/test/proto/.bazelversion
    exists now after bazelbuild#1629.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    3a5f7b7 View commit details
    Browse the repository at this point in the history
  6. Give scala_toolchains_repo a default name argument

    This turns out to be helpful when adapting
    `test_version/WORKSPACE.template` to the toolchainized version of
    `twitter_scrooge` for testing. In this case, we want `twitter_scooge` to
    be in its own customized repo, separate from the one generated by
    `scala_toolchains`.
    
    This seems like it might be generally useful when writing module
    extensions for alternative toolchains.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    04a246c View commit details
    Browse the repository at this point in the history
  7. Update Scala toolchainizaion per @simuons in bazelbuild#1633

    - Removes an extraneous `compiler_sources_repo` call.
    
    - `scala_toolchains` will now _always_ create the main Scala toolchain
      repository (there's no longer an option to turn it off).
    
    - Registers `@io_bazel_rules_scala_toolchains//...:all` in
      `scala_register_toolchains.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    6a2f39b View commit details
    Browse the repository at this point in the history
  8. Extract load_rules_dependencies macro

    Requested by @simuons in bazelbuild#1633 to make `rules_scala_setup` and
    `scala_repositories` more readable while maintaining the existing APIs.
    mbland committed Nov 12, 2024
    Configuration menu
    Copy the full SHA
    297645d View commit details
    Browse the repository at this point in the history