diff --git a/docs/manual/adding-packages-golang.txt b/docs/manual/adding-packages-golang.txt index b6d1f5e6b4..efcf696867 100644 --- a/docs/manual/adding-packages-golang.txt +++ b/docs/manual/adding-packages-golang.txt @@ -86,7 +86,18 @@ therefore only use a few of them, or none. * +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 +.+. + 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 diff --git a/package/pkg-golang.mk b/package/pkg-golang.mk index f51b2ee2e0..342d17fbd9 100644 --- a/package/pkg-golang.mk +++ b/package/pkg-golang.mk @@ -62,12 +62,16 @@ $(2)_DEPENDENCIES += host-go $(2)_BUILD_TARGETS ?= . -$(2)_INSTALL_BINS ?= $(1) +# If the build target is just ".", then we assume the binary to be +# produced is named after the package. If however, a build target has +# been specified, we assume that the binaries to be produced are named +# after each build target building them (below in _BUILD_CMDS). +ifeq ($$($(2)_BUILD_TARGETS),.) +$(2)_BIN_NAME ?= $(1) +endif -# The go build/install command installs the binaries inside -# gopath/bin/linux_GOARCH/ when cross compilation is enabled. We set this -# variable here to be used by packages if needed. -$(2)_BINDIR = $$($(2)_WORKSPACE)/bin/linux_$$(GO_GOARCH) +$(2)_BINDIR = bin +$(2)_INSTALL_BINS ?= $(1) # Source files in Go should be extracted in a precise folder in the hierarchy # of GOPATH. It usually resolves around domain/vendor/software. By default, we @@ -84,17 +88,13 @@ $(2)_SRC_PATH = $$(@D)/$$($(2)_WORKSPACE)/src/$$($(2)_SRC_SUBDIR) # file. ifndef $(2)_CONFIGURE_CMDS define $(2)_CONFIGURE_CMDS - mkdir -p $$(@D)/$$($(2)_WORKSPACE)/bin mkdir -p $$(dir $$($(2)_SRC_PATH)) ln -sf $$(@D) $$($(2)_SRC_PATH) endef endif -# Build step. Only define it if not already defined by the package .mk file. We -# use the install command instead of build command here because the install -# command just moves the package binaries into /bin/linux_GOARCH/. -# This leverages the go build infrastructure for building and installing -# multiple binaries. +# Build step. Only define it if not already defined by the package .mk +# file. ifndef $(2)_BUILD_CMDS define $(2)_BUILD_CMDS $$(foreach d,$$($(2)_BUILD_TARGETS),\ @@ -102,7 +102,9 @@ define $(2)_BUILD_CMDS $$(GO_TARGET_ENV) \ GOPATH="$$(@D)/$$($(2)_WORKSPACE)" \ $$($(2)_GO_ENV) \ - $$(GO_BIN) install -v $$($(2)_BUILD_OPTS) ./$$(d) + $$(GO_BIN) build -v $$($(2)_BUILD_OPTS) \ + -o $$(@D)/$$($(2)_BINDIR)/$$(or $$($(2)_BIN_NAME),$$(notdir $$(d))) \ + ./$$(d) ) endef endif