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/scalafmt:scalafmt_toolchain #1678

Merged
merged 6 commits into from
Jan 27, 2025

Conversation

mbland
Copy link
Contributor

@mbland mbland commented Jan 15, 2025

Description

Mostly a pretty straightforward and easy update on top of the previous setup_toolchains and scala_toolchains_repo changes. Part of #1482.

However, it also includes a few opportunistic changes:

  • Updates test_reproducibility.sh to replace the nonexistent //test/coverage/... target with packages that
    actually exist, rendering the test more meaningful.
  • Adds the SCALAFMT_TOOLCHAIN_TYPE constant to reduce string duplication.
  • Removes the dep_providers default from scala_toolchain, since it's the only attribute, so it doesn't make sense to have a default (inspired by scalafmt compilation breaks after upgrade to "Update to Scalafmt 3.8.3" #1675).
  • Tweaks a few tests to ensure they still pass under Bazel 6 and Bzlmod.
  • Updates //third_party tests to replace $(location) with $(rootpath), ensuring they still pass under Bazel 8 (Bazel 8.0.0 compatibility #1652).

See the commit messages for more details.

Motivation

The first commit contains the next methodical step in the implementation of the scala_toolchains() macro and the @io_bazel_rules_scala_toolchains repository. This "toolchainization" is what will enable us to add a MODULE.bazel file to register rules_scala toolchains automatically, based on optional user configuration values.

Normally I'd split each of the other changes into separate pull requests, but since these are so small, it seemed it might expedite the process to include them all here. All are completely tested, and since they're encapsulated in separate commits, I'm happy to break them down into separate pull requests if preferred.

This is a pretty straightforward and easy update on top of the previous
`setup_toolchains` and `scala_toolchains_repo` changes. Part of bazelbuild#1482.
Replaces the nonexistent `//test/coverage/...` target with packages that
actually exist, rendering the test more meaningful.

A spurious failure caused me to run the following to inspect what was
happening:

```txt
RULES_SCALA_TEST_ONLY=test_build_is_identical ./test_reproducibility.sh
```

This caused me to see that the following command was failing because
`//test/coverage/...` didn't exist:

```txt
bazel build --collect_code_coverage -- //test/coverage/...
```
Reduces string duplication in `//scala/scalafmt/toolchain/*.bzl` files.
It's likely that no one will ever rely on the default when defining
their own `scalafmt_toolchain`.

While investigating bazelbuild#1675, I realized the `dep_providers` default was
set to a nonexistent target. This didn't break our tests because our
Scalafmt toolchains are created by `setup_scala_toolchain`, which sets
`dep_providers` explicitly.

I thought about aliasing the provider generated for the toolchain for
`SCALA_VERSION` in `@io_bazel_rules_scala_toolchains//scalafmt`, or
generating a new one. I ultimately decided to remove the default,
because the `deps_providers` is literally the only attribute. Anyone
defining their own `scalafmt_toolchain` will certainly define their own
`deps_providers` target(s).
Copied the regular expression used to optionally match canonical repo
name prefixes in `buildozer` commands from bazelbuild#1622. These never failed
when building with Bzlmod and Bazel 7.4.1, but did under Bazel 6.5.0.
Fixes `{strict_deps,unused_dependency_checker}_test` from
`//third_party/dependency_analyzer/src/test` under Bazel 8 by updating
`$(location)` to `$(rootpath)`. Part of bazelbuild#1652.

`//third_party/dependency_analyzer/src/test:strict_deps_test` and
`//third_party/dependency_analyzer/src/test:unused_dependency_checker_test`
both failed with errors of the form:

```txt
StrictDepsTest:
- error on indirect dependency target *** FAILED *** (379 milliseconds)
  nice errors on sequence of strings.this.infos.exists(nice errors on
  sequence of strings.this.checkErrorContainsMessage(target)) was false
  expected an error on //commons:Target to appear in errors (with
  buildozer command)!
  Errors: List(object apache is not a member of package org)
  (StrictDepsTest.scala:85)
```

This happened both under `WORKSPACE` and Bzlmod. Copying the test script
with the following (with `$ID` being one of `7`, `8`, `7-updated`, or
`8-updated`) helped reveal the differences:

```txt
cp bazel-bin/third_party/dependency_analyzer/src/test/strict_deps_test \
  strict_deps_test-$ID.sh
```

Under Bazel 7, we find the following lines whether using `$(location)`
or `$(rootpath)` on the `org.apache.commons` artifact (the other
artifacts already use `$(rootpath)`:

```txt
 -Dscala.library.location=external/io_bazel_rules_scala_scala_library_2_12_20/scala-library-2.12.20.jar
 -Dscala.reflect.location=external/io_bazel_rules_scala_scala_reflect_2_12_20/scala-reflect-2.12.20.jar
 -Dguava.jar.location=external/com_google_guava_guava_21_0_with_file/guava-21.0.jar
 -Dapache.commons.jar.location=external/org_apache_commons_commons_lang_3_5_without_file/commons-lang3-3.5.jar
```

Under Bazel 8, notice that the `external/` prefix has become `../` for
the other paths already using `$(rootpath)`, but remains `external/` for
the `$(location)` artifact. This breaks the Bazel 8 build:

```txt
-Dscala.library.location=../io_bazel_rules_scala_scala_library_2_12_20/scala-library-2.12.20.jar
-Dscala.reflect.location=../io_bazel_rules_scala_scala_reflect_2_12_20/scala-reflect-2.12.20.jar
-Dguava.jar.location=../com_google_guava_guava_21_0_with_file/guava-21.0.jar
-Dapache.commons.jar.location=external/org_apache_commons_commons_lang_3_5_without_file/commons-lang3-3.5.jar
```

Under Bazel 8, using `$(rootpath)` for the `org.apache.commons` artifact
converts its `external/`, fixing the Bazel 8 build:

```txt
-Dscala.library.location=../io_bazel_rules_scala_scala_library_2_12_20/scala-library-2.12.20.jar
-Dscala.reflect.location=../io_bazel_rules_scala_scala_reflect_2_12_20/scala-reflect-2.12.20.jar
-Dguava.jar.location=../com_google_guava_guava_21_0_with_file/guava-21.0.jar
-Dapache.commons.jar.location=../org_apache_commons_commons_lang_3_5_without_file/commons-lang3-3.5.jar
```
Copy link
Collaborator

@simuons simuons left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks

@liucijus liucijus merged commit 08ab275 into bazelbuild:master Jan 27, 2025
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants