Go rules
Overview
The rules should be considered experimental. They support:
- libraries
- binaries
- tests
- vendoring
- cgo
They currently do not support (in order of importance):
//+build tags
- auto generated BUILD files.
- C/C++ interoperation except cgo (swig etc.)
- race detector
- coverage
- test sharding
Setup
-
Decide on the name of your package, eg. github.com/joe/project
-
Add the following to your WORKSPACE file:
git_repository(
name = "io_bazel_rules_go",
remote = "https://github.com/bazelbuild/rules_go.git",
tag = "0.0.2",
)
load("@io_bazel_rules_go//go:def.bzl", "go_repositories")
go_repositories()
-
Add a BUILD file to the top of your workspace, declaring the name of your
workspace using go_prefix. It is strongly recommended that the prefix is not
empty.
load("@io_bazel_rules_go//go:def.bzl", "go_prefix")
go_prefix("github.com/joe/project")
-
For a library github.com/joe/project/lib, create lib/BUILD, containing
load("@io_bazel_rules_go//go:def.bzl", "go_library")
go_library(
name = "go_default_library",
srcs = ["file.go"]
)
-
Inside your project, you can use this library by declaring a dependency
go_binary(
...
deps = ["//lib:go_default_library"]
)
-
In this case, import the library as github.com/joe/project/lib.
-
For vendored libraries, you may depend on
//lib/vendor/github.com/user/project:go_default_library. Vendored
libraries should have BUILD files like normal libraries.
-
To declare a test,
go_test(
name = "mytest",
srcs = ["file_test.go"],
library = ":go_default_library"
)
FAQ
Yes, this setup was deliberately chosen to be compatible with the go
tool. Make sure your workspace appears under
$GOROOT/src/github.com/joe/project/
eg.
mkdir -p $GOROOT/src/github.com/joe/
ln -s my/bazel/workspace $GOROOT/src/github.com/joe/project
and it should work.
Disclaimer
These rules are not supported by Google's Go team.
go_prefix
go_prefix(prefix)
| Attributes |
prefix |
String, required
Global prefix used to fully quality all Go targets.
In Go, imports are always fully qualified with a URL, eg.
github.com/user/project. Hence, a label //foo:bar
from within a Bazel workspace must be referred to as
github.com/user/project/foo/bar. To make this work, each
rule must know the repository's URL. This is achieved, by having all
go rules depend on a globally unique target that has a
go_prefix transitive info provider.
|
go_library
go_library(name, srcs, deps, data)
| Attributes |
name |
Name, required
A unique name for this rule.
|
srcs |
List of labels, required
List of Go .go source files used to build the
library
|
deps |
List of labels, optional
List of other libraries to linked to this library target
|
data |
List of labels, optional
List of files needed by this rule at runtime.
|
cgo_library
cgo_library(name, srcs, copts, linkopts, deps, data)
| Attributes |
name |
Name, required
A unique name for this rule.
|
srcs |
List of labels, required
List of Go, C and C++ files that are processed to build a Go
library.
Those Go files must contain import "C". C and C++ files
can be anything allowed in srcs attribute of
cc_library.
|
copts |
List of strings, optional
Add these flags to the C++ compiler
|
linkopts |
List of strings, optional
Add these flags to the C++ linker
|
deps |
List of labels, optional
List of C/C++ libraries to be linked into the binary target.
They must be cc_library rules.
|
data |
List of labels, optional
List of files needed by this rule at runtime.
|
NOTE
srcs cannot contain pure-Go files, which do not have import "C".
So you need to define another go_library when you build a go package with
both cgo-enabled and pure-Go sources.
cgo_library(
name = "cgo-enabled",
srcs = ["cgo-enabled.go", "foo.cc", "bar.S", "baz.a"],
)
go_library(
name = "go_default_library",
srcs = ["pure-go.go"],
library = ":cgo_enabled",
)
go_binary
go_binary(name, srcs, deps, data)
| Attributes |
name |
Name, required
A unique name for this rule.
|
srcs |
List of labels, required
List of Go .go source files used to build the
binary
|
deps |
List of labels, optional
List of other libraries to linked to this binary target
|
data |
List of labels, optional
List of files needed by this rule at runtime.
|
go_test
go_test(name, srcs, deps, data)
| Attributes |
name |
Name, required
A unique name for this rule.
|
srcs |
List of labels, required
List of Go .go source files used to build the
test
|
deps |
List of labels, optional
List of other libraries to linked to this test target
|
data |
List of labels, optional
List of files needed by this rule at runtime.
|