![Christian Stewart](/assets/img/avatar_default.png)
The -trimpath option (introduced in go 1.13) removes absolute build paths from the target binary. This results in more consistent / reproducible builds across different systems with varying paths to Buildroot. Signed-off-by: Christian Stewart <christian@paral.in> [Peter: mention that this is a go 1.13+ feature] Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
170 lines
5.4 KiB
Makefile
170 lines
5.4 KiB
Makefile
################################################################################
|
|
# 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_COMMON_ENV = \
|
|
PATH=$(BR_PATH) \
|
|
GOBIN= \
|
|
CGO_ENABLED=$(HOST_GO_CGO_ENABLED)
|
|
|
|
GO_TARGET_ENV = \
|
|
$(HOST_GO_TARGET_ENV) \
|
|
$(GO_COMMON_ENV)
|
|
|
|
GO_HOST_ENV = \
|
|
CGO_CFLAGS="$(HOST_CFLAGS)" \
|
|
CGO_LDFLAGS="$(HOST_LDFLAGS)" \
|
|
$(GO_COMMON_ENV)
|
|
|
|
################################################################################
|
|
# 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)
|
|
#
|
|
################################################################################
|
|
|
|
define inner-golang-package
|
|
|
|
$(2)_WORKSPACE ?= _gopath
|
|
|
|
$(2)_BUILD_OPTS += \
|
|
-ldflags "$$($(2)_LDFLAGS)" \
|
|
-tags "$$($(2)_TAGS)" \
|
|
-trimpath \
|
|
-p $(PARALLEL_JOBS)
|
|
|
|
# Target packages need the Go compiler on the host.
|
|
$(2)_DEPENDENCIES += host-go
|
|
|
|
$(2)_BUILD_TARGETS ?= .
|
|
|
|
# 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 <pkg>_BUILD_CMDS).
|
|
ifeq ($$($(2)_BUILD_TARGETS),.)
|
|
$(2)_BIN_NAME ?= $(1)
|
|
endif
|
|
|
|
$(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
|
|
# 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 $$(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.
|
|
ifndef $(2)_BUILD_CMDS
|
|
ifeq ($(4),target)
|
|
|
|
ifeq ($(BR2_STATIC_LIBS),y)
|
|
$(2)_LDFLAGS += -extldflags '-static'
|
|
endif
|
|
|
|
# Build package for target
|
|
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) build -v $$($(2)_BUILD_OPTS) \
|
|
-o $$(@D)/bin/$$(or $$($(2)_BIN_NAME),$$(notdir $$(d))) \
|
|
./$$(d)
|
|
)
|
|
endef
|
|
else
|
|
# Build package for host
|
|
define $(2)_BUILD_CMDS
|
|
$$(foreach d,$$($(2)_BUILD_TARGETS),\
|
|
cd $$($(2)_SRC_PATH); \
|
|
$$(GO_HOST_ENV) \
|
|
GOPATH="$$(@D)/$$($(2)_WORKSPACE)" \
|
|
$$($(2)_GO_ENV) \
|
|
$$(GO_BIN) build -v $$($(2)_BUILD_OPTS) \
|
|
-o $$(@D)/bin/$$(or $$($(2)_BIN_NAME),$$(notdir $$(d))) \
|
|
./$$(d)
|
|
)
|
|
endef
|
|
endif
|
|
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)/bin/$$(d) $(TARGET_DIR)/usr/bin/$$(d)
|
|
)
|
|
endef
|
|
endif
|
|
|
|
# Host installation step
|
|
ifndef $(2)_INSTALL_CMDS
|
|
define $(2)_INSTALL_CMDS
|
|
$$(foreach d,$$($(2)_INSTALL_BINS),\
|
|
$(INSTALL) -D -m 0755 $$(@D)/bin/$$(d) $(HOST_DIR)/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)
|
|
host-golang-package = $(call inner-golang-package,host-$(pkgname),$(call UPPERCASE,host-$(pkgname)),$(call UPPERCASE,$(pkgname)),host)
|