| // -*- mode:doc; -*- |
| // vim: set syntax=asciidoc: |
| |
| === Infrastructure for Go packages |
| |
| This infrastructure applies to Go packages that use the standard |
| build system and use bundled dependencies. |
| |
| [[golang-package-tutorial]] |
| |
| ==== +golang-package+ tutorial |
| |
| First, let's see how to write a +.mk+ file for a go package, |
| with an example : |
| |
| ---- |
| 01: ################################################################################ |
| 02: # |
| 03: # foo |
| 04: # |
| 05: ################################################################################ |
| 06: |
| 07: FOO_VERSION = 1.0 |
| 08: FOO_SITE = $(call github,bar,foo,$(FOO_VERSION)) |
| 09: FOO_LICENSE = BSD-3-Clause |
| 10: FOO_LICENSE_FILES = LICENSE |
| 11: |
| 12: $(eval $(golang-package)) |
| ---- |
| |
| On line 7, we declare the version of the package. |
| |
| On line 8, we declare the upstream location of the package, here |
| fetched from Github, since a large number of Go packages are hosted on |
| Github. |
| |
| On line 9 and 10, we give licensing details about the package. |
| |
| Finally, on line 12, we invoke the +golang-package+ macro that |
| generates all the Makefile rules that actually allow the package to be |
| built. |
| |
| [[golang-package-reference]] |
| |
| ==== +golang-package+ reference |
| |
| In their +Config.in+ file, packages using the +golang-package+ |
| infrastructure should depend on +BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS+ |
| because Buildroot will automatically add a dependency on +host-go+ |
| to such packages. |
| If you need CGO support in your package, you must add a dependency on |
| +BR2_PACKAGE_HOST_GO_TARGET_CGO_LINKING_SUPPORTS+. |
| |
| The main macro of the Go package infrastructure is |
| +golang-package+. It is similar to the +generic-package+ macro. The |
| ability to build host packages is also available, with the |
| +host-golang-package+ macro. |
| Host packages built by +host-golang-package+ macro should depend on |
| +BR2_PACKAGE_HOST_GO_HOST_ARCH_SUPPORTS+. |
| |
| Just like the generic infrastructure, the Go infrastructure works |
| by defining a number of variables before calling the +golang-package+ |
| macro. |
| |
| All the package metadata information variables that exist in the |
| xref:generic-package-reference[generic package infrastructure] also |
| exist in the Go infrastructure. |
| |
| Note that it is not necessary to add +host-go+ in the |
| +FOO_DEPENDENCIES+ variable of a package, since this basic dependency |
| is automatically added as needed by the Go package infrastructure. |
| |
| A few additional variables, specific to the Go infrastructure, can |
| optionally be defined, depending on the package's needs. Many of them |
| are only useful in very specific cases, typical packages will |
| therefore only use a few of them, or none. |
| |
| * The package must specify its Go module name in the +FOO_GOMOD+ |
| variable. If not specified, it defaults to |
| +URL-domain/1st-part-of-URL/2nd-part-of-URL+, e.g +FOO_GOMOD+ will |
| take the value +github.com/bar/foo+ for a package that specifies |
| +FOO_SITE = $(call github,bar,foo,$(FOO_VERSION))+. The Go package |
| infrastructure will automatically generate a minimal +go.mod+ file |
| in the package source tree if it doesn't exist. |
| |
| * +FOO_LDFLAGS+ and +FOO_TAGS+ can be used to pass respectively the |
| +LDFLAGS+ or the +TAGS+ to the +go+ build command. |
| |
| * +FOO_BUILD_TARGETS+ can be used to pass the list of targets that |
| should be built. If +FOO_BUILD_TARGETS+ is not specified, it |
| defaults to +.+. We then have two cases: |
| |
| ** +FOO_BUILD_TARGETS+ is +.+. In this case, we assume only one binary |
| will be produced, and that by default we name it after the package |
| name. If that is not appropriate, the name of the produced binary |
| can be overridden using +FOO_BIN_NAME+. |
| |
| ** +FOO_BUILD_TARGETS+ is not +.+. In this case, we iterate over the |
| values to build each target, and for each produced a binary that is |
| the non-directory component of the target. For example if |
| +FOO_BUILD_TARGETS = cmd/docker cmd/dockerd+ the binaries produced |
| are +docker+ and +dockerd+. |
| |
| * +FOO_INSTALL_BINS+ can be used to pass the list of binaries that |
| should be installed in +/usr/bin+ on the target. If |
| +FOO_INSTALL_BINS+ is not specified, it defaults to the lower-case |
| name of package. |
| |
| With the Go infrastructure, all the steps required to build and |
| install the packages are already defined, and they generally work well |
| for most Go-based packages. However, when required, it is still |
| possible to customize what is done in any particular step: |
| |
| * By adding a post-operation hook (after extract, patch, configure, |
| build or install). See xref:hooks[] for details. |
| |
| * By overriding one of the steps. For example, even if the Go |
| infrastructure is used, if the package +.mk+ file defines its own |
| +FOO_BUILD_CMDS+ variable, it will be used instead of the default Go |
| one. However, using this method should be restricted to very |
| specific cases. Do not use it in the general case. |
| |
| A Go package can depend on other Go modules, listed in its +go.mod+ |
| file. Buildroot automatically takes care of downloading such |
| dependencies as part of the download step of packages that use the |
| +golang-package+ infrastructure. Such dependencies are then kept |
| together with the package source code in the tarball cached in |
| Buildroot's +DL_DIR+, and therefore the hash of the package's tarball |
| includes such dependencies. |
| |
| This mechanism ensures that any change in the dependencies will be |
| detected, and allows the build to be performed completely offline. |