Skip to content

Commit

Permalink
Add basic bzlmod setup
Browse files Browse the repository at this point in the history
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
  • Loading branch information
fmeum committed Jun 7, 2022
1 parent e6149ca commit 47ed8b1
Show file tree
Hide file tree
Showing 13 changed files with 155 additions and 0 deletions.
14 changes: 14 additions & 0 deletions .bazelci/presubmit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,20 @@ tasks:
- "//..."
test_targets:
- "//..."
ubuntu2004_bcr_tests:
name: BCR test module
platform: ubuntu2004
bazel: 5.2.0
working_directory: bcr_tests
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
Expand Down
1 change: 1 addition & 0 deletions .bazelignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bcr_tests
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/bazel-*
/tests/core/cgo/libimported.*
/tests/core/cgo/libversioned.*
/bcr_tests/bazel-*
21 changes: 21 additions & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module(
name = "io_bazel_rules_go",
version = "0.33.0",
compatibility_level = 1,
toolchains_to_register = [
"@go_default_sdk//:all",
],
)

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")
1 change: 1 addition & 0 deletions bcr_tests/.bazelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build --experimental_enable_bzlmod
19 changes: 19 additions & 0 deletions bcr_tests/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
load("@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"],
)
15 changes: 15 additions & 0 deletions bcr_tests/MODULE.bazel
Original file line number Diff line number Diff line change
@@ -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 = "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("@rules_go//go:extensions.bzl", "go_sdk")
go_sdk.download(name = "go_sdk", version = "1.17.5")
use_repo(go_sdk, "go_sdk")
Empty file added bcr_tests/WORKSPACE
Empty file.
5 changes: 5 additions & 0 deletions bcr_tests/lib.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package lib

func Name() string {
return "bzlmod"
}
11 changes: 11 additions & 0 deletions bcr_tests/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package main

import (
"fmt"

"example.com/lib"
)

func main() {
fmt.Printf("Hello %s!", lib.Name())
}
11 changes: 11 additions & 0 deletions bcr_tests/test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package lib

import (
"testing"
)

func TestName(t *testing.T) {
if Name() != "bzlmod" {
t.Fail()
}
}
3 changes: 3 additions & 0 deletions go/extensions.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
load("//go/private:extensions.bzl", _go_sdk = "go_sdk")

go_sdk = _go_sdk
53 changes: 53 additions & 0 deletions go/private/extensions.bzl
Original file line number Diff line number Diff line change
@@ -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,
)

0 comments on commit 47ed8b1

Please sign in to comment.