package/pkg-golang: new package infrastructure
This patch adds a new infrastructure for golang based packages. Signed-off-by: Angelo Compagnucci <angelo@amarulasolutions.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr> [Arnout: - Rewrap comments to 80 columns. - Create a global definition of GO_TARGET_ENV. - <PKG>_GO_ENV is appended to the default env instead of replacing it. - Add a note to inner-golang-package that only target is supported. ] Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
This commit is contained in:
parent
e8257a8f09
commit
048b06ed3e
@ -452,3 +452,4 @@ include package/pkg-kconfig.mk
|
||||
include package/pkg-rebar.mk
|
||||
include package/pkg-kernel-module.mk
|
||||
include package/pkg-waf.mk
|
||||
include package/pkg-golang.mk
|
||||
|
130
package/pkg-golang.mk
Normal file
130
package/pkg-golang.mk
Normal file
@ -0,0 +1,130 @@
|
||||
################################################################################
|
||||
# Golang package infrastructure
|
||||
#
|
||||
# This file implements an infrastructure that eases development of package .mk
|
||||
# files for Go packages. It should be used for all packages that are written in
|
||||
# go.
|
||||
#
|
||||
# See the Buildroot documentation for details on the usage of this
|
||||
# infrastructure
|
||||
#
|
||||
#
|
||||
# In terms of implementation, this golang infrastructure requires the .mk file
|
||||
# to only specify metadata information about the package: name, version,
|
||||
# download URL, etc.
|
||||
#
|
||||
# We still allow the package .mk file to override what the different steps are
|
||||
# doing, if needed. For example, if <PKG>_BUILD_CMDS is already defined, it is
|
||||
# used as the list of commands to perform to build the package, instead of the
|
||||
# default golang behavior. The package can also define some post operation
|
||||
# hooks.
|
||||
#
|
||||
################################################################################
|
||||
|
||||
GO_BIN = $(HOST_DIR)/bin/go
|
||||
|
||||
# We pass an empty GOBIN, otherwise "go install: cannot install
|
||||
# cross-compiled binaries when GOBIN is set"
|
||||
GO_TARGET_ENV = \
|
||||
$(HOST_GO_TARGET_ENV) \
|
||||
GOBIN= \
|
||||
CGO_ENABLED=$(HOST_GO_CGO_ENABLED)
|
||||
|
||||
################################################################################
|
||||
# inner-golang-package -- defines how the configuration, compilation and
|
||||
# installation of a Go package should be done, implements a few hooks to tune
|
||||
# the build process for Go specificities and calls the generic package
|
||||
# infrastructure to generate the necessary make targets
|
||||
#
|
||||
# argument 1 is the lowercase package name
|
||||
# argument 2 is the uppercase package name, including a HOST_ prefix for host
|
||||
# packages
|
||||
# argument 3 is the uppercase package name, without the HOST_ prefix for host
|
||||
# packages
|
||||
# argument 4 is the type (target or host)
|
||||
#
|
||||
# NOTE Only type target is supported at the moment
|
||||
################################################################################
|
||||
|
||||
define inner-golang-package
|
||||
|
||||
$(2)_WORKSPACE ?= _gopath
|
||||
|
||||
ifeq ($(BR2_STATIC_LIBS),y)
|
||||
$(2)_LDFLAGS += -extldflags '-static'
|
||||
endif
|
||||
|
||||
$(2)_BUILD_OPTS += -ldflags "$$($(2)_LDFLAGS)"
|
||||
$(2)_BUILD_OPTS += -tags "$$($(2)_TAGS)"
|
||||
|
||||
# Target packages need the Go compiler on the host.
|
||||
$(2)_DEPENDENCIES += host-go
|
||||
|
||||
$(2)_BUILD_TARGETS ?= .
|
||||
|
||||
$(2)_INSTALL_BINS ?= $(1)
|
||||
|
||||
# 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)
|
||||
|
||||
# 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
|
||||
# derive domain/vendor/software from the upstream URL of the project, but we
|
||||
# allow $(2)_SRC_SUBDIR to be overridden if needed.
|
||||
$(2)_SRC_DOMAIN = $$(call domain,$($(2)_SITE))
|
||||
$(2)_SRC_VENDOR = $$(word 1,$$(subst /, ,$$(call notdomain,$($(2)_SITE))))
|
||||
$(2)_SRC_SOFTWARE = $$(word 2,$$(subst /, ,$$(call notdomain,$($(2)_SITE))))
|
||||
|
||||
$(2)_SRC_SUBDIR ?= $$($(2)_SRC_DOMAIN)/$$($(2)_SRC_VENDOR)/$$($(2)_SRC_SOFTWARE)
|
||||
$(2)_SRC_PATH = $$(@D)/$$($(2)_WORKSPACE)/src/$$($(2)_SRC_SUBDIR)
|
||||
|
||||
# Configure step. Only define it if not already defined by the package .mk
|
||||
# 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 <workspace>/bin/linux_GOARCH/.
|
||||
# This leverages the go build infrastructure for building and installing
|
||||
# multiple binaries.
|
||||
ifndef $(2)_BUILD_CMDS
|
||||
define $(2)_BUILD_CMDS
|
||||
$$(foreach d,$$($(2)_BUILD_TARGETS),\
|
||||
cd $$($(2)_SRC_PATH); \
|
||||
$$(GO_TARGET_ENV) \
|
||||
GOPATH="$$(@D)/$$($(2)_WORKSPACE)" \
|
||||
$$($(2)_GO_ENV) \
|
||||
$$(GO_BIN) install -v $$($(2)_BUILD_OPTS) ./$$(d)
|
||||
)
|
||||
endef
|
||||
endif
|
||||
|
||||
# Target installation step. Only define it if not already defined by the
|
||||
# package .mk file.
|
||||
ifndef $(2)_INSTALL_TARGET_CMDS
|
||||
define $(2)_INSTALL_TARGET_CMDS
|
||||
$$(foreach d,$$($(2)_INSTALL_BINS),\
|
||||
$(INSTALL) -D -m 0755 $$(@D)/$$($(2)_BINDIR)/$$(d) $(TARGET_DIR)/usr/bin/$$(d)
|
||||
)
|
||||
endef
|
||||
endif
|
||||
|
||||
# Call the generic package infrastructure to generate the necessary make
|
||||
# targets
|
||||
$(call inner-generic-package,$(1),$(2),$(3),$(4))
|
||||
|
||||
endef # inner-golang-package
|
||||
|
||||
################################################################################
|
||||
# golang-package -- the target generator macro for Go packages
|
||||
################################################################################
|
||||
|
||||
golang-package = $(call inner-golang-package,$(pkgname),$(call UPPERCASE,$(pkgname)),$(call UPPERCASE,$(pkgname)),target)
|
Loading…
Reference in New Issue
Block a user