From 92a17aa8407c04baf5742650a969a78ca3104aa4 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Sun, 16 Jan 2022 14:52:37 +0100 Subject: [PATCH] Add basic bzlmod setup This commit adds a MODULE.bazel that makes rules_go usable as a bzlmod module for basic use cases. The new module definition is verified by a test module that will be used in the presubmit tests of the Bazel Central Registry (BCR). The following features require more thought and/or work and are not yet supported: * SDK rules other than go_host_sdk and go_download_sdk. * non-no-op nogo * go_proto_library --- .bazelci/presubmit.yml | 14 +++++++++++ .bazelignore | 1 + .gitignore | 1 + MODULE.bazel | 23 +++++++++++++++++ go/extensions.bzl | 3 +++ go/private/extensions.bzl | 53 +++++++++++++++++++++++++++++++++++++++ tests/bcr/.bazelrc | 1 + tests/bcr/.bazelversion | 1 + tests/bcr/BUILD.bazel | 19 ++++++++++++++ tests/bcr/MODULE.bazel | 15 +++++++++++ tests/bcr/WORKSPACE | 0 tests/bcr/lib.go | 5 ++++ tests/bcr/main.go | 11 ++++++++ tests/bcr/test.go | 11 ++++++++ 14 files changed, 158 insertions(+) create mode 100644 .bazelignore create mode 100644 MODULE.bazel create mode 100644 go/extensions.bzl create mode 100644 go/private/extensions.bzl create mode 100644 tests/bcr/.bazelrc create mode 100644 tests/bcr/.bazelversion create mode 100644 tests/bcr/BUILD.bazel create mode 100644 tests/bcr/MODULE.bazel create mode 100644 tests/bcr/WORKSPACE create mode 100644 tests/bcr/lib.go create mode 100644 tests/bcr/main.go create mode 100644 tests/bcr/test.go diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 2c62debc75..0984956740 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -23,6 +23,20 @@ tasks: - "//..." test_targets: - "//..." + ubuntu2004_bcr_tests: + name: BCR test module + platform: ubuntu2004 + bazel: 6.0.0-pre.20220526.1 + working_directory: tests/bcr + build_flags: + - "--experimental_enable_bzlmod" + test_flags: + - "--experimental_enable_bzlmod" + build_targets: + - "//..." + - "@go_sdk//..." + test_targets: + - "//..." macos: shell_commands: - tests/core/cgo/generate_imported_dylib.sh diff --git a/.bazelignore b/.bazelignore new file mode 100644 index 0000000000..23758d5ac9 --- /dev/null +++ b/.bazelignore @@ -0,0 +1 @@ +tests/bcr diff --git a/.gitignore b/.gitignore index 0f1e744f59..058e45bf49 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /bazel-* /tests/core/cgo/libimported.* /tests/core/cgo/libversioned.* +/tests/bcr/bazel-* diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000000..820be22d2c --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,23 @@ +module( + name = "io_bazel_rules_go", + version = "0.33.0", + compatibility_level = 0, + toolchains_to_register = [ + "@go_default_sdk//:all", + ], +) + +print("WARNING: The rules_go Bazel module is still highly experimental and subject to change at any time. Only use it to try out bzlmod for now.") + +bazel_dep(name = "bazel_skylib", version = "1.2.0") +bazel_dep(name = "platforms", version = "0.0.4") + +non_module_dependencies = use_extension("@io_bazel_rules_go//go/private:extensions.bzl", "non_module_dependencies") +use_repo( + non_module_dependencies, + "io_bazel_rules_nogo", +) + +go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk") +go_sdk.download(name = "go_default_sdk", version = "1.18.3") +use_repo(go_sdk, "go_default_sdk") diff --git a/go/extensions.bzl b/go/extensions.bzl new file mode 100644 index 0000000000..f7c86ada2a --- /dev/null +++ b/go/extensions.bzl @@ -0,0 +1,3 @@ +load("//go/private:extensions.bzl", _go_sdk = "go_sdk") + +go_sdk = _go_sdk diff --git a/go/private/extensions.bzl b/go/private/extensions.bzl new file mode 100644 index 0000000000..cb88521cf7 --- /dev/null +++ b/go/private/extensions.bzl @@ -0,0 +1,53 @@ +load("//go/private:sdk.bzl", "go_download_sdk", "go_host_sdk") +load("//go/private:repositories.bzl", "go_rules_dependencies") + +_download_tag = tag_class( + attrs = { + "name": attr.string(mandatory = True), + "goos": attr.string(), + "goarch": attr.string(), + "sdks": attr.string_list_dict(), + "urls": attr.string_list(default = ["https://dl.google.com/go/{}"]), + "version": attr.string(), + "strip_prefix": attr.string(default = "go"), + }, +) + +_host_tag = tag_class( + attrs = { + "name": attr.string(mandatory = True), + }, +) + +def _go_sdk_impl(ctx): + for mod in ctx.modules: + for download_tag in mod.tags.download: + go_download_sdk( + name = download_tag.name, + goos = download_tag.goos, + goarch = download_tag.goarch, + sdks = download_tag.sdks, + urls = download_tag.urls, + version = download_tag.version, + register_toolchains = False, + ) + for host_tag in mod.tags.host: + go_host_sdk( + name = host_tag.name, + register_toolchains = False, + ) + +go_sdk = module_extension( + implementation = _go_sdk_impl, + tag_classes = { + "download": _download_tag, + "host": _host_tag, + }, +) + +def _non_module_dependencies_impl(ctx): + go_rules_dependencies(force = True) + +non_module_dependencies = module_extension( + implementation = _non_module_dependencies_impl, +) diff --git a/tests/bcr/.bazelrc b/tests/bcr/.bazelrc new file mode 100644 index 0000000000..e2ece0c386 --- /dev/null +++ b/tests/bcr/.bazelrc @@ -0,0 +1 @@ +build --experimental_enable_bzlmod diff --git a/tests/bcr/.bazelversion b/tests/bcr/.bazelversion new file mode 100644 index 0000000000..7229a26b2f --- /dev/null +++ b/tests/bcr/.bazelversion @@ -0,0 +1 @@ +6.0.0-pre.20220526.1 diff --git a/tests/bcr/BUILD.bazel b/tests/bcr/BUILD.bazel new file mode 100644 index 0000000000..5da66dfa88 --- /dev/null +++ b/tests/bcr/BUILD.bazel @@ -0,0 +1,19 @@ +load("@my_rules_go//go:def.bzl", "go_binary", "go_library", "go_test") + +go_library( + name = "lib", + srcs = ["lib.go"], + importpath = "example.com/lib", +) + +go_binary( + name = "main", + srcs = ["main.go"], + deps = [":lib"], +) + +go_test( + name = "test", + srcs = ["test.go"], + embed = [":lib"], +) diff --git a/tests/bcr/MODULE.bazel b/tests/bcr/MODULE.bazel new file mode 100644 index 0000000000..9d7a1bd8df --- /dev/null +++ b/tests/bcr/MODULE.bazel @@ -0,0 +1,15 @@ +module( + name = "rules_go_bcr_tests", + # Test that the default SDK is registered by not registering one from the test module. +) + +bazel_dep(name = "io_bazel_rules_go", version = "", repo_name = "my_rules_go") +local_path_override( + module_name = "io_bazel_rules_go", + path = "../..", +) + +# Test that this correctly downloads the SDK by requesting it from the commandline (see presubmit.yml). +go_sdk = use_extension("@my_rules_go//go:extensions.bzl", "go_sdk") +go_sdk.download(name = "go_sdk", version = "1.17.5") +use_repo(go_sdk, "go_sdk") diff --git a/tests/bcr/WORKSPACE b/tests/bcr/WORKSPACE new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/bcr/lib.go b/tests/bcr/lib.go new file mode 100644 index 0000000000..d162287c3d --- /dev/null +++ b/tests/bcr/lib.go @@ -0,0 +1,5 @@ +package lib + +func Name() string { + return "bzlmod" +} diff --git a/tests/bcr/main.go b/tests/bcr/main.go new file mode 100644 index 0000000000..46c058ef1d --- /dev/null +++ b/tests/bcr/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "fmt" + + "example.com/lib" +) + +func main() { + fmt.Printf("Hello %s!", lib.Name()) +} diff --git a/tests/bcr/test.go b/tests/bcr/test.go new file mode 100644 index 0000000000..910c06beec --- /dev/null +++ b/tests/bcr/test.go @@ -0,0 +1,11 @@ +package lib + +import ( + "testing" +) + +func TestName(t *testing.T) { + if Name() != "bzlmod" { + t.Fail() + } +}