| Core Go rules |
| ============= |
| |
| .. _"Make variable": https://docs.bazel.build/versions/master/be/make-variables.html |
| .. _Bourne shell tokenization: https://docs.bazel.build/versions/master/be/common-definitions.html#sh-tokenization |
| .. _Gazelle: https://github.com/bazelbuild/bazel-gazelle |
| .. _GoArchive: providers.rst#GoArchive |
| .. _GoLibrary: providers.rst#GoLibrary |
| .. _GoPath: providers.rst#GoPath |
| .. _GoSource: providers.rst#GoSource |
| .. _build constraints: https://golang.org/pkg/go/build/#hdr-Build_Constraints |
| .. _cc library deps: https://docs.bazel.build/versions/master/be/c-cpp.html#cc_library.deps |
| .. _cgo: http://golang.org/cmd/cgo/ |
| .. _config_setting: https://docs.bazel.build/versions/master/be/general.html#config_setting |
| .. _data dependencies: https://docs.bazel.build/versions/master/build-ref.html#data |
| .. _goarch: modes.rst#goarch |
| .. _goos: modes.rst#goos |
| .. _mode attributes: modes.rst#mode-attributes |
| .. _nogo: nogo.rst#nogo |
| .. _pure: modes.rst#pure |
| .. _select: https://docs.bazel.build/versions/master/be/functions.html#select |
| .. _shard_count: https://docs.bazel.build/versions/master/be/common-definitions.html#test.shard_count |
| .. _static: modes.rst#static |
| .. _test_arg: https://docs.bazel.build/versions/master/user-manual.html#flag--test_arg |
| .. _test_filter: https://docs.bazel.build/versions/master/user-manual.html#flag--test_filter |
| .. _write a CROSSTOOL file: https://github.com/bazelbuild/bazel/wiki/Yet-Another-CROSSTOOL-Writing-Tutorial |
| |
| .. role:: param(kbd) |
| .. role:: type(emphasis) |
| .. role:: value(code) |
| .. |mandatory| replace:: **mandatory value** |
| |
| These are the core go rules, required for basic operation. |
| The intent is that these rules are sufficient to match the capabilities of the normal go tools. |
| |
| .. contents:: :depth: 2 |
| |
| ----- |
| |
| Introduction |
| ------------ |
| |
| Three core rules may be used to build most projects: `go_library`_, `go_binary`_, |
| and `go_test`_. |
| |
| `go_library`_ builds a single package. It has a list of source files |
| (specified with ``srcs``) and may depend on other packages (with ``deps``). |
| Each `go_library`_ has an ``importpath``, which is the name used to import it |
| in Go source files. |
| |
| `go_binary`_ also builds a single ``main`` package and links it into an |
| executable. It may embed the content of a `go_library`_ using the ``embed`` |
| attribute. Embedded sources are compiled together in the same package. |
| Binaries can be built for alternative platforms and configurations by setting |
| ``goos``, ``goarch``, and other attributes. |
| |
| `go_test`_ builds a test executable. Like tests produced by ``go test``, this |
| consists of three packages: an internal test package compiled together with |
| the library being tested (specified with ``embed``), an external test package |
| compiled separately, and a generated test main package. |
| |
| Defines and stamping |
| ~~~~~~~~~~~~~~~~~~~~ |
| |
| In order to provide build time information to go code without data files, we |
| support the concept of stamping. |
| |
| Stamping asks the linker to substitute the value of a global variable with a |
| string determined at link time. Stamping only happens when linking a binary, not |
| when compiling a package. This means that changing a value results only in |
| re-linking, not re-compilation and thus does not cause cascading changes. |
| |
| Link values are set in the :param:`x_defs` attribute of any Go rule. This is a |
| map of string to string, where keys are the names of variables to substitute, |
| and values are the string to use. Keys may be names of variables in the package |
| being compiled, or they may be fully qualified names of variables in another |
| package. |
| |
| These mappings are collected up across the entire transitive dependencies of a |
| binary. This means you can set a value using :param:`x_defs` in a |
| ``go_library``, and any binary that links that library will be stamped with that |
| value. You can also override stamp values from libraries using :param:`x_defs` |
| on the ``go_binary`` rule if needed. The ``--[no]stamp`` option controls whether |
| stamping of workspace variables is enabled. |
| |
| Example |
| ^^^^^^^ |
| |
| Suppose we have a small library that contains the current version. |
| |
| .. code:: go |
| |
| package version |
| |
| var Version = "redacted" |
| |
| We can set the version in the ``go_library`` rule for this library. |
| |
| .. code:: bzl |
| |
| go_library( |
| name = "go_default_library", |
| srcs = ["version.go"], |
| importpath = "example.com/repo/version", |
| x_defs = {"Version": "0.9"}, |
| ) |
| |
| Binaries that depend on this library may also set this value. |
| |
| .. code:: bzl |
| |
| go_binary( |
| name = "cmd", |
| srcs = ["main.go"], |
| deps = ["//version:go_default_library"], |
| x_defs = {"example.com/repo/version.Version": "0.9"}, |
| ) |
| |
| Stamping with the workspace status script |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| You can use values produced by the workspace status command in your link stamp. |
| To use this functionality, write a script that prints key-value pairs, separated |
| by spaces, one per line. For example: |
| |
| .. code:: bash |
| |
| #!/usr/bin/env bash |
| |
| echo STABLE_GIT_COMMIT $(git rev-parse HEAD) |
| |
| **NOTE:** keys that start with ``STABLE_`` will trigger a re-link when they change. |
| Other keys will NOT trigger a re-link. |
| |
| You can reference these in :param:`x_defs` using curly braces. |
| |
| .. code:: bzl |
| |
| go_binary( |
| name = "cmd", |
| srcs = ["main.go"], |
| deps = ["//version:go_default_library"], |
| x_defs = {"example.com/repo/version.Version": "{STABLE_GIT_COMMIT}"}, |
| ) |
| |
| You can build using the status script using the ``--workspace_status_command`` |
| argument on the command line: |
| |
| .. code:: bash |
| |
| $ bazel build --stamp --workspace_status_command=./status.sh //:cmd |
| |
| Embedding |
| ~~~~~~~~~ |
| |
| The sources, dependencies, and data of a ``go_library`` may be *embedded* |
| within another ``go_library``, ``go_binary``, or ``go_test`` using the ``embed`` |
| attribute. The embedding package will be compiled into a single archive |
| file. The embedded package may still be compiled as a separate target. |
| |
| A minimal example of embedding is below. In this example, the command ``bazel |
| build :foo_and_bar`` will compile ``foo.go`` and ``bar.go`` into a single |
| archive. ``bazel build :bar`` will compile only ``bar.go``. Both libraries must |
| have the same ``importpath``. |
| |
| .. code:: bzl |
| |
| go_library( |
| name = "foo_and_bar", |
| srcs = ["foo.go"], |
| embed = [":bar"], |
| importpath = "example.com/foo", |
| ) |
| |
| go_library( |
| name = "bar", |
| srcs = ["bar.go"], |
| importpath = "example.com/foo", |
| ) |
| |
| Embedding is most frequently used for tests and binaries. Go supports two |
| different kinds of tests. *Internal tests* (e.g., ``package foo``) are compiled |
| into the same archive as the library under test and can reference unexported |
| definitions in that library. *External tests* (e.g., ``package foo_test``) are |
| compiled into separate archives and may depend on exported definitions from the |
| internal test archive. |
| |
| In order to compile the internal test archive, we *embed* the ``go_library`` |
| under test into a ``go_test`` that contains the test sources. The ``go_test`` |
| rule can automatically distinguish internal and external test sources, so they |
| can be listed together in ``srcs``. The ``go_library`` under test does not |
| contain test sources. Other ``go_binary`` and ``go_library`` targets can depend |
| on it or embed it. |
| |
| .. code:: bzl |
| |
| go_library( |
| name = "go_default_library", |
| srcs = ["foo.go"], |
| importpath = "example.com/foo", |
| ) |
| |
| go_binary( |
| name = "foo", |
| embed = [":go_default_library"], |
| ) |
| |
| go_test( |
| name = "go_default_test", |
| srcs = [ |
| "foo_external_test.go", |
| "foo_internal_test.go", |
| ], |
| embed = [":go_default_library"], |
| ) |
| |
| Embedding may also be used to add extra sources sources to a |
| ``go_proto_library``. |
| |
| .. code:: bzl |
| |
| proto_library( |
| name = "foo_proto", |
| srcs = ["foo.proto"], |
| ) |
| |
| go_proto_library( |
| name = "foo_go_proto", |
| importpath = "example.com/foo", |
| proto = ":foo_proto", |
| ) |
| |
| go_library( |
| name = "go_default_library", |
| srcs = ["extra.go"], |
| embed = [":foo_go_proto"], |
| importpath = "example.com/foo", |
| ) |
| |
| Rules |
| ----- |
| |
| go_library |
| ~~~~~~~~~~ |
| |
| This builds a Go library from a set of source files that are all part of |
| the same package. |
| |
| Providers |
| ^^^^^^^^^ |
| |
| * GoLibrary_ |
| * GoSource_ |
| * GoArchive_ |
| |
| Attributes |
| ^^^^^^^^^^ |
| |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A unique name for this rule. | |
| | | |
| | To interoperate cleanly with Gazelle_ right now this should be :value:`go_default_library`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`importpath` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The source import path of this library. Other libraries can import this | |
| | library using this path. This must either be specified in ``go_library`` or | |
| | inherited from one of the libraries in ``embed``. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`importmap` | :type:`string` | :value:`""` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The actual import path of this library. This is mostly only visible to the | |
| | compiler and linker, but it may also be seen in stack traces. This may be set | |
| | to prevent a binary from linking multiple packages with the same import path | |
| | e.g., from different vendor directories. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`srcs` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of Go source files that are compiled to create the package. | |
| | Only :value:`.go` files are permitted, unless the cgo attribute is set, in which case the | |
| | following file types are permitted: :value:`.go, .c, .s, .S .h`. | |
| | The files may contain Go-style `build constraints`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`x_defs` | :type:`string_dict` | :value:`{}` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Map of defines to add to the go link command. | |
| | See `Defines and stamping`_ for examples of how to use these. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`deps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries this library imports directly. | |
| | These may be go_library rules or compatible rules with the GoLibrary_ provider. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`embed` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries whose sources should be compiled together with this | |
| | library's sources. Labels listed here must name ``go_library``, | |
| | ``go_proto_library``, or other compatible targets with the GoLibrary_ and | |
| | GoSource_ providers. Embedded libraries must have the same ``importpath`` as | |
| | the embedding library. At most one embedded library may have ``cgo = True``, | |
| | and the embedding library may not also have ``cgo = True``. See Embedding_ | |
| | for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`data` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of files needed by this rule at runtime. Targets named in the data attribute will | |
| | appear in the *.runfiles area of this rule, if it has one. This may include data files needed | |
| | by the binary, or other programs needed by it. See `data dependencies`_ for more information | |
| | about how to depend on and use data files. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gc_goopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the Go compilation command when using the gc compiler. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cgo` | :type:`boolean` | :value:`False` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | If :value:`True`, the package uses cgo_. | |
| | The cgo tool permits Go code to call C code and vice-versa. | |
| | This does not support calling C++. | |
| | When cgo is set, :param:`srcs` may contain C, C++, Objective-C, Objective-C++, | |
| | and assembly files. These files will be compiled with the compiler from | |
| | the configured C/C++ toolchain. The compiled objects are included in | |
| | the package. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cdeps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of other libraries that the c code depends on. | |
| | This can be anything that would be allowed in `cc library deps`_ | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`copts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C compilation command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cxxopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C++ compilation command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cppopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C/C++ preprocessor command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`clinkopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C link command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| |
| Example |
| ^^^^^^^ |
| |
| .. code:: bzl |
| |
| go_library( |
| name = "go_default_library", |
| srcs = [ |
| "foo.go", |
| "bar.go", |
| ], |
| deps = [ |
| "//tools:go_default_library", |
| "@org_golang_x_utils//stuff:go_default_library", |
| ], |
| importpath = "github.com/example/project/foo", |
| visibility = ["//visibility:public"], |
| ) |
| |
| go_tool_library |
| ~~~~~~~~~~~~~~~ |
| |
| This builds a Go library from a set of source files that are all part of |
| the same package. |
| |
| This rule is a limited variant of ``go_library`` which may be used to |
| bootstrap tools used by rules_go. This avoids a circular dependency. |
| If you are building analyzers to be linked into a `nogo`_ binary, you'll |
| need to use ``go_tool_library`` since ``go_library`` depends on `nogo`_ |
| implicitly. |
| |
| Providers |
| ^^^^^^^^^ |
| |
| * GoLibrary_ |
| * GoSource_ |
| * GoArchive_ |
| |
| Attributes |
| ^^^^^^^^^^ |
| |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A unique name for this rule. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`srcs` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of Go source files that are compiled to create the package. | |
| | Only :value:`.go` files are permitted. Cgo, assembly, and build constraints | |
| | are not supported. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`deps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries this library imports directly. | |
| | These must be ``go_tool_library`` targets to avoid circular dependencies. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`embed` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries whose sources should be compiled together with this | |
| | library's sources. Labels listed here must name ``go_tool_library`` targets. | |
| | Embedded libraries must have the same ``importpath`` as the embedding library. | |
| | See Embedding_ for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`data` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of files needed by this rule at runtime. Targets named in the data attribute will | |
| | appear in the *.runfiles area of this rule, if it has one. This may include data files needed | |
| | by the binary, or other programs needed by it. See `data dependencies`_ for more information | |
| | about how to depend on and use data files. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| |
| Example |
| ^^^^^^^ |
| |
| .. code:: bzl |
| |
| go_tool_library( |
| name = "importunsafe", |
| srcs = ["importunsafe.go"], |
| importpath = "importunsafe", |
| deps = ["@org_golang_x_tools//go/analysis:go_tool_library"], |
| visibility = ["//visibility:public"], |
| ) |
| |
| go_binary |
| ~~~~~~~~~ |
| |
| This builds an executable from a set of source files, which must all be |
| in the ``main`` package. You can run the binary with ``bazel run``, or you can |
| build it with ``bazel build`` and run it directly. |
| |
| Providers |
| ^^^^^^^^^ |
| |
| * GoLibrary_ |
| * GoSource_ |
| * GoArchive_ |
| |
| Attributes |
| ^^^^^^^^^^ |
| |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A unique name for this rule. | |
| | | |
| | This should be named the same as the desired name of the generated binary . | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`srcs` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of Go source files that are compiled to create the binary. | |
| | Only :value:`.go` files are permitted, unless the cgo attribute is set, in which case the | |
| | following file types are permitted: :value:`.go, .c, .s, .S .h`. | |
| | The files may contain Go-style `build constraints`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`deps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries this binary imports directly. | |
| | These may be go_library rules or compatible rules with the GoLibrary_ provider. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`embed` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries whose sources should be compiled together with this | |
| | binary's sources. Labels listed here must name ``go_library``, | |
| | ``go_proto_library``, or other compatible targets with the GoLibrary_ and | |
| | GoSource_ providers. Embedded libraries must all have the same ``importpath``, | |
| | which must match the ``importpath`` for this ``go_binary`` if one is | |
| | specified. At most one embedded library may have ``cgo = True``, and the | |
| | embedding binary may not also have ``cgo = True``. See Embedding_ for | |
| | more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`data` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of files needed by this rule at runtime. Targets named in the data attribute will | |
| | appear in the *.runfiles area of this rule, if it has one. This may include data files needed | |
| | by the binary, or other programs needed by it. See `data dependencies`_ for more information | |
| | about how to depend on and use data files. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`importpath` | :type:`string` | :value:`""` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The import path of this binary. Binaries can't actually be imported, but this | |
| | may be used by `go_path`_ and other tools to report the location of source | |
| | files. This may be inferred from embedded libraries. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`pure` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to link in pure_ mode. | |
| | It should be one of :value:`on`, :value:`off` or :value:`auto`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`static` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to link in static_ mode. | |
| | It should be one of :value:`on`, :value:`off` or :value:`auto`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`race` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to instrument | |
| | code for data race detection. It may be :value:`on`, :value:`off`, or | |
| | :value:`auto`. In most cases, it's better to enable race detection globally | |
| | with ``--@io_bazel_rules_go//go/config:race`` on the command line. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`msan` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to instrument | |
| | code for memory sanitization. It may be :value:`on`, :value:`off`, or | |
| | :value:`auto`. In most cases, it's better to enable memory sanitization | |
| | globally with ``--@io_bazel_rules_go//go/config:msan`` on the command line. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gotags` | :type:`string_list` : :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls which build tags are | |
| | enabled when evaluating build constraints. Useful for conditional compilation. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`goos` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls which goos_ to compile and link for. | |
| | | |
| | If set to anything other than :value:`auto` this overrides the default as set by the current | |
| | target platform and allows for single builds to make binaries for multiple architectures. | |
| | | |
| | Because this has no control over the cc toolchain, it does not work for cgo, so if this | |
| | attribute is set then :param:`pure` must be set to :value:`on`. | |
| | | |
| | This attribute has several limitations and should only be used in situations where the | |
| | ``--platforms`` flag does not work. See `Cross compilation`_ and `Note on goos and goarch | |
| | attributes`_ for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`goarch` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls which goarch_ to compile and link for. | |
| | | |
| | If set to anything other than :value:`auto` this overrides the default as set by the current | |
| | target platform and allows for single builds to make binaries for multiple architectures. | |
| | | |
| | Because this has no control over the cc toolchain, it does not work for cgo, so if this | |
| | attribute is set then :param:`pure` must be set to :value:`on`. | |
| | | |
| | This attribute has several limitations and should only be used in situations where the | |
| | ``--platforms`` flag does not work. See `Cross compilation`_ and `Note on goos and goarch | |
| | attributes`_ for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gc_goopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the Go compilation command when using the gc compiler. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gc_linkopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the Go link command when using the gc compiler. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`x_defs` | :type:`string_dict` | :value:`{}` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Map of defines to add to the go link command. | |
| | See `Defines and stamping`_ for examples of how to use these. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cgo` | :type:`boolean` | :value:`False` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | If :value:`True`, the binary uses cgo_. | |
| | The cgo tool permits Go code to call C code and vice-versa. | |
| | This does not support calling C++. | |
| | When cgo is set, :param:`srcs` may contain C, C++, Objective-C, Objective-C++, | |
| | and assembly files. These files will be compiled with the compiler from | |
| | the configured C/C++ toolchain. The compiled objects are included in | |
| | the package. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cdeps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of other libraries that the c code depends on. | |
| | This can be anything that would be allowed in `cc library deps`_ | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`copts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C compilation command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cxxopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C++ compilation command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cppopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C/C++ preprocessor command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`clinkopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C link command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`linkmode` | :type:`string` | :value:`"normal"` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Determines how the binary should be built and linked. This accepts some of | |
| | the same values as ``go build -buildmode`` and works the same way. | |
| | | |
| | :value:`normal` | |
| | Builds a normal executable with position-dependent code. | |
| | :value:`pie` | |
| | Builds a position-independent executable. | |
| | :value:`plugin` | |
| | Builds a shared library that can be loaded as a Go plugin. Only supported | |
| | on platforms that support plugins. | |
| | :value:`c-shared` | |
| | Builds a shared library that can be linked into a C program. | |
| | :value:`c-archive` | |
| | Builds an archive that can be linked into a C program. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`out` | :type:`string` | :value:`""` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Sets the output filename for the generated executable. When set, ``go_binary`` | |
| | will write this file without mode-specific directory prefixes, without | |
| | linkmode-specific prefixes like "lib", and without platform-specific suffixes | |
| | like ".exe". Note that without a mode-specific directory prefix, the | |
| | output file (but not its dependencies) will be invalidated in Bazel's cache | |
| | when changing configurations. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| |
| go_test |
| ~~~~~~~ |
| |
| This builds a set of tests that can be run with ``bazel test``. |
| |
| To run all tests in the workspace, and print output on failure (the |
| equivalent of ``go test ./...``), run |
| |
| :: |
| |
| bazel test --test_output=errors //... |
| |
| To run a Go benchmark test, run |
| |
| :: |
| |
| bazel run //path/to:test -- -test.bench=. |
| |
| You can run specific tests by passing the `--test_filter=pattern <test_filter_>`_ argument to Bazel. |
| You can pass arguments to tests by passing `--test_arg=arg <test_arg_>`_ arguments to Bazel. |
| |
| To write structured testlog information to Bazel's ``XML_OUTPUT_FILE``, tests ran with ``bazel test`` execute using a wrapper that invokes the testbinary with ``-test.v``. This functionality can be disabled by setting ``GO_TEST_WRAP=0`` in the test environment. |
| |
| Attributes |
| ^^^^^^^^^^ |
| |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A unique name for this rule. | |
| | | |
| | To interoperate cleanly with Gazelle_ right now this should be :value:`go_default_test` for | |
| | internal tests and :value:`go_default_xtest` for external tests. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`importpath` | :type:`string` | :value:`""` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The import path of this test. Tests can't actually be imported, but this | |
| | may be used by `go_path`_ and other tools to report the location of source | |
| | files. This may be inferred from embedded libraries. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`srcs` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of Go source files that are compiled to create the test. | |
| | Only :value:`.go` files are permitted, unless the cgo attribute is set, in which case the | |
| | following file types are permitted: :value:`.go, .c, .s, .S .h`. | |
| | The files may contain Go-style `build constraints`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`deps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries this test imports directly. | |
| | These may be go_library rules or compatible rules with the GoLibrary_ provider. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`embed` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries whose sources should be compiled together with this | |
| | test's sources. Labels listed here must name ``go_library``, | |
| | ``go_proto_library``, or other compatible targets with the GoLibrary_ and | |
| | GoSource_ providers. Embedded libraries must have the same ``importpath`` as | |
| | the embedding test, if one is specified. At most one embedded library may | |
| | have ``cgo = True``, and the embedding test may not also have ``cgo = True``. | |
| | See Embedding_ for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`data` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of files needed by this rule at runtime. Targets named in the data attribute will | |
| | appear in the *.runfiles area of this rule, if it has one. This may include data files needed | |
| | by the binary, or other programs needed by it. See `data dependencies`_ for more information | |
| | about how to depend on and use data files. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`importpath` | :type:`string` | :value:`""` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The import path of this test. Tests can't actually be imported, but this | |
| | may be used by `go_path`_ and other tools to report the location of source | |
| | files. This may be inferred from embedded libraries. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`pure` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to link in pure_ mode. | |
| | It should be one of :value:`on`, :value:`off` or :value:`auto`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`static` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to link in static_ mode. | |
| | It should be one of :value:`on`, :value:`off` or :value:`auto`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`race` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to instrument | |
| | code for data race detection. It may be :value:`on`, :value:`off`, or | |
| | :value:`auto`. In most cases, it's better to enable race detection globally | |
| | with ``--@io_bazel_rules_go//go/config:race`` on the command line. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`msan` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls whether to instrument | |
| | code for memory sanitization. It may be :value:`on`, :value:`off`, or | |
| | :value:`auto`. In most cases, it's better to enable memory sanitization | |
| | globally with ``--@io_bazel_rules_go//go/config:msan`` on the command line. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gotags` | :type:`string_list` : :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls which build tags are | |
| | enabled when evaluating build constraints. Useful for conditional compilation. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`goos` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls which goos_ to compile and link for. | |
| | | |
| | If set to anything other than :value:`auto` this overrides the default as set by the current | |
| | target platform and allows for single builds to make binaries for multiple architectures. | |
| | | |
| | Because this has no control over the cc toolchain, it does not work for cgo, so if this | |
| | attribute is set then :param:`pure` must be set to :value:`on`. | |
| | | |
| | This attribute has several limitations and should only be used in situations where the | |
| | ``--platforms`` flag does not work. See `Cross compilation`_ and `Note on goos and goarch | |
| | attributes`_ for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`goarch` | :type:`string` | :value:`auto` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | This is one of the `mode attributes`_ that controls which goarch_ to compile and link for. | |
| | | |
| | If set to anything other than :value:`auto` this overrides the default as set by the current | |
| | target platform and allows for single builds to make binaries for multiple architectures. | |
| | | |
| | Because this has no control over the cc toolchain, it does not work for cgo, so if this | |
| | attribute is set then :param:`pure` must be set to :value:`on`. | |
| | | |
| | This attribute has several limitations and should only be used in situations where the | |
| | ``--platforms`` flag does not work. See `Cross compilation`_ and `Note on goos and goarch | |
| | attributes`_ for more information. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gc_goopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the Go compilation command when using the gc compiler. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gc_linkopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the Go link command when using the gc compiler. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`x_defs` | :type:`string_dict` | :value:`{}` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Map of defines to add to the go link command. | |
| | See `Defines and stamping`_ for examples of how to use these. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cgo` | :type:`boolean` | :value:`False` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | If :value:`True`, the binary uses cgo_. | |
| | The cgo tool permits Go code to call C code and vice-versa. | |
| | This does not support calling C++. | |
| | When cgo is set, :param:`srcs` may contain C, C++, Objective-C, Objective-C++, | |
| | and assembly files. These files will be compiled with the compiler from | |
| | the configured C/C++ toolchain. The compiled objects are included in | |
| | the package. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cdeps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of other libraries that the c code depends on. | |
| | This can be anything that would be allowed in `cc library deps`_ | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`copts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C compilation command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cxxopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C++ compilation command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`cppopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C/C++ preprocessor command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`clinkopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the C link command. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| | Only valid if :param:`cgo` = :value:`True`. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`rundir` | :type:`string` | The package path | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A directory to cd to before the test is run. | |
| | This should be a path relative to the execution dir of the test. | |
| | | |
| | The default behaviour is to change to the workspace relative path, this replicates the normal | |
| | behaviour of ``go test`` so it is easy to write compatible tests. | |
| | | |
| | Setting it to :value:`.` makes the test behave the normal way for a bazel test. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`shard_count` | :type:`integer` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Non-negative integer less than or equal to 50, optional. | |
| | | |
| | Specifies the number of parallel shards to run the test. Test methods will be split across the | |
| | shards in a round-robin fashion. | |
| | | |
| | For more details on this attribute, consult the official Bazel documentation for shard_count_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| |
| To write an internal test, reference the library being tested with the :param:`embed` |
| instead of :param:`deps`. This will compile the test sources into the same package as the library |
| sources. |
| |
| Internal test example |
| ^^^^^^^^^^^^^^^^^^^^^ |
| |
| This builds a test that can use the internal interface of the package being tested. |
| |
| In the normal go toolchain this would be the kind of tests formed by adding writing |
| ``<file>_test.go`` files in the same package. |
| |
| It references the library being tested with :param:`embed`. |
| |
| |
| .. code:: bzl |
| |
| go_library( |
| name = "go_default_library", |
| srcs = ["lib.go"], |
| ) |
| |
| go_test( |
| name = "go_default_test", |
| srcs = ["lib_test.go"], |
| embed = [":go_default_library"], |
| ) |
| |
| External test example |
| ^^^^^^^^^^^^^^^^^^^^^ |
| |
| This builds a test that can only use the public interface(s) of the packages being tested. |
| |
| In the normal go toolchain this would be the kind of tests formed by adding an ``<name>_test`` |
| package. |
| |
| It references the library(s) being tested with :param:`deps`. |
| |
| .. code:: bzl |
| |
| go_library( |
| name = "go_default_library", |
| srcs = ["lib.go"], |
| ) |
| |
| go_test( |
| name = "go_default_xtest", |
| srcs = ["lib_x_test.go"], |
| deps = [":go_default_library"], |
| ) |
| |
| go_source |
| ~~~~~~~~~ |
| |
| This declares a set of source files and related dependencies that can be embedded into one of the |
| other rules. |
| This is used as a way of easily declaring a common set of sources re-used in multiple rules. |
| |
| Providers |
| ^^^^^^^^^ |
| |
| * GoLibrary_ |
| * GoSource_ |
| |
| Attributes |
| ^^^^^^^^^^ |
| |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A unique name for this rule. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`srcs` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of Go source files that are compiled to create the package. | |
| | The following file types are permitted: :value:`.go, .c, .s, .S .h`. | |
| | The files may contain Go-style `build constraints`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`deps` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of Go libraries this source list imports directly. | |
| | These may be go_library rules or compatible rules with the GoLibrary_ provider. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`embed` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of sources to directly embed in this list. | |
| | These may be go_library rules or compatible rules with the GoSource_ provider. | |
| | These can provide both :param:`srcs` and :param:`deps` to this library. | |
| | See Embedding_ for more information about how and when to use this. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`data` | :type:`label_list` | :value:`None` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | The list of files needed by this rule at runtime. Targets named in the data attribute will | |
| | appear in the *.runfiles area of this rule, if it has one. This may include data files needed | |
| | by the binary, or other programs needed by it. See `data dependencies`_ for more information | |
| | about how to depend on and use data files. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`gc_goopts` | :type:`string_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | List of flags to add to the Go compilation command when using the gc compiler. | |
| | Subject to `"Make variable"`_ substitution and `Bourne shell tokenization`_. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| |
| go_path |
| ~~~~~~~ |
| |
| ``go_path`` builds a directory structure that can be used with tools that |
| understand the ``GOPATH`` directory layout. This directory structure can be |
| built by zipping, copying, or linking files. |
| |
| ``go_path`` can depend on one or more Go targets (i.e., `go_library`_, |
| `go_binary`_, or `go_test`_). It will include packages from those targets, as |
| well as their transitive dependencies. Packages will be in subdirectories named |
| after their ``importpath`` or ``importmap`` attributes under a ``src/`` |
| directory. |
| |
| Attributes |
| ^^^^^^^^^^ |
| |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | **Name** | **Type** | **Default value** | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`name` | :type:`string` | |mandatory| | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A unique name for this rule. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`deps` | :type:`label_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A list of targets that build Go packages. A directory will be generated from | |
| | files in these targets and their transitive dependencies. All targets must | |
| | provide GoArchive_ (`go_library`_, `go_binary`_, `go_test`_, and similar | |
| | rules have this). | |
| | | |
| | Only targets with explicit ``importpath`` attributes will be included in the | |
| | generated directory. Synthetic packages (like the main package produced by | |
| | `go_test`_) and packages with inferred import paths will not be | |
| | included. The values of ``importmap`` attributes may influence the placement | |
| | of packages within the generated directory (for example, in vendor | |
| | directories). | |
| | | |
| | The generated directory will contain original source files, including .go, | |
| | .s, .h, and .c files compiled by cgo. It will not contain files generated by | |
| | tools like cover and cgo, but it will contain generated files passed in | |
| | ``srcs`` attributes like .pb.go files. The generated directory will also | |
| | contain runfiles found in ``data`` attributes. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`data` | :type:`label_list` | :value:`[]` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | A list of targets producing data files that will be stored next to the | |
| | ``src/`` directory. Useful for including things like licenses and readmes. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`mode` | :type:`string` | :value:`"copy"` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | Determines how the generated directory is provided. May be one of: | |
| | | |
| | * ``"archive"``: The generated directory is packaged as a single .zip file. | |
| | * ``"copy"``: The generated directory is a single tree artifact. Source files | |
| | are copied into the tree. | |
| | * ``"link"``: Source files are symlinked into the tree. All of the symlink | |
| | files are provided as separate output files. | |
| | | |
| | **NOTE:** In ``"copy"`` mode, when a ``GoPath`` is consumed as a set of input | |
| | files or run files, Bazel may provide symbolic links instead of regular files. | |
| | Any program that consumes these files should dereference links, e.g., if you | |
| | run ``tar``, use the ``--dereference`` flag. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | :param:`include_data` | :type:`bool` | :value:`True` | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| | When true, data files referenced by libraries, binaries, and tests will be | |
| | included in the output directory. Files listed in the :param:`data` attribute | |
| | for this rule will be included regardless of this attribute. | |
| +----------------------------+-----------------------------+---------------------------------------+ |
| |
| Cross compilation |
| ----------------- |
| |
| rules_go can cross-compile Go projects to any platform the Go toolchain |
| supports. The simplest way to do this is by setting the ``--platforms`` flag on |
| the command line. |
| |
| .. code:: |
| |
| $ bazel build --platforms=@io_bazel_rules_go//go/toolchain:linux_amd64 //my/project |
| |
| You can replace ``linux_amd64`` in the example above with any valid |
| GOOS / GOARCH pair. To list all platforms, run this command: |
| |
| .. code:: |
| |
| $ bazel query 'kind(platform, @io_bazel_rules_go//go/toolchain:all)' |
| |
| By default, cross-compilation will cause Go targets to be built in "pure mode", |
| which disables cgo; cgo files will not be compiled, and C/C++ dependencies will |
| not be compiled or linked. |
| |
| Cross-compiling cgo code is possible, but not fully supported. You will need to |
| `write a CROSSTOOL file`_ that describes your C/C++ toolchain. You'll need to |
| ensure it works by building ``cc_binary`` and ``cc_library`` targets with the |
| ``--cpu`` command line flag set. Then, to build a mixed Go / C / C++ project, |
| add ``pure = "off"`` to your ``go_binary`` target and run Bazel with ``--cpu`` |
| and ``--platforms``. |
| |
| Platform-specific dependencies |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| When cross-compiling, you may have some platform-specific sources and |
| dependencies. Source files from all platforms can be mixed freely in a single |
| ``srcs`` list. Source files are filtered using `build constraints`_ (filename |
| suffixes and ``+build`` tags) before being passed to the compiler. |
| |
| Platform-specific dependencies are another story. For example, if you are |
| building a binary for Linux, and it has dependency that should only be built |
| when targeting Windows, you will need to filter it out using Bazel `select`_ |
| expressions: |
| |
| .. code:: bzl |
| |
| go_binary( |
| name = "cmd", |
| srcs = [ |
| "foo_linux.go", |
| "foo_windows.go", |
| ], |
| deps = [ |
| # platform agnostic dependencies |
| "//bar:go_default_library", |
| ] + select({ |
| # OS-specific dependencies |
| "@io_bazel_rules_go//go/platform:linux": [ |
| "//baz_linux:go_default_library", |
| ], |
| "@io_bazel_rules_go//go/platform:windows": [ |
| "//quux_windows:go_default_library", |
| ], |
| "//conditions:default": [], |
| }), |
| ) |
| |
| ``select`` accepts a dictionary argument. The keys are labels that reference |
| `config_setting`_ rules. The values are lists of labels. Exactly one of these |
| lists will be selected, depending on the target configuration. rules_go has |
| pre-declared ``config_setting`` rules for each OS, architecture, and |
| OS-architecture pair. For a full list, run this command: |
| |
| .. code:: |
| |
| $ bazel query 'kind(config_setting, @io_bazel_rules_go//go/platform:all)' |
| |
| `Gazelle`_ will generate dependencies in this format automatically. |