xref: /OK3568_Linux_fs/buildroot/package/go/go.mk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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