From 066cb5691162939bf189289b9cd0eba8e045b216 Mon Sep 17 00:00:00 2001 From: LEAN-ESX Date: Sat, 29 Feb 2020 22:50:21 -0800 Subject: [PATCH] golang: bump to v1.14 --- lang/golang/golang-compiler.mk | 10 +- lang/golang/golang-package.mk | 82 +++++++++----- lang/golang/golang-values.mk | 195 +++++++++++++++++++++++++++------ lang/golang/golang-version.mk | 14 --- lang/golang/golang/Makefile | 114 ++++++++++++++----- 5 files changed, 307 insertions(+), 108 deletions(-) delete mode 100644 lang/golang/golang-version.mk diff --git a/lang/golang/golang-compiler.mk b/lang/golang/golang-compiler.mk index 5e7fe689..cf350d82 100644 --- a/lang/golang/golang-compiler.mk +++ b/lang/golang/golang-compiler.mk @@ -1,5 +1,5 @@ # -# Copyright (C) 2018 Jeffery To +# Copyright (C) 2018, 2020 Jeffery To # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -51,6 +51,7 @@ endef # $(2) destination prefix # $(3) go version id # $(4) GOOS_GOARCH +# $(5) install suffix (optional) define GoCompiler/Default/Install/Bin $(call GoCompiler/Default/Install/make-dirs,$(2),$(3)) @@ -58,7 +59,7 @@ define GoCompiler/Default/Install/Bin $(INSTALL_DATA) -p $(1)/VERSION $(2)/lib/go-$(3)/ - for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README README.md; do \ + for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README.md SECURITY.md; do \ if [ -f $(1)/$$$$file ]; then \ $(INSTALL_DATA) -p $(1)/$$$$file $(2)/share/go-$(3)/ ; \ fi ; \ @@ -73,7 +74,7 @@ define GoCompiler/Default/Install/Bin endif $(INSTALL_DIR) $(2)/lib/go-$(3)/pkg - $(CP) $(1)/pkg/$(4) $(2)/lib/go-$(3)/pkg/ + $(CP) $(1)/pkg/$(4)$(if $(5),_$(5)) $(2)/lib/go-$(3)/pkg/ $(INSTALL_DIR) $(2)/lib/go-$(3)/pkg/tool/$(4) $(INSTALL_BIN) -p $(1)/pkg/tool/$(4)/* $(2)/lib/go-$(3)/pkg/tool/$(4)/ @@ -141,6 +142,7 @@ endef # $(3) destination prefix # $(4) go version id # $(5) GOOS_GOARCH +# $(6) install suffix (optional) define GoCompiler/AddProfile # $$(1) valid GOOS_GOARCH combinations @@ -155,7 +157,7 @@ define GoCompiler/AddProfile # $$(1) override install prefix (optional) define GoCompiler/$(1)/Install/Bin - $$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5)) + $$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5),$(6)) endef # $$(1) override install prefix (optional) diff --git a/lang/golang/golang-package.mk b/lang/golang/golang-package.mk index db700ee8..303ae0eb 100644 --- a/lang/golang/golang-package.mk +++ b/lang/golang/golang-package.mk @@ -107,20 +107,38 @@ include $(GO_INCLUDE_DIR)/golang-values.mk # for building packages, not user code GO_PKG_PATH:=/usr/share/gocode -GO_PKG_BUILD_PKG?=$(GO_PKG)/... +GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/... GO_PKG_WORK_DIR_NAME:=.go_work GO_PKG_WORK_DIR:=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME) GO_PKG_BUILD_DIR:=$(GO_PKG_WORK_DIR)/build GO_PKG_CACHE_DIR:=$(GO_PKG_WORK_DIR)/cache -GO_PKG_TMP_DIR:=$(GO_PKG_WORK_DIR)/tmp -GO_PKG_BUILD_BIN_DIR:=$(GO_PKG_BUILD_DIR)/bin$(if \ - $(GO_HOST_TARGET_DIFFERENT),/$(GO_OS)_$(GO_ARCH)) +GO_PKG_BUILD_BIN_DIR:=$(GO_PKG_BUILD_DIR)/bin$(if $(GO_HOST_TARGET_DIFFERENT),/$(GO_OS_ARCH)) GO_PKG_BUILD_DEPENDS_SRC:=$(STAGING_DIR)$(GO_PKG_PATH)/src +ifdef CONFIG_PKG_ASLR_PIE_ALL + ifeq ($(strip $(PKG_ASLR_PIE)),1) + ifeq ($(GO_TARGET_PIE_SUPPORTED),1) + GO_PKG_ENABLE_PIE:=1 + else + $(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH)) + endif + endif +endif + +ifdef CONFIG_PKG_ASLR_PIE_REGULAR + ifeq ($(strip $(PKG_ASLR_PIE_REGULAR)),1) + ifeq ($(GO_TARGET_PIE_SUPPORTED),1) + GO_PKG_ENABLE_PIE:=1 + else + $(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH)) + endif + endif +endif + # sstrip causes corrupted section header size ifneq ($(CONFIG_USE_SSTRIP),) ifneq ($(CONFIG_DEBUG),) @@ -147,7 +165,7 @@ define GoPackage/GoSubMenu CATEGORY:=Languages endef -define GoPackage/Environment/Default +define GoPackage/Environment/Target GOOS=$(GO_OS) \ GOARCH=$(GO_ARCH) \ GO386=$(GO_386) \ @@ -155,12 +173,26 @@ define GoPackage/Environment/Default GOMIPS=$(GO_MIPS) \ GOMIPS64=$(GO_MIPS64) \ CGO_ENABLED=1 \ + CC=$(TARGET_CC) \ + CXX=$(TARGET_CXX) \ CGO_CFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CFLAGS))" \ CGO_CPPFLAGS="$(TARGET_CPPFLAGS)" \ - CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))" + CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))" \ + CGO_LDFLAGS="$(TARGET_LDFLAGS)" endef -GoPackage/Environment=$(call GoPackage/Environment/Default,) +define GoPackage/Environment/Build + GOPATH=$(GO_PKG_BUILD_DIR) \ + GOCACHE=$(GO_PKG_CACHE_DIR) \ + GOENV=off +endef + +define GoPackage/Environment/Default + $(call GoPackage/Environment/Target) \ + $(call GoPackage/Environment/Build) +endef + +GoPackage/Environment=$(call GoPackage/Environment/Default) # false if directory does not exist GoPackage/is_dir_not_empty=$$$$($(FIND) $(1) -maxdepth 0 -type d \! -empty 2>/dev/null) @@ -170,15 +202,14 @@ GoPackage/has_binaries=$(call GoPackage/is_dir_not_empty,$(GO_PKG_BUILD_BIN_DIR) define GoPackage/Build/Configure ( \ cd $(PKG_BUILD_DIR) ; \ - mkdir -p $(GO_PKG_BUILD_DIR)/bin $(GO_PKG_BUILD_DIR)/src \ - $(GO_PKG_CACHE_DIR) $(GO_PKG_TMP_DIR) ; \ + mkdir -p $(GO_PKG_BUILD_DIR)/bin $(GO_PKG_BUILD_DIR)/src $(GO_PKG_CACHE_DIR) ; \ \ files=$$$$($(FIND) ./ \ -type d -a \( -path './.git' -o -path './$(GO_PKG_WORK_DIR_NAME)' \) -prune -o \ \! -type d -print | \ sed 's|^\./||') ; \ \ - if [ "$(GO_PKG_INSTALL_ALL)" != 1 ]; then \ + if [ "$(strip $(GO_PKG_INSTALL_ALL))" != 1 ]; then \ code=$$$$(echo "$$$$files" | grep '\.\(c\|cc\|cpp\|go\|h\|hh\|hpp\|proto\|s\)$$$$') ; \ testdata=$$$$(echo "$$$$files" | grep '\(^\|/\)testdata/') ; \ gomod=$$$$(echo "$$$$files" | grep '\(^\|/\)go\.\(mod\|sum\)$$$$') ; \ @@ -193,10 +224,10 @@ define GoPackage/Build/Configure \ IFS=$$$$'\n' ; \ \ - echo "Copying files from $(PKG_BUILD_DIR) into $(GO_PKG_BUILD_DIR)/src/$(GO_PKG)" ; \ + echo "Copying files from $(PKG_BUILD_DIR) into $(GO_PKG_BUILD_DIR)/src/$(strip $(GO_PKG))" ; \ for file in $$$$files; do \ echo $$$$file ; \ - dest=$(GO_PKG_BUILD_DIR)/src/$(GO_PKG)/$$$$file ; \ + dest=$(GO_PKG_BUILD_DIR)/src/$(strip $(GO_PKG))/$$$$file ; \ mkdir -p $$$$(dirname $$$$dest) ; \ $(CP) $$$$file $$$$dest ; \ done ; \ @@ -217,8 +248,8 @@ define GoPackage/Build/Configure base=$$$$(basename $$$$dir) ; \ if [ -d $$$$dest/$$$$base ]; then \ case $$$$dir in \ - *$(GO_PKG_PATH)/src/$(GO_PKG)) \ - echo "$(GO_PKG) is already installed. Please check for circular dependencies." ;; \ + *$(GO_PKG_PATH)/src/$(strip $(GO_PKG))) \ + echo "$(strip $(GO_PKG)) is already installed. Please check for circular dependencies." ;; \ *) \ link_contents $$$$src/$$$$base $$$$dest/$$$$base ;; \ esac ; \ @@ -229,7 +260,7 @@ define GoPackage/Build/Configure done ; \ } ; \ \ - if [ "$(GO_PKG_SOURCE_ONLY)" != 1 ]; then \ + if [ "$(strip $(GO_PKG_SOURCE_ONLY))" != 1 ]; then \ if [ -d $(GO_PKG_BUILD_DEPENDS_SRC) ]; then \ echo "Symlinking directories from $(GO_PKG_BUILD_DEPENDS_SRC) into $(GO_PKG_BUILD_DIR)/src" ; \ link_contents $(GO_PKG_BUILD_DEPENDS_SRC) $(GO_PKG_BUILD_DIR)/src ; \ @@ -247,13 +278,7 @@ endef define GoPackage/Build/Compile ( \ cd $(GO_PKG_BUILD_DIR) ; \ - export GOPATH=$(GO_PKG_BUILD_DIR) \ - GOCACHE=$(GO_PKG_CACHE_DIR) \ - GOTMPDIR=$(GO_PKG_TMP_DIR) \ - GOROOT_FINAL=$(GO_TARGET_ROOT) \ - CC=$(TARGET_CC) \ - CXX=$(TARGET_CXX) \ - $(call GoPackage/Environment) ; \ + export $(call GoPackage/Environment) ; \ \ echo "Finding targets" ; \ targets=$$$$(go list $(GO_PKG_BUILD_PKG)) ; \ @@ -262,13 +287,13 @@ define GoPackage/Build/Compile done ; \ echo ; \ \ - if [ "$(GO_PKG_GO_GENERATE)" = 1 ]; then \ + if [ "$(strip $(GO_PKG_GO_GENERATE))" = 1 ]; then \ echo "Calling go generate" ; \ go generate -v $(1) $$$$targets ; \ echo ; \ fi ; \ \ - if [ "$(GO_PKG_SOURCE_ONLY)" != 1 ]; then \ + if [ "$(strip $(GO_PKG_SOURCE_ONLY))" != 1 ]; then \ echo "Building targets" ; \ case $(GO_ARCH) in \ arm) installsuffix="v$(GO_ARM)" ;; \ @@ -276,12 +301,13 @@ define GoPackage/Build/Compile mips64|mips64le) installsuffix="$(GO_MIPS64)" ;; \ esac ; \ ldflags="-linkmode external -extldflags '$(TARGET_LDFLAGS:-z%=-Wl,-z,%)'" ; \ - pkg_gcflags="$(GO_PKG_GCFLAGS)" ; \ - pkg_ldflags="$(GO_PKG_LDFLAGS)" ; \ + pkg_gcflags="$(strip $(GO_PKG_GCFLAGS))" ; \ + pkg_ldflags="$(strip $(GO_PKG_LDFLAGS))" ; \ for def in $(GO_PKG_LDFLAGS_X); do \ pkg_ldflags="$$$$pkg_ldflags -X $$$$def" ; \ done ; \ go install \ + $(if $(GO_PKG_ENABLE_PIE),-buildmode pie) \ $$$${installsuffix:+-installsuffix $$$$installsuffix} \ -trimpath \ -ldflags "all=$$$$ldflags" \ @@ -320,7 +346,7 @@ endef define GoPackage/Package/Install/Src dir=$$$$(dirname $(GO_PKG)) ; \ $(INSTALL_DIR) $(1)$(GO_PKG_PATH)/src/$$$$dir ; \ - $(CP) $(GO_PKG_BUILD_DIR)/src/$(GO_PKG) $(1)$(GO_PKG_PATH)/src/$$$$dir/ + $(CP) $(GO_PKG_BUILD_DIR)/src/$(strip $(GO_PKG)) $(1)$(GO_PKG_PATH)/src/$$$$dir/ endef define GoPackage/Package/Install @@ -329,7 +355,7 @@ define GoPackage/Package/Install endef -ifneq ($(GO_PKG),) +ifneq ($(strip $(GO_PKG)),) Build/Configure=$(call GoPackage/Build/Configure) Build/Compile=$(call GoPackage/Build/Compile) Build/InstallDev=$(call GoPackage/Build/InstallDev,$(1)) diff --git a/lang/golang/golang-values.mk b/lang/golang/golang-values.mk index 8989a1af..0b0c0c18 100644 --- a/lang/golang/golang-values.mk +++ b/lang/golang/golang-values.mk @@ -1,5 +1,5 @@ # -# Copyright (C) 2018 Jeffery To +# Copyright (C) 2018, 2020 Jeffery To # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. @@ -9,25 +9,116 @@ ifeq ($(origin GO_INCLUDE_DIR),undefined) GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) endif -include $(GO_INCLUDE_DIR)/golang-version.mk +# Unset environment variables +# There are more magic variables to track down, but ain't nobody got time for that +# From https://golang.org/cmd/go/#hdr-Environment_variables + +# General-purpose environment variables: unexport \ - GOARCH GOBIN GOCACHE GOFLAGS GOHOSTARCH GOOS GOPATH GORACE GOROOT GOTMPDIR GCCGO \ - GOGC GODEBUG GOMAXPROCS GOTRACEBACK \ + GCCGO \ + GOARCH \ + GOBIN \ + GOCACHE \ + GODEBUG \ + GOENV \ + GOFLAGS \ + GOOS \ + GOPATH \ + GOROOT \ + GOTMPDIR +# Unmodified: +# GOPRIVATE +# GOPROXY +# GONOPROXY +# GOSUMDB +# GONOSUMDB + +# Environment variables for use with cgo: +unexport \ + AR \ + CC \ CGO_ENABLED \ - CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \ + CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \ CGO_CPPFLAGS CGO_CPPFLAGS_ALLOW CGO_CPPFLAGS_DISALLOW \ CGO_CXXFLAGS CGO_CXXFLAGS_ALLOW CGO_CXXFLAGS_DISALLOW \ - CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \ - CGO_LDFLAGS CGO_LDFLAGS_ALLOW CGO_LDFLAGS_DISALLOW \ - GOARM GO386 GOMIPS GOMIPS64 \ - GO111MODULE \ - GOROOT_FINAL GO_EXTLINK_ENABLED GIT_ALLOW_PROTOCOL \ - CC_FOR_TARGET CXX_FOR_TARGET GO_DISTFLAGS GO_GCFLAGS GO_LDFLAGS GOBUILDTIMELOGFILE GOROOT_BOOTSTRAP \ - BOOT_GO_GCFLAGS GOEXPERIMENT GOBOOTSTRAP_TOOLEXEC - # there are more magic environment variables to track down, but ain't nobody got time for that - # deliberately left untouched: GOPROXY GONOPROXY GOSUMDB GONOSUMDB GOPRIVATE + CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \ + CGO_LDFLAGS CGO_LDFLAGS_ALLOW CGO_LDFLAGS_DISALLOW \ + CXX \ + FC +# Unmodified: +# PKG_CONFIG + +# Architecture-specific environment variables: +unexport \ + GOARM \ + GO386 \ + GOMIPS \ + GOMIPS64 \ + GOWASM + +# Special-purpose environment variables: +unexport \ + GCCGOTOOLDIR \ + GOROOT_FINAL \ + GO_EXTLINK_ENABLED +# Unmodified: +# GIT_ALLOW_PROTOCOL + +# From https://golang.org/cmd/go/#hdr-Module_support +unexport \ + GO111MODULE + +# From https://golang.org/pkg/runtime/#hdr-Environment_Variables +unexport \ + GOGC \ + GOMAXPROCS \ + GORACE \ + GOTRACEBACK + +# From https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command +unexport \ + CC_FOR_TARGET \ + CXX_FOR_TARGET +# Todo: +# CC_FOR_${GOOS}_${GOARCH} +# CXX_FOR_${GOOS}_${GOARCH} + +# From https://golang.org/doc/install/source#environment +unexport \ + GOHOSTOS \ + GOHOSTARCH \ + GOPPC64 + +# From https://golang.org/src/make.bash +unexport \ + GO_GCFLAGS \ + GO_LDFLAGS \ + GO_LDSO \ + GO_DISTFLAGS \ + GOBUILDTIMELOGFILE \ + GOROOT_BOOTSTRAP + +# From https://golang.org/doc/go1.9#parallel-compile +unexport \ + GO19CONCURRENTCOMPILATION + +# From https://golang.org/src/cmd/dist/build.go +unexport \ + BOOT_GO_GCFLAGS \ + BOOT_GO_LDFLAGS + +# From https://golang.org/src/cmd/dist/buildtool.go +unexport \ + GOBOOTSTRAP_TOOLEXEC + +# From https://golang.org/src/cmd/internal/objabi/util.go +unexport \ + GOEXPERIMENT + + +# GOOS / GOARCH go_arch=$(subst \ aarch64,arm64,$(subst \ @@ -45,18 +136,23 @@ GO_HOST_OS:=$(call tolower,$(HOST_OS)) GO_HOST_ARCH:=$(call go_arch,$(subst \ armv6l,arm,$(subst \ armv7l,arm,$(subst \ - i486,i386,$(subst \ - i586,i386,$(subst \ - i686,i386,$(HOST_ARCH))))))) + i686,i386,$(HOST_ARCH))))) GO_HOST_OS_ARCH:=$(GO_HOST_OS)_$(GO_HOST_ARCH) -GO_HOST_TARGET_SAME:=$(if $(and $(findstring $(GO_OS_ARCH),$(GO_HOST_OS_ARCH)),$(findstring $(GO_HOST_OS_ARCH),$(GO_OS_ARCH))),1) -GO_HOST_TARGET_DIFFERENT:=$(if $(GO_HOST_TARGET_SAME),,1) +ifeq ($(GO_OS_ARCH),$(GO_HOST_OS_ARCH)) + GO_HOST_TARGET_SAME:=1 +else + GO_HOST_TARGET_DIFFERENT:=1 +endif -# ensure binaries can run on older CPUs -GO_386:=387 +ifeq ($(GO_ARCH),386) + # ensure binaries can run on older CPUs + GO_386:=387 -ifeq ($(GO_ARCH),arm) + # -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors + GO_CFLAGS_TO_REMOVE:=-fno-plt + +else ifeq ($(GO_ARCH),arm) GO_TARGET_FPU:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE)))) # FPU names from https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/ARM-Options.html#index-mfpu-1 @@ -86,20 +182,53 @@ ifeq ($(GO_ARCH),arm) else GO_ARM:=5 endif + +else ifneq ($(filter $(GO_ARCH),mips mipsle),) + ifeq ($(CONFIG_HAS_FPU),y) + GO_MIPS:=hardfloat + else + GO_MIPS:=softfloat + endif + + # -mips32r2: conflicts with -march=mips32 set by go + GO_CFLAGS_TO_REMOVE:=-mips32r2 + +else ifneq ($(filter $(GO_ARCH),mips64 mips64le),) + ifeq ($(CONFIG_HAS_FPU),y) + GO_MIPS64:=hardfloat + else + GO_MIPS64:=softfloat + endif + endif -GO_MIPS:=$(if $(filter $(GO_ARCH),mips mipsle),$(if $(CONFIG_HAS_FPU),hardfloat,softfloat),) -GO_MIPS64:=$(if $(filter $(GO_ARCH),mips64 mips64le),$(if $(CONFIG_HAS_FPU),hardfloat,softfloat),) - -# -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors -# -mips32r2: conflicts with -march=mips32 set by go -GO_CFLAGS_TO_REMOVE:=$(if \ -$(filter $(GO_ARCH),386),-fno-plt,$(if \ -$(filter $(GO_ARCH),mips mipsle),-mips32r2,)) +# Target Go GO_ARCH_DEPENDS:=@(aarch64||arm||i386||i686||mips||mips64||mips64el||mipsel||powerpc64||x86_64) -GO_TARGET_PREFIX:=/usr -GO_TARGET_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR) -GO_TARGET_ROOT:=$(GO_TARGET_PREFIX)/lib/go-$(GO_TARGET_VERSION_ID) + +# ASLR/PIE + +GO_PIE_SUPPORTED_OS_ARCH:= \ + android_386 android_amd64 android_arm android_arm64 \ + linux_386 linux_amd64 linux_arm linux_arm64 \ + \ + darwin_amd64 \ + freebsd_amd64 \ + \ + aix_ppc64 \ + \ + linux_ppc64le linux_s390x + +go_pie_install_suffix=$(if $(filter $(1),aix_ppc64),,shared) + +ifneq ($(filter $(GO_HOST_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),) + GO_HOST_PIE_SUPPORTED:=1 + GO_HOST_PIE_INSTALL_SUFFIX:=$(call go_pie_install_suffix,$(GO_HOST_OS_ARCH)) +endif + +ifneq ($(filter $(GO_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),) + GO_TARGET_PIE_SUPPORTED:=1 + GO_TARGET_PIE_INSTALL_SUFFIX:=$(call go_pie_install_suffix,$(GO_OS_ARCH)) +endif diff --git a/lang/golang/golang-version.mk b/lang/golang/golang-version.mk deleted file mode 100644 index 55dedb69..00000000 --- a/lang/golang/golang-version.mk +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (C) 2018 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 - - -GO_VERSION_MAJOR_MINOR:=1.13 -GO_VERSION_PATCH:=6 diff --git a/lang/golang/golang/Makefile b/lang/golang/golang/Makefile index 47fc251a..7b73f37c 100644 --- a/lang/golang/golang/Makefile +++ b/lang/golang/golang/Makefile @@ -1,12 +1,14 @@ # -# Copyright (C) 2018 Jeffery To +# Copyright (C) 2018, 2020 Jeffery To # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk -include ../golang-version.mk + +GO_VERSION_MAJOR_MINOR:=1.14 +GO_VERSION_PATCH:= PKG_NAME:=golang PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH)) @@ -18,11 +20,12 @@ GO_SOURCE_URLS:=https://dl.google.com/go/ \ PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz PKG_SOURCE_URL:=$(GO_SOURCE_URLS) -PKG_HASH:=aae5be954bdc40bcf8006eb77e8d8a5dde412722bc8effcdaf9772620d06420c +PKG_HASH:=6d643e46ad565058c7a39dac01144172ef9bd476521f42148be59249e4b74389 +PKG_MAINTAINER:=Jeffery To PKG_LICENSE:=BSD-3-Clause PKG_LICENSE_FILES:=LICENSE -PKG_MAINTAINER:=Jeffery To +PKG_CPE_ID:=cpe:/a:golang:go PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_DIR:=$(BUILD_DIR)/go-$(PKG_VERSION) @@ -32,34 +35,49 @@ PKG_USE_MIPS16:=0 PKG_GO_WORK_DIR:=$(PKG_BUILD_DIR)/.go_work PKG_GO_HOST_CACHE_DIR:=$(PKG_GO_WORK_DIR)/host_cache PKG_GO_TARGET_CACHE_DIR:=$(PKG_GO_WORK_DIR)/target_cache -PKG_GO_TMP_DIR:=$(PKG_GO_WORK_DIR)/tmp + +PKG_GO_PREFIX:=/usr +PKG_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR) +PKG_GO_ROOT:=$(PKG_GO_PREFIX)/lib/go-$(PKG_GO_VERSION_ID) HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/go-$(PKG_VERSION) HOST_BUILD_PARALLEL:=1 +HOST_GO_WORK_DIR:=$(HOST_BUILD_DIR)/.go_work +HOST_GO_CACHE_DIR:=$(HOST_GO_WORK_DIR)/cache + HOST_GO_PREFIX:=$(STAGING_DIR_HOSTPKG) HOST_GO_VERSION_ID:=cross HOST_GO_ROOT:=$(HOST_GO_PREFIX)/lib/go-$(HOST_GO_VERSION_ID) HOST_GO_VALID_OS_ARCH:= \ - android_arm \ - darwin_386 darwin_amd64 darwin_arm darwin_arm64 \ - dragonfly_amd64 \ - freebsd_386 freebsd_amd64 freebsd_arm \ - linux_386 linux_amd64 linux_arm linux_arm64 \ - netbsd_386 netbsd_amd64 netbsd_arm \ - openbsd_386 openbsd_amd64 openbsd_arm \ - plan9_386 plan9_amd64 \ - solaris_amd64 \ + android_386 android_amd64 android_arm android_arm64 \ + darwin_386 darwin_amd64 darwin_arm darwin_arm64 \ + linux_386 linux_amd64 linux_arm linux_arm64 \ + openbsd_386 openbsd_amd64 openbsd_arm openbsd_arm64 \ + \ + freebsd_386 freebsd_amd64 freebsd_arm \ + netbsd_386 netbsd_amd64 netbsd_arm \ + plan9_386 plan9_amd64 plan9_arm \ + \ windows_386 windows_amd64 \ \ - linux_ppc64 linux_ppc64le linux_mips linux_mipsle linux_mips64 linux_mips64le + dragonfly_amd64 \ + illumos_amd64 \ + solaris_amd64 \ + \ + aix_ppc64 \ + js_wasm \ + \ + linux_ppc64 linux_ppc64le linux_mips linux_mipsle linux_mips64 linux_mips64le linux_s390x BOOTSTRAP_SOURCE:=go1.4-bootstrap-20171003.tar.gz BOOTSTRAP_SOURCE_URL:=$(GO_SOURCE_URLS) BOOTSTRAP_HASH:=f4ff5b5eb3a3cae1c993723f3eab519c5bae18866b5e5f96fe1102f0cb5c3e52 BOOTSTRAP_BUILD_DIR:=$(HOST_BUILD_DIR)/.go_bootstrap +BOOTSTRAP_WORK_DIR:=$(BOOTSTRAP_BUILD_DIR)/.go_work +BOOTSTRAP_CACHE_DIR:=$(BOOTSTRAP_WORK_DIR)/cache BOOTSTRAP_GO_VALID_OS_ARCH:= \ darwin_386 darwin_amd64 \ @@ -85,6 +103,20 @@ BOOTSTRAP_UNPACK:=$(HOST_TAR) -C $(BOOTSTRAP_BUILD_DIR) --strip-components=1 -xz RSTRIP:=: STRIP:=: +ifdef CONFIG_PKG_ASLR_PIE_ALL + ifeq ($(GO_TARGET_PIE_SUPPORTED),1) + PKG_GO_ENABLE_PIE:=1 + PKG_GO_INSTALL_SUFFIX:=$(GO_TARGET_PIE_INSTALL_SUFFIX) + else + $(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH)) + endif +endif + +ifeq ($(GO_HOST_PIE_SUPPORTED),1) + HOST_GO_ENABLE_PIE:=1 + HOST_GO_INSTALL_SUFFIX:=$(GO_HOST_PIE_INSTALL_SUFFIX) +endif + define Package/golang/Default $(call GoPackage/GoSubMenu) TITLE:=Go programming language @@ -151,8 +183,8 @@ endef $(eval $(call Download,golang-bootstrap)) $(eval $(call GoCompiler/AddProfile,Bootstrap,$(BOOTSTRAP_BUILD_DIR),,bootstrap,$(GO_HOST_OS_ARCH))) -$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH))) -$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(GO_TARGET_PREFIX),$(GO_TARGET_VERSION_ID),$(GO_OS_ARCH))) +$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH),$(HOST_GO_INSTALL_SUFFIX))) +$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(PKG_GO_PREFIX),$(PKG_GO_VERSION_ID),$(GO_OS_ARCH),$(PKG_GO_INSTALL_SUFFIX))) define Host/Prepare $(call Host/Prepare/Default) @@ -160,20 +192,46 @@ define Host/Prepare $(BOOTSTRAP_UNPACK) endef +# when https://github.com/golang/go/issues/31544 is fixed, +# we should be able to set GO_LDFLAGS=-buildmode=pie for host make +# instead of doing a rebuild for pie define Host/Compile $(call GoCompiler/Bootstrap/CheckHost,$(BOOTSTRAP_GO_VALID_OS_ARCH)) $(call GoCompiler/Host/CheckHost,$(HOST_GO_VALID_OS_ARCH)) + mkdir -p \ + $(BOOTSTRAP_CACHE_DIR) \ + $(HOST_GO_CACHE_DIR) + $(call GoCompiler/Bootstrap/Make, \ + GOCACHE=$(BOOTSTRAP_CACHE_DIR) \ CC=$(HOSTCC_NOCACHE) \ CXX=$(HOSTCXX_NOCACHE) \ ) $(call GoCompiler/Host/Make, \ GOROOT_BOOTSTRAP=$(BOOTSTRAP_BUILD_DIR) \ + GOCACHE=$(HOST_GO_CACHE_DIR) \ CC=$(HOSTCC_NOCACHE) \ CXX=$(HOSTCXX_NOCACHE) \ ) + + ifneq ($(HOST_GO_ENABLE_PIE),) + @echo "Rebuilding host Go with PIE" + + ( \ + cd $(HOST_BUILD_DIR)/bin ; \ + $(CP) go go-nopie ; \ + GOCACHE=$(HOST_GO_CACHE_DIR) \ + GOENV=off \ + CC=$(HOSTCC_NOCACHE) \ + CXX=$(HOSTCXX_NOCACHE) \ + ./go-nopie install -a -buildmode=pie std cmd ; \ + retval=$$$$? ; \ + rm -f go-nopie ; \ + exit $$$$retval ; \ + ) + endif endef # if host and target os/arch are the same, @@ -187,7 +245,7 @@ define Host/Install $(call GoCompiler/Host/Install/BinLinks,) - rm -rf $(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH) + rm -rf $(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH)$(if $(HOST_GO_INSTALL_SUFFIX),_$(HOST_GO_INSTALL_SUFFIX)) $(INSTALL_DIR) $(HOST_GO_ROOT)/openwrt $(INSTALL_BIN) ./files/go-gcc-helper $(HOST_GO_ROOT)/openwrt/ @@ -206,15 +264,13 @@ endef define Build/Compile mkdir -p \ $(PKG_GO_HOST_CACHE_DIR) \ - $(PKG_GO_TARGET_CACHE_DIR) \ - $(PKG_GO_TMP_DIR) + $(PKG_GO_TARGET_CACHE_DIR) @echo "Building target Go first stage" $(call GoCompiler/Package/Make, \ GOROOT_BOOTSTRAP=$(HOST_GO_ROOT) \ GOCACHE=$(PKG_GO_HOST_CACHE_DIR) \ - GOTMPDIR=$(PKG_GO_TMP_DIR) \ GO_GCC_HELPER_CC="$(HOSTCC)" \ GO_GCC_HELPER_CXX="$(HOSTCXX)" \ GO_GCC_HELPER_PATH=$$$$PATH \ @@ -228,10 +284,11 @@ define Build/Compile ( \ cd $(PKG_BUILD_DIR)/bin ; \ + export $(call GoPackage/Environment/Target) ; \ $(CP) go go-host ; \ - GOROOT_FINAL=$(GO_TARGET_ROOT) \ + GOROOT_FINAL=$(PKG_GO_ROOT) \ GOCACHE=$(PKG_GO_TARGET_CACHE_DIR) \ - GOTMPDIR=$(PKG_GO_TMP_DIR) \ + GOENV=off \ GO_GCC_HELPER_CC="$(TARGET_CC)" \ GO_GCC_HELPER_CXX="$(TARGET_CXX)" \ GO_GCC_HELPER_PATH=$$$$PATH \ @@ -239,8 +296,7 @@ define Build/Compile CXX=g++ \ PKG_CONFIG=pkg-config \ PATH=$(HOST_GO_ROOT)/openwrt:$$$$PATH \ - $(call GoPackage/Environment) \ - ./go-host install -a -v std cmd ; \ + ./go-host install -a $(if $(PKG_GO_ENABLE_PIE),-buildmode=pie) std cmd ; \ retval=$$$$? ; \ rm -f go-host ; \ exit $$$$retval ; \ @@ -248,16 +304,16 @@ define Build/Compile endef define Package/golang/install - $(call GoCompiler/Package/Install/Bin,$(1)$(GO_TARGET_PREFIX)) - $(call GoCompiler/Package/Install/BinLinks,$(1)$(GO_TARGET_PREFIX)) + $(call GoCompiler/Package/Install/Bin,$(1)$(PKG_GO_PREFIX)) + $(call GoCompiler/Package/Install/BinLinks,$(1)$(PKG_GO_PREFIX)) endef define Package/golang-doc/install - $(call GoCompiler/Package/Install/Doc,$(1)$(GO_TARGET_PREFIX)) + $(call GoCompiler/Package/Install/Doc,$(1)$(PKG_GO_PREFIX)) endef define Package/golang-src/install - $(call GoCompiler/Package/Install/Src,$(1)$(GO_TARGET_PREFIX)) + $(call GoCompiler/Package/Install/Src,$(1)$(PKG_GO_PREFIX)) endef # src/debug contains ELF executables as test data