|
@ -0,0 +1,220 @@ |
|
|
|
|
|
#
|
|
|
|
|
|
# Copyright (C) 2020 Jeffery To
|
|
|
|
|
|
#
|
|
|
|
|
|
# This is free software, licensed under the GNU General Public License v2.
|
|
|
|
|
|
# See /LICENSE for more information.
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
|
|
ifeq ($(origin GO_INCLUDE_DIR),undefined) |
|
|
|
|
|
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) |
|
|
|
|
|
endif |
|
|
|
|
|
|
|
|
|
|
|
include $(GO_INCLUDE_DIR)/golang-values.mk |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# these variables have the same meanings as in golang-package.mk
|
|
|
|
|
|
GO_HOST_INSTALL_EXTRA?=$(GO_PKG_INSTALL_EXTRA) |
|
|
|
|
|
GO_HOST_INSTALL_ALL?=$(GO_PKG_INSTALL_ALL) |
|
|
|
|
|
GO_HOST_SOURCE_ONLY?=$(GO_PKG_SOURCE_ONLY) |
|
|
|
|
|
GO_HOST_BUILD_PKG?=$(GO_PKG_BUILD_PKG) |
|
|
|
|
|
GO_HOST_EXCLUDES?=$(GO_PKG_EXCLUDES) |
|
|
|
|
|
GO_HOST_GO_GENERATE?=$(GO_PKG_GO_GENERATE) |
|
|
|
|
|
GO_HOST_GCFLAGS?=$(GO_PKG_GCFLAGS) |
|
|
|
|
|
GO_HOST_LDFLAGS?=$(GO_PKG_LDFLAGS) |
|
|
|
|
|
GO_HOST_LDFLAGS_X?=$(GO_PKG_LDFLAGS_X) |
|
|
|
|
|
GO_HOST_TAGS?=$(GO_PKG_TAGS) |
|
|
|
|
|
GO_HOST_INSTALL_BIN_PATH?=/bin |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# need to repeat this here in case golang-package.mk is not included
|
|
|
|
|
|
GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/... |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_WORK_DIR_NAME:=.go_work |
|
|
|
|
|
GO_HOST_BUILD_DIR=$(HOST_BUILD_DIR)/$(GO_HOST_WORK_DIR_NAME)/build |
|
|
|
|
|
GO_HOST_BUILD_BIN_DIR=$(GO_HOST_BUILD_DIR)/bin |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_BUILD_DEPENDS_PATH:=/share/gocode |
|
|
|
|
|
GO_HOST_BUILD_DEPENDS_SRC=$(STAGING_DIR_HOSTPKG)$(GO_HOST_BUILD_DEPENDS_PATH)/src |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR))) |
|
|
|
|
|
GO_HOST_STAGING_DIR:=$(TMP_DIR)/host-stage-$(GO_HOST_DIR_NAME) |
|
|
|
|
|
GO_HOST_STAGING_FILES_LIST_DIR:=$(HOST_BUILD_PREFIX)/stamp |
|
|
|
|
|
GO_HOST_BIN_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-bin.list |
|
|
|
|
|
GO_HOST_SRC_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-src.list |
|
|
|
|
|
|
|
|
|
|
|
ifeq ($(GO_HOST_PIE_SUPPORTED),1) |
|
|
|
|
|
GO_HOST_ENABLE_PIE:=1 |
|
|
|
|
|
endif |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_BUILD_CONFIG_VARS= \
|
|
|
|
|
|
GO_PKG="$(strip $(GO_PKG))" \
|
|
|
|
|
|
GO_INSTALL_EXTRA="$(strip $(GO_HOST_INSTALL_EXTRA))" \
|
|
|
|
|
|
GO_INSTALL_ALL="$(strip $(GO_HOST_INSTALL_ALL))" \
|
|
|
|
|
|
GO_SOURCE_ONLY="$(strip $(GO_HOST_SOURCE_ONLY))" \
|
|
|
|
|
|
GO_BUILD_PKG="$(strip $(GO_HOST_BUILD_PKG))" \
|
|
|
|
|
|
GO_EXCLUDES="$(strip $(GO_HOST_EXCLUDES))" \
|
|
|
|
|
|
GO_GO_GENERATE="$(strip $(GO_HOST_GO_GENERATE))" \
|
|
|
|
|
|
GO_INSTALL_BIN_PATH="$(strip $(GO_HOST_INSTALL_BIN_PATH))" \
|
|
|
|
|
|
BUILD_DIR="$(HOST_BUILD_DIR)" \
|
|
|
|
|
|
GO_BUILD_DIR="$(GO_HOST_BUILD_DIR)" \
|
|
|
|
|
|
GO_BUILD_BIN_DIR="$(GO_HOST_BUILD_BIN_DIR)" \
|
|
|
|
|
|
GO_BUILD_DEPENDS_PATH="$(GO_HOST_BUILD_DEPENDS_PATH)" \
|
|
|
|
|
|
GO_BUILD_DEPENDS_SRC="$(GO_HOST_BUILD_DEPENDS_SRC)" |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_MORE_CFLAGS?= \
|
|
|
|
|
|
-Wformat -Werror=format-security \
|
|
|
|
|
|
-fstack-protector-strong \
|
|
|
|
|
|
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 \
|
|
|
|
|
|
-Wl,-z,now -Wl,-z,relro \
|
|
|
|
|
|
$(if $(GO_HOST_ENABLE_PIE),$(FPIC)) |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_MORE_LDFLAGS?= \
|
|
|
|
|
|
-znow -zrelro \
|
|
|
|
|
|
$(if $(GO_HOST_ENABLE_PIE),$(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs) |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_TARGET_VARS= \
|
|
|
|
|
|
CGO_ENABLED=1 \
|
|
|
|
|
|
CC=gcc \
|
|
|
|
|
|
CXX=g++ \
|
|
|
|
|
|
PKG_CONFIG=pkg-config \
|
|
|
|
|
|
CGO_CFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \
|
|
|
|
|
|
CGO_CPPFLAGS="$(HOST_CPPFLAGS) $(GO_HOST_MORE_CPPFLAGS)" \
|
|
|
|
|
|
CGO_CXXFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \
|
|
|
|
|
|
CGO_LDFLAGS="$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS)" \
|
|
|
|
|
|
GO_GCC_HELPER_CC="$(HOSTCC)" \
|
|
|
|
|
|
GO_GCC_HELPER_CXX="$(HOSTCXX)" \
|
|
|
|
|
|
GO_GCC_HELPER_PATH="$$$$PATH" \
|
|
|
|
|
|
PATH="$(STAGING_DIR_HOSTPKG)/lib/go-cross/openwrt:$$$$PATH" |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_BUILD_VARS= \
|
|
|
|
|
|
GOPATH="$(GO_HOST_BUILD_DIR)" \
|
|
|
|
|
|
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
|
|
|
|
|
|
GOMODCACHE="$(GO_MOD_CACHE_DIR)" \
|
|
|
|
|
|
GOENV=off |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_VARS= \
|
|
|
|
|
|
$(GO_HOST_TARGET_VARS) \
|
|
|
|
|
|
$(GO_HOST_BUILD_VARS) |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_DEFAULT_LDFLAGS= \
|
|
|
|
|
|
-linkmode external \
|
|
|
|
|
|
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS))' |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_CUSTOM_LDFLAGS= \
|
|
|
|
|
|
$(GO_HOST_LDFLAGS) \
|
|
|
|
|
|
$(patsubst %,-X %,$(GO_HOST_LDFLAGS_X)) |
|
|
|
|
|
|
|
|
|
|
|
GO_HOST_INSTALL_ARGS= \
|
|
|
|
|
|
-v \
|
|
|
|
|
|
-ldflags "all=$(GO_HOST_DEFAULT_LDFLAGS)" \
|
|
|
|
|
|
$(if $(filter $(GO_HOST_ENABLE_PIE),1),-buildmode pie) \
|
|
|
|
|
|
$(if $(GO_HOST_GCFLAGS),-gcflags "$(GO_HOST_GCFLAGS)") \
|
|
|
|
|
|
$(if $(GO_HOST_CUSTOM_LDFLAGS),-ldflags "$(GO_HOST_CUSTOM_LDFLAGS) $(GO_HOST_DEFAULT_LDFLAGS)") \
|
|
|
|
|
|
$(if $(GO_HOST_TAGS),-tags "$(GO_HOST_TAGS)") |
|
|
|
|
|
|
|
|
|
|
|
define GoHost/Host/Configure |
|
|
|
|
|
$(GO_GENERAL_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(GO_HOST_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
# $(1) additional arguments for go command line (optional)
|
|
|
|
|
|
define GoHost/Host/Compile |
|
|
|
|
|
$(GO_GENERAL_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(GO_HOST_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(GO_HOST_VARS) \
|
|
|
|
|
|
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_HOST_INSTALL_ARGS) $(1) |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
define GoHost/Host/Install/Bin |
|
|
|
|
|
rm -rf "$(GO_HOST_STAGING_DIR)" |
|
|
|
|
|
mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)" |
|
|
|
|
|
|
|
|
|
|
|
$(GO_GENERAL_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(GO_HOST_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(GO_HOST_STAGING_DIR)" |
|
|
|
|
|
|
|
|
|
|
|
if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \
|
|
|
|
|
|
"$(SCRIPT_DIR)/clean-package.sh" \
|
|
|
|
|
|
"$(GO_HOST_BIN_STAGING_FILES_LIST)" \
|
|
|
|
|
|
"$(1)" ; \
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files" |
|
|
|
|
|
|
|
|
|
|
|
$(call locked, \
|
|
|
|
|
|
mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_BIN_STAGING_FILES_LIST)" && \
|
|
|
|
|
|
$(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \
|
|
|
|
|
|
host-staging-dir \
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
rm -rf "$(GO_HOST_STAGING_DIR)" |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
define GoHost/Host/Install/Src |
|
|
|
|
|
rm -rf "$(GO_HOST_STAGING_DIR)" |
|
|
|
|
|
mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)" |
|
|
|
|
|
|
|
|
|
|
|
$(GO_GENERAL_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(GO_HOST_BUILD_CONFIG_VARS) \
|
|
|
|
|
|
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(GO_HOST_STAGING_DIR)" |
|
|
|
|
|
|
|
|
|
|
|
if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \
|
|
|
|
|
|
"$(SCRIPT_DIR)/clean-package.sh" \
|
|
|
|
|
|
"$(GO_HOST_SRC_STAGING_FILES_LIST)" \
|
|
|
|
|
|
"$(1)" ; \
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files" |
|
|
|
|
|
|
|
|
|
|
|
$(call locked, \
|
|
|
|
|
|
mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_SRC_STAGING_FILES_LIST)" && \
|
|
|
|
|
|
$(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \
|
|
|
|
|
|
host-staging-dir \
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
rm -rf "$(GO_HOST_STAGING_DIR)" |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
define GoHost/Host/Install |
|
|
|
|
|
$(if $(filter $(GO_HOST_SOURCE_ONLY),1),, \
|
|
|
|
|
|
$(call GoHost/Host/Install/Bin,$(1)) \
|
|
|
|
|
|
) |
|
|
|
|
|
$(call GoHost/Host/Install/Src,$(1)) |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
define GoHost/Host/Uninstall |
|
|
|
|
|
if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \
|
|
|
|
|
|
"$(SCRIPT_DIR)/clean-package.sh" \
|
|
|
|
|
|
"$(GO_HOST_BIN_STAGING_FILES_LIST)" \
|
|
|
|
|
|
"$(HOST_BUILD_PREFIX)" ; \
|
|
|
|
|
|
rm -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ; \
|
|
|
|
|
|
fi |
|
|
|
|
|
|
|
|
|
|
|
if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \
|
|
|
|
|
|
"$(SCRIPT_DIR)/clean-package.sh" \
|
|
|
|
|
|
"$(GO_HOST_SRC_STAGING_FILES_LIST)" \
|
|
|
|
|
|
"$(HOST_BUILD_PREFIX)" ; \
|
|
|
|
|
|
rm -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ; \
|
|
|
|
|
|
fi |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ifneq ($(strip $(GO_PKG)),) |
|
|
|
|
|
Host/Configure=$(call GoHost/Host/Configure) |
|
|
|
|
|
Host/Compile=$(call GoHost/Host/Compile) |
|
|
|
|
|
Hooks/HostCompile/Post+=Go/CacheCleanup |
|
|
|
|
|
Host/Uninstall=$(call GoHost/Host/Uninstall,$(1)) |
|
|
|
|
|
endif |
|
|
|
|
|
|
|
|
|
|
|
define GoHostBuild |
|
|
|
|
|
Host/Install=$$(call GoHost/Host/Install,$$(1)) |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
define GoBinHostBuild |
|
|
|
|
|
Host/Install=$$(call GoHost/Host/Install/Bin,$$(1)) |
|
|
|
|
|
endef |
|
|
|
|
|
|
|
|
|
|
|
define GoSrcHostBuild |
|
|
|
|
|
Host/Install=$$(call GoHost/Host/Install/Src,$$(1)) |
|
|
|
|
|
endef |