1*4882a593Smuzhiyun################################################################################ 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# go 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun################################################################################ 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunGO_VERSION = 1.17.3 8*4882a593SmuzhiyunGO_SITE = https://storage.googleapis.com/golang 9*4882a593SmuzhiyunGO_SOURCE = go$(GO_VERSION).src.tar.gz 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunGO_LICENSE = BSD-3-Clause 12*4882a593SmuzhiyunGO_LICENSE_FILES = LICENSE 13*4882a593SmuzhiyunGO_CPE_ID_VENDOR = golang 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunHOST_GO_DEPENDENCIES = host-go-bootstrap 16*4882a593SmuzhiyunHOST_GO_GOPATH = $(HOST_DIR)/usr/share/go-path 17*4882a593SmuzhiyunHOST_GO_HOST_CACHE = $(HOST_DIR)/usr/share/host-go-cache 18*4882a593SmuzhiyunHOST_GO_ROOT = $(HOST_DIR)/lib/go 19*4882a593SmuzhiyunHOST_GO_TARGET_CACHE = $(HOST_DIR)/usr/share/go-cache 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun# We pass an empty GOBIN, otherwise "go install: cannot install 22*4882a593Smuzhiyun# cross-compiled binaries when GOBIN is set" 23*4882a593SmuzhiyunHOST_GO_COMMON_ENV = \ 24*4882a593Smuzhiyun GO111MODULE=on \ 25*4882a593Smuzhiyun GOFLAGS=-mod=vendor \ 26*4882a593Smuzhiyun GOROOT="$(HOST_GO_ROOT)" \ 27*4882a593Smuzhiyun GOPATH="$(HOST_GO_GOPATH)" \ 28*4882a593Smuzhiyun GOPROXY=off \ 29*4882a593Smuzhiyun PATH=$(BR_PATH) \ 30*4882a593Smuzhiyun GOBIN= \ 31*4882a593Smuzhiyun CGO_ENABLED=$(HOST_GO_CGO_ENABLED) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyunifeq ($(BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS),y) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyunifeq ($(BR2_arm),y) 36*4882a593SmuzhiyunGO_GOARCH = arm 37*4882a593Smuzhiyunifeq ($(BR2_ARM_CPU_ARMV5),y) 38*4882a593SmuzhiyunGO_GOARM = 5 39*4882a593Smuzhiyunelse ifeq ($(BR2_ARM_CPU_ARMV6),y) 40*4882a593SmuzhiyunGO_GOARM = 6 41*4882a593Smuzhiyunelse ifeq ($(BR2_ARM_CPU_ARMV7A),y) 42*4882a593SmuzhiyunGO_GOARM = 7 43*4882a593Smuzhiyunelse ifeq ($(BR2_ARM_CPU_ARMV8A),y) 44*4882a593Smuzhiyun# Go doesn't support 32-bit GOARM=8 (https://github.com/golang/go/issues/29373) 45*4882a593Smuzhiyun# but can still benefit from armv7 optimisations 46*4882a593SmuzhiyunGO_GOARM = 7 47*4882a593Smuzhiyunendif 48*4882a593Smuzhiyunelse ifeq ($(BR2_aarch64),y) 49*4882a593SmuzhiyunGO_GOARCH = arm64 50*4882a593Smuzhiyunelse ifeq ($(BR2_i386),y) 51*4882a593SmuzhiyunGO_GOARCH = 386 52*4882a593Smuzhiyun# i386: use softfloat if no SSE2: https://golang.org/doc/go1.16#386 53*4882a593Smuzhiyunifneq ($(BR2_X86_CPU_HAS_SSE2),y) 54*4882a593SmuzhiyunGO_GO386 = softfloat 55*4882a593Smuzhiyunendif 56*4882a593Smuzhiyunelse ifeq ($(BR2_x86_64),y) 57*4882a593SmuzhiyunGO_GOARCH = amd64 58*4882a593Smuzhiyunelse ifeq ($(BR2_powerpc64),y) 59*4882a593SmuzhiyunGO_GOARCH = ppc64 60*4882a593Smuzhiyunelse ifeq ($(BR2_powerpc64le),y) 61*4882a593SmuzhiyunGO_GOARCH = ppc64le 62*4882a593Smuzhiyunelse ifeq ($(BR2_mips64),y) 63*4882a593SmuzhiyunGO_GOARCH = mips64 64*4882a593Smuzhiyunelse ifeq ($(BR2_mips64el),y) 65*4882a593SmuzhiyunGO_GOARCH = mips64le 66*4882a593Smuzhiyunelse ifeq ($(BR2_s390x),y) 67*4882a593SmuzhiyunGO_GOARCH = s390x 68*4882a593Smuzhiyunendif 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun# For the convienience of target packages. 71*4882a593SmuzhiyunHOST_GO_TOOLDIR = $(HOST_GO_ROOT)/pkg/tool/linux_$(GO_GOARCH) 72*4882a593SmuzhiyunHOST_GO_TARGET_ENV = \ 73*4882a593Smuzhiyun $(HOST_GO_COMMON_ENV) \ 74*4882a593Smuzhiyun GOARCH=$(GO_GOARCH) \ 75*4882a593Smuzhiyun GOCACHE="$(HOST_GO_TARGET_CACHE)" \ 76*4882a593Smuzhiyun CC="$(TARGET_CC)" \ 77*4882a593Smuzhiyun CXX="$(TARGET_CXX)" \ 78*4882a593Smuzhiyun CGO_CFLAGS="$(TARGET_CFLAGS)" \ 79*4882a593Smuzhiyun CGO_CXXFLAGS="$(TARGET_CXXFLAGS)" \ 80*4882a593Smuzhiyun CGO_LDFLAGS="$(TARGET_LDFLAGS)" \ 81*4882a593Smuzhiyun GOTOOLDIR="$(HOST_GO_TOOLDIR)" 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun# The go compiler's cgo support uses threads. If BR2_TOOLCHAIN_HAS_THREADS is 84*4882a593Smuzhiyun# set, build in cgo support for any go programs that may need it. Note that 85*4882a593Smuzhiyun# any target package needing cgo support must include 86*4882a593Smuzhiyun# 'depends on BR2_TOOLCHAIN_HAS_THREADS' in its config file. 87*4882a593Smuzhiyunifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y) 88*4882a593SmuzhiyunHOST_GO_CGO_ENABLED = 1 89*4882a593Smuzhiyunelse 90*4882a593SmuzhiyunHOST_GO_CGO_ENABLED = 0 91*4882a593Smuzhiyunendif 92*4882a593Smuzhiyun 93*4882a593SmuzhiyunHOST_GO_CROSS_ENV = \ 94*4882a593Smuzhiyun CC_FOR_TARGET="$(TARGET_CC)" \ 95*4882a593Smuzhiyun CXX_FOR_TARGET="$(TARGET_CXX)" \ 96*4882a593Smuzhiyun GOARCH=$(GO_GOARCH) \ 97*4882a593Smuzhiyun $(if $(GO_GO386),GO386=$(GO_GO386)) \ 98*4882a593Smuzhiyun $(if $(GO_GOARM),GOARM=$(GO_GOARM)) \ 99*4882a593Smuzhiyun GO_ASSUME_CROSSCOMPILING=1 100*4882a593Smuzhiyun 101*4882a593Smuzhiyunelse # !BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS 102*4882a593Smuzhiyun# host-go can still be used to build packages for the host. No need to set all 103*4882a593Smuzhiyun# the arch stuff since we will not be cross-compiling. 104*4882a593SmuzhiyunHOST_GO_CGO_ENABLED = 1 105*4882a593Smuzhiyunendif # BR2_PACKAGE_HOST_GO_TARGET_ARCH_SUPPORTS 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun# For the convenience of host golang packages 108*4882a593SmuzhiyunHOST_GO_HOST_ENV = \ 109*4882a593Smuzhiyun $(HOST_GO_COMMON_ENV) \ 110*4882a593Smuzhiyun GOARCH="" \ 111*4882a593Smuzhiyun GOCACHE="$(HOST_GO_HOST_CACHE)" \ 112*4882a593Smuzhiyun CC="$(HOSTCC_NOCCACHE)" \ 113*4882a593Smuzhiyun CXX="$(HOSTCXX_NOCCACHE)" \ 114*4882a593Smuzhiyun CGO_CFLAGS="$(HOST_CFLAGS)" \ 115*4882a593Smuzhiyun CGO_CXXFLAGS="$(HOST_CXXFLAGS)" \ 116*4882a593Smuzhiyun CGO_LDFLAGS="$(HOST_LDFLAGS)" 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun# The go build system is not compatible with ccache, so use 119*4882a593Smuzhiyun# HOSTCC_NOCCACHE. See https://github.com/golang/go/issues/11685. 120*4882a593SmuzhiyunHOST_GO_MAKE_ENV = \ 121*4882a593Smuzhiyun GO111MODULE=off \ 122*4882a593Smuzhiyun GOCACHE=$(HOST_GO_HOST_CACHE) \ 123*4882a593Smuzhiyun GOROOT_BOOTSTRAP=$(HOST_GO_BOOTSTRAP_ROOT) \ 124*4882a593Smuzhiyun GOROOT_FINAL=$(HOST_GO_ROOT) \ 125*4882a593Smuzhiyun GOROOT="$(@D)" \ 126*4882a593Smuzhiyun GOBIN="$(@D)/bin" \ 127*4882a593Smuzhiyun GOOS=linux \ 128*4882a593Smuzhiyun CC=$(HOSTCC_NOCCACHE) \ 129*4882a593Smuzhiyun CXX=$(HOSTCXX_NOCCACHE) \ 130*4882a593Smuzhiyun CGO_ENABLED=$(HOST_GO_CGO_ENABLED) \ 131*4882a593Smuzhiyun $(HOST_GO_CROSS_ENV) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyundefine HOST_GO_BUILD_CMDS 134*4882a593Smuzhiyun cd $(@D)/src && \ 135*4882a593Smuzhiyun $(HOST_GO_MAKE_ENV) ./make.bash $(if $(VERBOSE),-v) 136*4882a593Smuzhiyunendef 137*4882a593Smuzhiyun 138*4882a593Smuzhiyundefine HOST_GO_INSTALL_CMDS 139*4882a593Smuzhiyun $(INSTALL) -D -m 0755 $(@D)/bin/go $(HOST_GO_ROOT)/bin/go 140*4882a593Smuzhiyun $(INSTALL) -D -m 0755 $(@D)/bin/gofmt $(HOST_GO_ROOT)/bin/gofmt 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun ln -sf ../lib/go/bin/go $(HOST_DIR)/bin/ 143*4882a593Smuzhiyun ln -sf ../lib/go/bin/gofmt $(HOST_DIR)/bin/ 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun cp -a $(@D)/lib $(HOST_GO_ROOT)/ 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun mkdir -p $(HOST_GO_ROOT)/pkg 148*4882a593Smuzhiyun cp -a $(@D)/pkg/include $(@D)/pkg/linux_* $(HOST_GO_ROOT)/pkg/ 149*4882a593Smuzhiyun cp -a $(@D)/pkg/tool $(HOST_GO_ROOT)/pkg/ 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun # There is a known issue which requires the go sources to be installed 152*4882a593Smuzhiyun # https://golang.org/issue/2775 153*4882a593Smuzhiyun cp -a $(@D)/src $(HOST_GO_ROOT)/ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun # Set all file timestamps to prevent the go compiler from rebuilding any 156*4882a593Smuzhiyun # built in packages when programs are built. 157*4882a593Smuzhiyun find $(HOST_GO_ROOT) -type f -exec touch -r $(@D)/bin/go {} \; 158*4882a593Smuzhiyunendef 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun$(eval $(host-generic-package)) 161