| Build modes |
| =========== |
| |
| .. _Bazel build settings: https://docs.bazel.build/versions/master/skylark/config.html#using-build-settings |
| .. _Bazel configuration transitions: https://docs.bazel.build/versions/master/skylark/lib/transition.html |
| .. _Bazel platform: https://docs.bazel.build/versions/master/platforms.html |
| |
| .. _go_library: /docs/go/core/rules.md#go_library |
| .. _go_binary: /docs/go/core/rules.md#go_binary |
| .. _go_test: /docs/go/core/rules.md#go_test |
| .. _toolchain: toolchains.rst#the-toolchain-object |
| |
| .. _config_setting: https://docs.bazel.build/versions/master/be/general.html#config_setting |
| .. _platform: https://docs.bazel.build/versions/master/be/platform.html#platform |
| .. _select: https://docs.bazel.build/versions/master/be/functions.html#select |
| |
| .. role:: param(kbd) |
| .. role:: type(emphasis) |
| .. role:: value(code) |
| |
| .. contents:: :depth: 2 |
| |
| Overview |
| -------- |
| |
| The Go toolchain can be configured to build targets in different modes using |
| `Bazel build settings`_ specified on the command line or by using attributes |
| specified on individual `go_binary`_ or `go_test`_ targets. For example, tests |
| may be run in race mode with the command line flag |
| ``--@io_bazel_rules_go//go/config:race`` or by setting ``race = "on"`` on the |
| individual test targets. |
| |
| Similarly, the Go toolchain can be made to cross-compile binaries for a specific |
| platform by setting the ``--platforms`` command line flag or by setting the |
| ``goos`` and ``goarch`` attributes of the binary target. For example, a binary |
| could be built for ``linux`` / ``arm64`` using the command line flag |
| ``--platforms=@io_bazel_rules_go//go/toolchain:linux_arm64`` or by setting |
| ``goos = "linux"`` and ``goarch = "arm64"``. |
| |
| Build settings |
| -------------- |
| |
| The build settings below are defined in the package |
| ``@io_bazel_rules_go//go/config``. They can all be set on the command line |
| or using `Bazel configuration transitions`_. |
| |
| +-------------------+----------------+-----------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`static` | :type:`bool` | :value:`false` | |
| +-------------------+---------------------+------------------------------------+ |
| | Statically links the target binary. May not always work since parts of the | |
| | standard library and other C dependencies won't tolerate static linking. | |
| | Works best with ``pure`` set as well. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`race` | :type:`bool` | :value:`false` | |
| +-------------------+---------------------+------------------------------------+ |
| | Instruments the binary for race detection. Programs will panic when a data | |
| | race is detected. Requires cgo. Mutually exclusive with ``msan``. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`msan` | :type:`bool` | :value:`false` | |
| +-------------------+---------------------+------------------------------------+ |
| | Instruments the binary for memory sanitization. Requires cgo. Mutually | |
| | exclusive with ``race``. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`pure` | :type:`bool` | :value:`false` | |
| +-------------------+---------------------+------------------------------------+ |
| | Disables cgo, even when a C/C++ toolchain is configured (similar to setting | |
| | ``CGO_ENABLED=0``). Packages that contain cgo code may still be built, but | |
| | the cgo code will be filtered out, and the ``cgo`` build tag will be false. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`strip` | :type:`bool` | :value:`false` | |
| +-------------------+---------------------+------------------------------------+ |
| | Strips symbols from compiled packages and linked binaries (using the ``-w`` | |
| | flag). May also be set with the ``--strip`` command line option, which | |
| | affects C/C++ targets, too. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`debug` | :type:`bool` | :value:`false` | |
| +-------------------+---------------------+------------------------------------+ |
| | Includes debugging information in compiled packages (using the ``-N`` and | |
| | ``-l`` flags). This is always true with ``-c dbg``. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`gotags` | :type:`string_list` | :value:`[]` | |
| +-------------------+---------------------+------------------------------------+ |
| | Controls which build tags are enabled when evaluating build constraints in | |
| | source files. Useful for conditional compilation. | |
| +-------------------+---------------------+------------------------------------+ |
| | :param:`linkmode` | :type:`string` | :value:`"normal"` | |
| +-------------------+---------------------+------------------------------------+ |
| | Determines how the Go binary is built and linked. Similar to ``-buildmode``. | |
| | Must be one of ``"normal"``, ``"shared"``, ``"pie"``, ``"plugin"``, | |
| | ``"c-shared"``, ``"c-archive"``. | |
| +-------------------+---------------------+------------------------------------+ |
| |
| Platforms |
| --------- |
| |
| You can define a `Bazel platform`_ using the native `platform`_ rule. A platform |
| is essentially a list of facts (constraint values) about a target platform. |
| rules_go defines a ``platform`` for each configuration the Go toolchain supports |
| in ``@io_bazel_rules_go//go/toolchain``. There are also `config_setting`_ targets |
| in ``@io_bazel_rules_go//go/platform`` that can be used to pick platform-specific |
| sources or dependencies using `select`_. |
| |
| You can specify a target platform using the ``--platforms`` command line flag. |
| Bazel will automatically select a registered toolchain compatible with the |
| target platform (rules_go registers toolchains for all supported platforms). |
| For example, you could build for Linux / arm64 with the flag |
| ``--platforms=@io_bazel_rules_go//go/toolchain:linux_arm64``. |
| |
| You can set the ``goos`` and ``goarch`` attributes on an individual |
| `go_binary`_ or `go_test`_ rule to build a binary for a specific platform. |
| This sets the ``--platforms`` flag via `Bazel configuration transitions`_. |
| |
| |
| Examples |
| -------- |
| |
| Building pure go binaries |
| ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| You can switch the default binaries to non cgo using |
| |
| .. code:: bash |
| bazel build --@io_bazel_rules_go//go/config:pure //:my_binary |
| You can build pure go binaries by setting those attributes on a binary. |
| |
| .. code:: bzl |
| |
| go_binary( |
| name = "foo", |
| srcs = ["foo.go"], |
| pure = "on", |
| ) |
| |
| |
| Building static binaries |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| | Note that static linking does not work on darwin. |
| |
| You can switch the default binaries to statically linked binaries using |
| |
| .. code:: bash |
| bazel build --@io_bazel_rules_go//go/config:static //:my_binary |
| You can build static go binaries by setting those attributes on a binary. |
| If you want it to be fully static (no libc), you should also specify pure. |
| |
| .. code:: bzl |
| |
| go_binary( |
| name = "foo", |
| srcs = ["foo.go"], |
| static = "on", |
| ) |
| |
| |
| Using the race detector |
| ~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| You can switch the default binaries to race detection mode, and thus also switch |
| the mode of tests by using |
| |
| .. code:: |
| |
| bazel test --@io_bazel_rules_go//go/config:race //... |
| |
| Alternatively, you can activate race detection for specific tests. |
| |
| .. code:: |
| |
| go_test( |
| name = "go_default_test", |
| srcs = ["lib_test.go"], |
| embed = [":go_default_library"], |
| race = "on", |
| ) |