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.4",
)
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 qualify 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 (at least one) or ASM .s/.S
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, clinkopts, cdeps, 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
|
clinkopts |
List of strings, optional
Add these flags to the C++ linker
|
cdeps |
List of labels, optional
List of C/C++ libraries to be linked into the binary target.
They must be cc_library rules.
|
deps |
List of labels, optional
List of other Go libraries to be linked to this library
|
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 (at least one) or ASM .s/.S
source files used to build the binary
|
deps |
List of labels, optional
List of other Go 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 (at least one) or ASM .s/.S
source files used to build the test
|
deps |
List of labels, optional
List of other Go libraries to linked to this test target
|
data |
List of labels, optional
List of files needed by this rule at runtime.
|