diff options
Diffstat (limited to 'go/toolchains.rst')
-rw-r--r-- | go/toolchains.rst | 847 |
1 files changed, 847 insertions, 0 deletions
diff --git a/go/toolchains.rst b/go/toolchains.rst new file mode 100644 index 00000000..57182aab --- /dev/null +++ b/go/toolchains.rst @@ -0,0 +1,847 @@ +Go toolchains +============= + +.. _Args: https://docs.bazel.build/versions/master/skylark/lib/Args.html +.. _Bazel toolchains: https://docs.bazel.build/versions/master/toolchains.html +.. _Go website: https://golang.org/ +.. _GoArchive: providers.rst#goarchive +.. _GoLibrary: providers.rst#golibrary +.. _GoSDK: providers.rst#gosdk +.. _GoSource: providers.rst#gosource +.. _binary distribution: https://golang.org/dl/ +.. _compilation modes: modes.rst#compilation-modes +.. _control the version: `Forcing the Go version`_ +.. _core: core.bzl +.. _forked version of Go: `Registering a custom SDK`_ +.. _go assembly: https://golang.org/doc/asm +.. _go sdk rules: `The SDK`_ +.. _go/platform/list.bzl: platform/list.bzl +.. _installed SDK: `Using the installed Go sdk`_ +.. _nogo: nogo.rst#nogo +.. _register: Registration_ +.. _register_toolchains: https://docs.bazel.build/versions/master/skylark/lib/globals.html#register_toolchains +.. _toolchain resolution: https://bazel.build/extending/toolchains#toolchain-resolution + +.. role:: param(kbd) +.. role:: type(emphasis) +.. role:: value(code) +.. |mandatory| replace:: **mandatory value** + +The Go toolchain is at the heart of the Go rules, and is the mechanism used to +customize the behavior of the core_ Go rules. + +.. contents:: :depth: 2 + +----- + +Overview +-------- + +The Go toolchain consists of three main layers: `the SDK`_, `the toolchain`_, +and `the context`_. + +The SDK +~~~~~~~ + +The Go SDK (more commonly known as the Go distribution) is a directory tree +containing sources for the Go toolchain and standard library and pre-compiled +binaries for the same. You can download this from by visiting the `Go website`_ +and downloading a `binary distribution`_. + +There are several Bazel rules for obtaining and configuring a Go SDK: + +* `go_download_sdk`_: downloads a toolchain for a specific version of Go for a + specific operating system and architecture. +* `go_host_sdk`_: uses the toolchain installed on the system where Bazel is + run. The toolchain's location is specified with the ``GOROOT`` or by running + ``go env GOROOT``. +* `go_local_sdk`_: like `go_host_sdk`_, but uses the toolchain in a specific + directory on the host system. +* `go_wrap_sdk`_: configures a toolchain downloaded with another Bazel + repository rule. + +By default, if none of the above rules are used, the `go_register_toolchains`_ +function creates a repository named ``@go_sdk`` using `go_download_sdk`_, using +a recent version of Go for the host operating system and architecture. + +SDKs are specific to a host platform (e.g., ``linux_amd64``) and a version of +Go. They may target all platforms that Go supports. The Go SDK is naturally +cross compiling. + +By default, all ``go_binary``, ``go_test``, etc. rules will use the first declared +Go SDK. If you would like to build a target using a specific Go SDK version, first +ensure that you have declared a Go SDK of that version using one of the above rules +(`go_download_sdk`_, `go_host_sdk`_, `go_local_sdk`_, `go_wrap_sdk`_). Then you +can specify the sdk version to build with when running a ``bazel build`` by passing +the flag ``--@io_bazel_rules_go//go/toolchain:sdk_version="version"`` where +``"version"`` is the SDK version you would like to build with, eg. ``"1.18.3"``. +The SDK version can omit the patch, or include a prerelease part, eg. ``"1"``, +``"1.18"``, ``"1.18.0"``, and ``"1.19.0beta1"`` are all valid values for ``sdk_version``. +When ``go_host_sdk`` is used, ``"version"`` can be set to ``host`` to refer to the host Go SDK. +It can also be set ``remote`` to match any non-host version. + +The toolchain +~~~~~~~~~~~~~ + +The workspace rules above declare `Bazel toolchains`_ with `go_toolchain`_ +implementations for each target platform that Go supports. Wrappers around +the rules register these toolchains automatically. Bazel will select a +registered toolchain automatically based on the execution and target platforms, +specified with ``--host_platform`` and ``--platforms``, respectively. + +The workspace rules define the toolchains in a separate repository from the +SDK. For example, if the SDK repository is `@go_sdk`, the toolchains will be +defined in `@go_sdk_toolchains`. The `@go_sdk_toolchains` repository must be +eagerly fetched in order to register the toolchain, but fetching the `@go_sdk` +repository may be delayed until the toolchain is needed to build something. To +activate lazily fetching the SDK, you must provide a `version` attribute to the +workspace rule that defines the SDK (`go_download_sdk`, `go_host_sdk`, `go_local_sdk`, +`go_wrap_sdk`, or `go_register_toolchains`). The value must match the actual +version of the SDK; rules_go will validate this when the toolchain is used. + +The toolchain itself should be considered opaque. You should only access +its contents through `the context`_. + +The context +~~~~~~~~~~~ + +The context is the type you need if you are writing custom rules that need +to be compatible with rules_go. It provides information about the SDK, the +toolchain, and the standard library. It also provides a convenient way to +declare mode-specific files, and to create actions for compiling, linking, +and more. + +Customizing +----------- + +Normal usage +~~~~~~~~~~~~ + +This is an example of normal usage for the other examples to be compared +against. This will download and use a specific version of Go for the host +platform. + +.. code:: bzl + + # WORKSPACE + + load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains") + + go_rules_dependencies() + + go_register_toolchains(version = "1.15.5") + + +Using the installed Go SDK +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can use the Go SDK that's installed on the system where Bazel is running. +This may result in faster builds, since there's no need to download an SDK, +but builds won't be reproducible across systems with different SDKs installed. + +.. code:: bzl + + # WORKSPACE + + load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains") + + go_rules_dependencies() + + go_register_toolchains(version = "host") + + +Registering a custom SDK +~~~~~~~~~~~~~~~~~~~~~~~~ + +If you download the SDK through another repository rule, you can configure +it with ``go_wrap_sdk``. It must still be named ``go_sdk``, but this is a +temporary limitation that will be removed in the future. + +.. code:: bzl + + # WORKSPACE + + load("@io_bazel_rules_go//go:deps.bzl", "go_rules_dependencies", "go_register_toolchains", "go_wrap_sdk") + + unknown_download_sdk( + name = "go", + ..., + ) + + go_wrap_sdk( + name = "go_sdk", + root_file = "@go//:README.md", + ) + + go_rules_dependencies() + + go_register_toolchains() + + +Writing new Go rules +~~~~~~~~~~~~~~~~~~~~ + +If you are writing a new Bazel rule that uses the Go toolchain, you need to +do several things to ensure you have full access to the toolchain and common +dependencies. + +* Declare a dependency on a toolchain of type + ``@io_bazel_rules_go//go:toolchain``. Bazel will select an appropriate, + registered toolchain automatically. +* Declare an implicit attribute named ``_go_context_data`` that defaults to + ``@io_bazel_rules_go//:go_context_data``. This target gathers configuration + information and several common dependencies. +* Use the ``go_context`` function to gain access to `the context`_. This is + your main interface to the Go toolchain. + +.. code:: bzl + + load("@io_bazel_rules_go//go:def.bzl", "go_context") + + def _my_rule_impl(ctx): + go = go_context(ctx) + ... + + my_rule = rule( + implementation = _my_rule_impl, + attrs = { + ... + "_go_context_data": attr.label( + default = "@io_bazel_rules_go//:go_context_data", + ), + }, + toolchains = ["@io_bazel_rules_go//go:toolchain"], + ) + + +Rules and functions +------------------- + +go_register_toolchains +~~~~~~~~~~~~~~~~~~~~~~ + +Installs the Go toolchains. If :param:`version` is specified, it sets the +SDK version to use (for example, :value:`"1.15.5"`). + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`version` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| Specifies the version of Go to download if one has not been declared. | +| | +| If a toolchain was already declared with `go_download_sdk`_ or a similar rule, | +| this parameter may not be set. | +| | +| Normally this is set to a Go version like :value:`"1.15.5"`. It may also be | +| set to :value:`"host"`, which will cause rules_go to use the Go toolchain | +| installed on the host system (found using ``GOROOT`` or ``PATH``). | +| | +| If ``version`` is specified and is not set to :value:`"host"`, the SDK will be fetched only when | +| the build uses a Go toolchain and `toolchain resolution`_ results in this SDK being chosen. | +| Otherwise it will be fetched unconditionally. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`nogo` | :type:`label` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The ``nogo`` attribute refers to a nogo_ rule that builds a binary | +| used for static analysis. The ``nogo`` binary will be used alongside the | +| Go compiler when building packages. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`experiments` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Go experiments to enable via `GOEXPERIMENT`. | ++--------------------------------+-----------------------------+-----------------------------------+ + +go_download_sdk +~~~~~~~~~~~~~~~ + +This downloads a Go SDK for use in toolchains. + ++--------------------------------+-----------------------------+---------------------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`name` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+---------------------------------------------+ +| A unique name for this SDK. This should almost always be :value:`go_sdk` if | +| you want the SDK to be used by toolchains. | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`goos` | :type:`string` | :value:`None` | ++--------------------------------+-----------------------------+---------------------------------------------+ +| The operating system the binaries in the SDK are intended to run on. | +| By default, this is detected automatically, but if you're building on | +| an unusual platform, or if you're using remote execution and the execution | +| platform is different than the host, you may need to specify this explictly. | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`goarch` | :type:`string` | :value:`None` | ++--------------------------------+-----------------------------+---------------------------------------------+ +| The architecture the binaries in the SDK are intended to run on. | +| By default, this is detected automatically, but if you're building on | +| an unusual platform, or if you're using remote execution and the execution | +| platform is different than the host, you may need to specify this explictly. | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`version` | :type:`string` | :value:`latest Go version` | ++--------------------------------+-----------------------------+---------------------------------------------+ +| The version of Go to download, for example ``1.12.5``. If unspecified, | +| ``go_download_sdk`` will list available versions of Go from golang.org, then | +| pick the highest version. If ``version`` is specified but ``sdks`` is | +| unspecified, ``go_download_sdk`` will list available versions on golang.org | +| to determine the correct file name and SHA-256 sum. | +| If ``version`` is specified, the SDK will be fetched only when the build uses a Go toolchain and | +| `toolchain resolution`_ results in this SDK being chosen. Otherwise it will be fetched unconditionally. | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`urls` | :type:`string_list` | :value:`[https://dl.google.com/go/{}]` | ++--------------------------------+-----------------------------+---------------------------------------------+ +| A list of mirror urls to the binary distribution of a Go SDK. These must contain the `{}` | +| used to substitute the sdk filename being fetched (using `.format`. | +| It defaults to the official repository :value:`"https://dl.google.com/go/{}"`. | +| | +| This attribute is seldom used. It is only needed for downloading Go from | +| an alternative location (for example, an internal mirror). | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`strip_prefix` | :type:`string` | :value:`"go"` | ++--------------------------------+-----------------------------+---------------------------------------------+ +| A directory prefix to strip from the extracted files. | +| Used with ``urls``. | ++--------------------------------+-----------------------------+---------------------------------------------+ +| :param:`sdks` | :type:`string_list_dict` | :value:`see description` | ++--------------------------------+-----------------------------+---------------------------------------------+ +| This consists of a set of mappings from the host platform tuple to a list of filename and | +| sha256 for that file. The filename is combined the :param:`urls` to produce the final download | +| urls to use. | +| | +| This option is seldom used. It is only needed for downloading a modified | +| Go distribution (with a different SHA-256 sum) or a version of Go | +| not supported by rules_go (for example, a beta or release candidate). | ++--------------------------------+-----------------------------+---------------------------------------------+ + +**Example**: + +.. code:: bzl + + load( + "@io_bazel_rules_go//go:deps.bzl", + "go_download_sdk", + "go_register_toolchains", + "go_rules_dependencies", + ) + + go_download_sdk( + name = "go_sdk", + goos = "linux", + goarch = "amd64", + version = "1.18.1", + sdks = { + # NOTE: In most cases the whole sdks attribute is not needed. + # There are 2 "common" reasons you might want it: + # + # 1. You need to use an modified GO SDK, or an unsupported version + # (for example, a beta or release candidate) + # + # 2. You want to avoid the dependency on the index file for the + # SHA-256 checksums. In this case, You can get the expected + # filenames and checksums from https://go.dev/dl/ + "linux_amd64": ("go1.18.1.linux-amd64.tar.gz", "b3b815f47ababac13810fc6021eb73d65478e0b2db4b09d348eefad9581a2334"), + "darwin_amd64": ("go1.18.1.darwin-amd64.tar.gz", "3703e9a0db1000f18c0c7b524f3d378aac71219b4715a6a4c5683eb639f41a4d"), + }, + ) + + go_rules_dependencies() + + go_register_toolchains() + +go_host_sdk +~~~~~~~~~~~ + +This detects and configures the host Go SDK for use in toolchains. + +If the ``GOROOT`` environment variable is set, the SDK in that directory is +used. Otherwise, ``go env GOROOT`` is used. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`name` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| A unique name for this SDK. This should almost always be :value:`go_sdk` if you want the SDK | +| to be used by toolchains. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`version` | :type:`string` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The version of Go installed on the host. If specified, `go_host_sdk` will create its repository | +| only when the build uses a Go toolchain and `toolchain resolution`_ results in this SDK being | +| chosen. Otherwise it will be created unconditionally. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`experiments` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Go experiments to enable via `GOEXPERIMENT`. | ++--------------------------------+-----------------------------+-----------------------------------+ + +go_local_sdk +~~~~~~~~~~~~ + +This prepares a local path to use as the Go SDK in toolchains. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`name` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| A unique name for this SDK. This should almost always be :value:`go_sdk` if you want the SDK | +| to be used by toolchains. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`path` | :type:`string` | :value:`""` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The local path to a pre-installed Go SDK. The path must contain the go binary, the tools it | +| invokes and the standard library sources. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`version` | :type:`string` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The version of the Go SDK. If specified, `go_local_sdk` will create its repository only when the | +| build uses a Go toolchain and `toolchain resolution`_ results in this SDK being chosen. | +| Otherwise it will be created unconditionally. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`experiments` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Go experiments to enable via `GOEXPERIMENT`. | ++--------------------------------+-----------------------------+-----------------------------------+ + + +go_wrap_sdk +~~~~~~~~~~~ + +This configures an SDK that was downloaded or located with another repository +rule. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`name` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| A unique name for this SDK. This should almost always be :value:`go_sdk` if you want the SDK | +| to be used by toolchains. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`root_file` | :type:`label` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| A Bazel label referencing a file in the root directory of the SDK. Used to | +| determine the GOROOT for the SDK. This attribute and `root_files` cannot be both provided. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`root_files` | :type:`string_dict` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| A set of mappings from the host platform to a Bazel label referencing a file in the SDK's root | +| directory. This attribute and `root_file` cannot be both provided. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`version` | :type:`string` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The version of the Go SDK. If specified, `go_wrap_sdk` will create its repository only when the | +| build uses a Go toolchain and `toolchain resolution`_ results in this SDK being chosen. | +| Otherwise it will be created unconditionally. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`experiments` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Go experiments to enable via `GOEXPERIMENT`. | ++--------------------------------+-----------------------------+-----------------------------------+ + + +**Example:** + +.. code:: bzl + + load( + "@io_bazel_rules_go//go:deps.bzl", + "go_register_toolchains", + "go_rules_dependencies", + "go_wrap_sdk", + ) + + go_wrap_sdk( + name = "go_sdk", + root_file = "@other_repo//go:README.md", + ) + + go_rules_dependencies() + + go_register_toolchains() + +go_toolchain +~~~~~~~~~~~~ + +This declares a toolchain that may be used with toolchain type +:value:`"@io_bazel_rules_go//go:toolchain"`. + +Normally, ``go_toolchain`` rules are declared and registered in repositories +configured with `go_download_sdk`_, `go_host_sdk`_, `go_local_sdk`_, or +`go_wrap_sdk`_. You usually won't need to declare these explicitly. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`name` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| A unique name for the toolchain. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`goos` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The target operating system. Must be a standard ``GOOS`` value. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`goarch` | :type:`string` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The target architecture. Must be a standard ``GOARCH`` value. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`sdk` | :type:`label` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The SDK this toolchain is based on. The target must provide `GoSDK`_. This is | +| usually a `go_sdk`_ rule. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`link_flags` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Flags passed to the Go external linker. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`cgo_link_flags` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Flags passed to the external linker (if it is used). | ++--------------------------------+-----------------------------+-----------------------------------+ + +go_context +~~~~~~~~~~ + +This collects the information needed to form and return a :type:`GoContext` from +a rule ctx. It uses the attributes and the toolchains. + +.. code:: bzl + + def _my_rule_impl(ctx): + go = go_context(ctx) + ... + + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`ctx` | :type:`ctx` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The Bazel ctx object for the current rule. | ++--------------------------------+-----------------------------+-----------------------------------+ + +The context object +~~~~~~~~~~~~~~~~~~ + +``GoContext`` is never returned by a rule, instead you build one using +``go_context(ctx)`` in the top of any custom starlark rule that wants to interact +with the go rules. It provides all the information needed to create go actions, +and create or interact with the other go providers. + +When you get a ``GoContext`` from a context it exposes a number of fields +and methods. + +All methods take the ``GoContext`` as the only positional argument. All other +arguments must be passed as keyword arguments. This allows us to re-order and +deprecate individual parameters over time. + +Fields +^^^^^^ + ++--------------------------------+-----------------------------------------------------------------+ +| **Name** | **Type** | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`toolchain` | :type:`ToolchainInfo` | ++--------------------------------+-----------------------------------------------------------------+ +| The underlying toolchain. This should be considered an opaque type subject to change. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`sdk` | :type:`GoSDK` | ++--------------------------------+-----------------------------------------------------------------+ +| The SDK in use. This may be used to access sources, packages, and tools. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`mode` | :type:`Mode` | ++--------------------------------+-----------------------------------------------------------------+ +| Controls the compilation setup affecting things like enabling profilers and sanitizers. | +| See `compilation modes`_ for more information about the allowed values. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`root` | :type:`string` | ++--------------------------------+-----------------------------------------------------------------+ +| Path of the effective GOROOT. If :param:`stdlib` is set, this is the same | +| as ``go.stdlib.root_file.dirname``. Otherwise, this is the same as | +| ``go.sdk.root_file.dirname``. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`go` | :type:`File` | ++--------------------------------+-----------------------------------------------------------------+ +| The main "go" binary used to run go sdk tools. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`stdlib` | :type:`GoStdLib` | ++--------------------------------+-----------------------------------------------------------------+ +| The standard library and tools to use in this build mode. This may be the | +| pre-compiled standard library that comes with the SDK, or it may be compiled | +| in a different directory for this mode. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`actions` | :type:`ctx.actions` | ++--------------------------------+-----------------------------------------------------------------+ +| The actions structure from the Bazel context, which has all the methods for building new | +| bazel actions. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`exe_extension` | :type:`string` | ++--------------------------------+-----------------------------------------------------------------+ +| The suffix to use for all executables in this build mode. Mostly used when generating the output | +| filenames of binary rules. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`shared_extension` | :type:`string` | ++--------------------------------+-----------------------------------------------------------------+ +| The suffix to use for shared libraries in this build mode. Mostly used when | +| generating output filenames of binary rules. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`crosstool` | :type:`list of File` | ++--------------------------------+-----------------------------------------------------------------+ +| The files you need to add to the inputs of an action in order to use the cc toolchain. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`package_list` | :type:`File` | ++--------------------------------+-----------------------------------------------------------------+ +| A file that contains the package list of the standard library. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`env` | :type:`dict of string to string` | ++--------------------------------+-----------------------------------------------------------------+ +| Environment variables to pass to actions. Includes ``GOARCH``, ``GOOS``, | +| ``GOROOT``, ``GOROOT_FINAL``, ``CGO_ENABLED``, and ``PATH``. | ++--------------------------------+-----------------------------------------------------------------+ +| :param:`tags` | :type:`list of string` | ++--------------------------------+-----------------------------------------------------------------+ +| List of build tags used to filter source files. | ++--------------------------------+-----------------------------------------------------------------+ + +Methods +^^^^^^^ + +* Action generators + + * archive_ + * binary_ + * link_ + +* Helpers + + * args_ + * `declare_file`_ + * `library_to_source`_ + * `new_library`_ + + +archive ++++++++ + +This emits actions to compile Go code into an archive. It supports embedding, +cgo dependencies, coverage, and assembling and packing .s files. + +It returns a GoArchive_. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`source` | :type:`GoSource` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The GoSource_ that should be compiled into an archive. | ++--------------------------------+-----------------------------+-----------------------------------+ + + +binary +++++++ + +This emits actions to compile and link Go code into a binary. It supports +embedding, cgo dependencies, coverage, and assembling and packing .s files. + +It returns a tuple containing GoArchive_, the output executable file, and +a ``runfiles`` object. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`name` | :type:`string` | :value:`""` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The base name of the generated binaries. Required if :param:`executable` is not given. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`source` | :type:`GoSource` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The GoSource_ that should be compiled and linked. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`test_archives` | :type:`list GoArchiveData` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| List of archives for libraries under test. See link_. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`gc_linkopts` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Go link options. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`version_file` | :type:`File` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Version file used for link stamping. See link_. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`info_file` | :type:`File` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Info file used for link stamping. See link_. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`executable` | :type:`File` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Optional output file to write. If not set, ``binary`` will generate an output | +| file name based on ``name``, the target platform, and the link mode. | ++--------------------------------+-----------------------------+-----------------------------------+ + + +link +++++ + +The link function adds an action that runs ``go tool link`` on a library. + +It does not return anything. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`archive` | :type:`GoArchive` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The library to link. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`test_archives` | :type:`GoArchiveData list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| List of archives for libraries under test. These are excluded from linking | +| if transitive dependencies of :param:`archive` have the same package paths. | +| This is useful for linking external test archives that depend internal test | +| archives. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`executable` | :type:`File` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The binary to produce. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`gc_linkopts` | :type:`string_list` | :value:`[]` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Basic link options, these may be adjusted by the :param:`mode`. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`version_file` | :type:`File` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Version file used for link stamping. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`info_file` | :type:`File` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| Info file used for link stamping. | ++--------------------------------+-----------------------------+-----------------------------------+ + + +args +++++ + +This creates a new Args_ object, using the ``ctx.actions.args`` method. The +object is pre-populated with standard arguments used by all the go toolchain +builders. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ + +declare_file +++++++++++++ + +This is the equivalent of ``ctx.actions.declare_file``. It uses the +current build mode to make the filename unique between configurations. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`path` | :type:`string` | :value:`""` | ++--------------------------------+-----------------------------+-----------------------------------+ +| A path for this file, including the basename of the file. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`ext` | :type:`string` | :value:`""` | ++--------------------------------+-----------------------------+-----------------------------------+ +| The extension to use for the file. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`name` | :type:`string` | :value:`""` | ++--------------------------------+-----------------------------+-----------------------------------+ +| A name to use for this file. If path is not present, this becomes a prefix to the path. | +| If this is not set, the current rule name is used in it's place. | ++--------------------------------+-----------------------------+-----------------------------------+ + +library_to_source ++++++++++++++++++ + +This is used to build a GoSource object for a given GoLibrary in the current +build mode. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`attr` | :type:`ctx.attr` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The attributes of the target being analyzed. For most rules, this should be | +| ``ctx.attr``. Rules can also pass in a ``struct`` with the same fields. | +| | +| ``library_to_source`` looks for fields corresponding to the attributes of | +| ``go_library`` and ``go_binary``. This includes ``srcs``, ``deps``, ``embed``, | +| and so on. All fields are optional (and may not be defined in the struct | +| argument at all), but if they are present, they must have the same types and | +| allowed values as in ``go_library`` and ``go_binary``. For example, ``srcs`` | +| must be a list of ``Targets``; ``gc_goopts`` must be a list of strings. | +| | +| As an exception, ``deps``, if present, must be a list containing either | +| ``Targets`` or ``GoArchives``. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`library` | :type:`GoLibrary` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| The GoLibrary_ that you want to build a GoSource_ object for in the current build mode. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`coverage_instrumented` | :type:`bool` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This controls whether cover is enabled for this specific library in this mode. | +| This should generally be the value of ctx.coverage_instrumented() | ++--------------------------------+-----------------------------+-----------------------------------+ + +new_library ++++++++++++ + +This creates a new GoLibrary. You can add extra fields to the go library by +providing extra named parameters to this function, they will be visible to the +resolver when it is invoked. + ++--------------------------------+-----------------------------+-----------------------------------+ +| **Name** | **Type** | **Default value** | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`go` | :type:`GoContext` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This must be the same GoContext object you got this function from. | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`resolver` | :type:`function` | :value:`None` | ++--------------------------------+-----------------------------+-----------------------------------+ +| This is the function that gets invoked when converting from a GoLibrary to a GoSource. | +| The function's signature must be | +| | +| .. code:: bzl | +| | +| def _stdlib_library_to_source(go, attr, source, merge) | +| | +| attr is the attributes of the rule being processed | +| source is the dictionary of GoSource fields being generated | +| merge is a helper you can call to merge | ++--------------------------------+-----------------------------+-----------------------------------+ +| :param:`importable` | :type:`bool` | |mandatory| | ++--------------------------------+-----------------------------+-----------------------------------+ +| This controls whether the GoLibrary_ is supposed to be importable. This is generally only false | +| for the "main" libraries that are built just before linking. | ++--------------------------------+-----------------------------+-----------------------------------+ |