Skip to content

Commit

Permalink
Enable Bzlmod
Browse files Browse the repository at this point in the history
All but finishes bazelbuild#1482, barring the release and publication to the Bazel
Central Registry.

New `MODULE.bazel` files mirroring existing `WORKSPACE` configurations
comprise the bulk of the commit. The empty `WORKSPACE.bzlmod` files
ensure that Bzlmod won't evaluate the existing `WORKSPACE` files.

These new files comprise the most significant part of the change:

- `scala/extensions/config.bzl`
- `scala/extensions/deps.bzl`
- `scala/private/extensions/dev_deps.bzl`
- `scala/private/macros/bzlmod.bzl`

`config.bzl`, `deps.bzl`, and `dev_deps.bzl` are thoroughly tested by
existing tests. The following files thoroughly test the helpers from
`scala/private/macros/bzlmod.bzl` specifically:

- scala/private/macros/test/...
- test/shell/test_bzlmod_macros.sh

The pattern employed throughout the new module extensions is explained
in the `scala/private/macros/bzlmod.bzl` docstring.

Adding `test/shell/test_bzlmod_macros.sh` also precipitated adding a new
`assert_matches` helper to `test/shell/test_helper.sh`.
`test/shell/test_helper.sh` also introduces a mechanism for
automatically finding and skipping tests, documented in the comment at
the bottom of the file.

"Publish to BCR" configuration in the `.bcr` directory comes from:

- https://github.com/bazel-contrib/publish-to-bcr/tree/main/templates

The bazel-contrib/publish-to-bcr README contains further guidance on
configuring the app. Once that's done, we can use the app to publish a
new version to https://registry.bazel.build/ and then close bazelbuild#1482.

This change enables Bazel 7 and 8 users to migrate their `rules_scala`
dependency from `WORKSPACE` to `MODULE.bazel` whenever they're ready.

Stardoc inspired doc updates
  • Loading branch information
mbland committed Mar 4, 2025
1 parent 398ee0e commit ea8af2f
Show file tree
Hide file tree
Showing 78 changed files with 3,531 additions and 26 deletions.
10 changes: 4 additions & 6 deletions .bazelci/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,15 @@ tasks:
# Install xmllint
- sudo apt update && sudo apt install --reinstall libxml2-utils -y
- "./test_rules_scala.sh"
# Switch `last_rc` to `last_green` once Bzlmod lands.
# https://github.com/bazelbuild/rules_scala/issues/1482
test_rules_scala_linux_last_rc:
name: "./test_rules_scala (last_rc Bazel)"
test_rules_scala_linux_last_green:
name: "./test_rules_scala (last_green Bazel)"
platform: ubuntu2004
bazel: last_rc
bazel: last_green
shell_commands:
# Install xmllint
- sudo apt update && sudo apt install --reinstall libxml2-utils -y
- echo "build --enable_workspace" >> .bazelrc
- "./test_rules_scala.sh || buildkite-agent annotate --style 'warning' \"Optional build with last_rc Bazel version failed, [see here](${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}) (It is not mandatory but worth checking)\""
- "./test_rules_scala.sh || buildkite-agent annotate --style 'warning' \"Optional build with last_green Bazel version failed, [see here](${BUILDKITE_BUILD_URL}#${BUILDKITE_JOB_ID}) (It is not mandatory but worth checking)\""
test_rules_scala_macos:
name: "./test_rules_scala"
platform: macos
Expand Down
19 changes: 19 additions & 0 deletions .bazelignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Remove once the following is fixed:
# - bazelbuild/bazel: Loading top-level targets in local_path_override modules
# in child directory breaks the build #22208
# https://github.com/bazelbuild/bazel/issues/22208
dt_patches/compiler_sources
dt_patches/test_dt_patches
dt_patches/test_dt_patches_user_srcjar
examples/crossbuild
examples/overridden_artifacts
examples/scala3
examples/semanticdb
examples/testing/multi_frameworks_toolchain
examples/testing/scalatest_repositories
examples/testing/specs2_junit_repositories
test/proto_cross_repo_boundary/repo
test_cross_build
third_party/test/example_external_workspace
third_party/test/new_local_repo
third_party/test/proto
5 changes: 2 additions & 3 deletions .bazelrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# Switch to --noenable_workspace when Bzlmod lands.
# https://github.com/bazelbuild/rules_scala/issues/1482
common --enable_workspace --noenable_bzlmod
# Remove once Bazel 8 becomes the default supported version.
common --noenable_workspace

# Remove once proto toolchainization becomes the default
# - https://bazel.build/reference/command-line-reference#flag--incompatible_enable_proto_toolchain_resolution
Expand Down
Empty file added .bcr/config.yml
Empty file.
20 changes: 20 additions & 0 deletions .bcr/metadata.template.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"homepage": "https://github.com/bazelbuild/rules_scala",
"maintainers": [
{
"name": "Simonas Pinevičius",
"email": "simonas.pinevicius@gmail.com",
"github": "simuons"
},
{
"name": "Vaidas Pilkauskas",
"email": "vaidas.pilkauskas@gmail.com",
"github": "liucijus"
}
],
"repository": [
"github:bazelbuild/rules_scala"
],
"versions": [],
"yanked_versions": {}
}
14 changes: 14 additions & 0 deletions .bcr/presubmit.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# We recommend included a bcr test workspace that exercises your ruleset with bzlmod.
# For an example, see https://github.com/aspect-build/bazel-lib/tree/main/e2e/bzlmod.
bcr_test_module:
module_path: "examples/crossbuild"
matrix:
platform: ["debian10", "macos", "ubuntu2004", "windows"]
bazel: [6.x, 7.x]
tasks:
run_tests:
name: "Run test module"
platform: ${{ platform }}
bazel: ${{ bazel }}
test_targets:
- "//..."
5 changes: 5 additions & 0 deletions .bcr/source.template.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"integrity": "",
"strip_prefix": "{REPO}-{VERSION}",
"url": "https://github.com/{OWNER}/{REPO}/releases/download/{TAG}/{REPO}-{TAG}.tar.gz"
}
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,9 @@ test/semanticdb/tempsrc

# From scripts/create_repository.py
repository-artifacts.json

# Until it settles down
**/MODULE.bazel.lock

# Used by some tests, but can also be used for local experimentation.
tmp/
279 changes: 279 additions & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,279 @@
"""Bazel module definition for rules_scala"""

module(
name = "rules_scala",
version = "7.0.0",
compatibility_level = 7,
bazel_compatibility = [">=7.5.0"],
)

SCALA_VERSION = "2.12.20"

# These versions match those required by some tests, including
# test_thirdparty_version.sh.
SCALA_2_VERSIONS = [
"2.11.12",
"2.12.20",
"2.13.16",
]

SCALA_3_VERSIONS = [
"3.1.3",
"3.3.5",
"3.5.2",
"3.6.3",
]

SCALA_VERSIONS = SCALA_2_VERSIONS + SCALA_3_VERSIONS

bazel_dep(name = "bazel_skylib", version = "1.7.1")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_cc", version = "0.1.1")
bazel_dep(name = "rules_java", version = "8.9.0")
bazel_dep(name = "rules_proto", version = "7.1.0")

bazel_dep(
name = "protobuf",
version = "29.3",
repo_name = "com_google_protobuf",
)

# Temporarily required for `protoc` toolchainization until resolution of
# protocolbuffers/protobuf#19679.
single_version_override(
module_name = "protobuf",
version = "29.3",
patches = ["//protoc:0001-protobuf-19679-rm-protoc-dep.patch"],
patch_strip = 1,
)

scala_config = use_extension(
"//scala/extensions:config.bzl",
"scala_config",
)
use_repo(scala_config, "rules_scala_config")

dev_config = use_extension(
"//scala/extensions:config.bzl",
"scala_config",
dev_dependency = True,
)
dev_config.settings(
enable_compiler_dependency_tracking = True,
scala_version = SCALA_VERSION,
scala_versions = SCALA_VERSIONS,
)

scala_deps = use_extension("//scala/extensions:deps.bzl", "scala_deps")

# This is optional, but still safe to include even when not using
# `--incompatible_enable_proto_toolchain_resolution`.
register_toolchains("//protoc:all")

# Register some of our testing toolchains first when building our repo.
register_toolchains(
"//scala:unused_dependency_checker_error_toolchain",
"//test/proto:scalapb_toolchain",
"//test/toolchains:java21_toolchain_definition",
dev_dependency = True,
)

use_repo(
scala_deps,
"rules_scala_toolchains",
"scala_compiler_sources",
)

register_toolchains("@rules_scala_toolchains//...:all")

# Dev dependencies

dev_deps = use_extension(
"//scala/extensions:deps.bzl",
"scala_deps",
dev_dependency = True,
)
dev_deps.toolchains(
jmh = True,
scala_proto = True,
scalafmt = True,
scalatest = True,
junit = True,
specs2 = True,
twitter_scrooge = True,
)

use_repo(
dev_deps,
"scala_proto_rules_scalapb_compilerplugin",
"scala_proto_rules_scalapb_protoc_bridge",
"scalafmt_default",
)

# Default versions of version specific repos needed by some of our tests. Tests
# that set `--repo_env=SCALA_VERSION=...` break without using the default here,
# because version specific repos for other versions won't be available.
use_repo(
dev_deps,
"io_bazel_rules_scala_guava",
"io_bazel_rules_scala_junit_junit",
"io_bazel_rules_scala_scala_compiler",
"io_bazel_rules_scala_scala_library",
)

[
[
use_repo(dev_deps, dep + "_" + scala_version.replace(".", "_"))
for dep in [
"io_bazel_rules_scala_junit_junit",
"io_bazel_rules_scala_scala_compiler",
"io_bazel_rules_scala_scala_library",
] + (
# We can remove this condition once we drop support for Scala 2.11.
["scala_proto_rules_scalapb_protoc_gen"]
if not scala_version.startswith("2.11.") else []
)
]
for scala_version in SCALA_VERSIONS
]

[
[
use_repo(dev_deps, dep + "_" + scala_version.replace(".", "_"))
for dep in [
"io_bazel_rules_scala_scala_reflect",
]
]
for scala_version in SCALA_2_VERSIONS
]

[
[
use_repo(dev_deps, dep + "_" + scala_version.replace(".", "_"))
for dep in [
"io_bazel_rules_scala_scala_compiler_2",
"io_bazel_rules_scala_scala_library_2",
"io_bazel_rules_scala_scala_reflect_2",
]
]
for scala_version in SCALA_3_VERSIONS
]

internal_dev_deps = use_extension(
"//scala/private/extensions:dev_deps.bzl",
"dev_deps",
dev_dependency = True,
)

# See //scala/private:extensions/dev_deps.bzl for notes on some of these repos.
use_repo(
internal_dev_deps,
"com_github_bazelbuild_buildtools",
"com_github_jnr_jffi_native",
"com_google_guava_guava_21_0",
"com_google_guava_guava_21_0_with_file",
"com_twitter__scalding_date",
"org_apache_commons_commons_lang_3_5",
"org_apache_commons_commons_lang_3_5_without_file",
"org_springframework_spring_core",
"org_springframework_spring_tx",
"org_typelevel__cats_core",
"org_typelevel_kind_projector",
)

java_toolchains = use_extension(
"@rules_java//java:extensions.bzl",
"toolchains",
dev_dependency = True,
)

use_repo(
java_toolchains,
# //test/toolchains:java21_toolchain
"remotejdk21_linux",
"remotejdk21_macos",
"remotejdk21_win",
# //test/jmh:test_jmh_jdk8
"remote_jdk8_linux",
"remote_jdk8_macos",
"remote_jdk8_windows",
)

[
(
bazel_dep(name = name, dev_dependency = True),
local_path_override(module_name = name, path = path)
)
for name, path in [
(
"proto_cross_repo_boundary",
"test/proto_cross_repo_boundary/repo",
),
(
"test_new_local_repo",
"third_party/test/new_local_repo",
),
(
"example_external_workspace",
"third_party/test/example_external_workspace",
),
]
]

bazel_dep(
name = "bazel_ci_rules",
version = "1.0.0",
dev_dependency = True,
repo_name = "bazelci_rules",
)
bazel_dep(
name = "rules_go",
version = "0.53.0",
dev_dependency = True,
repo_name = "io_bazel_rules_go", # for com_github_bazelbuild_buildtools
)
bazel_dep(name = "gazelle", version = "0.42.0", dev_dependency = True)

go_sdk = use_extension(
"@io_bazel_rules_go//go:extensions.bzl",
"go_sdk",
dev_dependency = True,
)
go_sdk.download(version = "1.24.0")

go_deps = use_extension(
"@gazelle//:extensions.bzl",
"go_deps",
dev_dependency = True,
)

# The go_deps.module calls are inspired by the following to get the
# com_github_bazelbuild_buildtools repo to work:
#
# - https://github.com/bazelbuild/bazel-central-registry/blob/main/modules/gazelle/0.39.1/MODULE.bazel#L31-L57
#
# To get the latest version and hashes for each per:
#
# - https://go.dev/ref/mod#go-list-m
# - https://go.dev/ref/mod#checksum-database
#
# go list -m golang.org/x/tools@latest
# curl https://sum.golang.org/lookup/golang.org/x/tools@v0.29.0
go_deps.module(
path = "golang.org/x/tools",
sum = "h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=",
version = "v0.30.0",
)

go_deps.module(
path = "github.com/golang/protobuf",
sum = "h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=",
version = "v1.5.4",
)
use_repo(
go_deps,
"com_github_golang_protobuf",
"org_golang_x_tools",
)

bazel_dep(name = "rules_python", version = "1.2.0", dev_dependency = True)
Loading

0 comments on commit ea8af2f

Please sign in to comment.