1PORTNAME=	go
2DISTVERSION?=	g20240208
3PORTREVISION?=	0
4CATEGORIES=	lang
5MASTER_SITES?=	https://github.com/dmgk/go-bootstrap/releases/download/${BOOTSTRAP_TAG}/:bootstrap \
6		FREEBSD_LOCAL/dmgk:bootstrap
7PKGNAMESUFFIX=	${DISTVERSION:C/^g[0-9]+/-devel/:C/^([0-9]+)\.([0-9]+).*/\1\2/}
8DISTFILES?=	go-freebsd-${GOARCH_${ARCH}}${GOARM_${ARCH}}-${BOOTSTRAP_TAG}.tar.xz:bootstrap
9
10MAINTAINER=	ports@MidnightBSD.org
11COMMENT?=	Go programming language (development version)
12WWW=		https://golang.org
13
14LICENSE=	bsd3
15LICENSE_FILE=	${WRKSRC}/LICENSE
16
17.ifdef QEMU_EMULATING
18IGNORE=		fails to build with qemu-user-static
19.endif
20
21ONLY_FOR_ARCHS=	aarch64 amd64 armv6 armv7 i386 riscv64
22
23BUILD_DEPENDS?=	bash:shells/bash
24RUN_DEPENDS=	${RUN_DEPENDS_${ARCH}}
25# ld.bfd from devel/binutils is needed for working cgo on aarch64
26RUN_DEPENDS_aarch64=	binutils>0:devel/binutils
27
28NO_TEST=	yes
29
30USES=		cpe shebangfix
31
32CPE_VENDOR=	golang
33NO_SHLIB_REQUIRES_GLOB=	*
34
35.ifndef MASTERDIR
36USE_GITHUB=	yes
37GH_ACCOUNT=	golang
38# go1.22
39GH_TAGNAME=	20107e05a609b8f2e61a6b5e8dc258237ad046e7
40.endif
41
42SHEBANG_FILES?=	misc/wasm/go_js_wasm_exec misc/wasm/go_wasip1_wasm_exec
43SHEBANG_GLOB=	*.bash *.pl *.sh
44REINPLACE_ARGS=	-i''
45# Upstream archive contains files with UTF-8 names
46EXTRACT_CMD=	${SETENV} LC_ALL=en_US.UTF-8 ${TAR}
47BASH?=		${LOCALBASE}/bin/bash
48
49OPTIONS_DEFINE_i386=	SOFTFLOAT
50OPTIONS_DEFAULT_amd64=	V1
51OPTIONS_SINGLE=	${OPTIONS_SINGLE_${ARCH}}
52OPTIONS_SINGLE_amd64=	GOAMD64
53OPTIONS_SINGLE_GOAMD64=	V1 V2 V3 V4
54
55SOFTFLOAT_DESC=	Use soft float on non-SSE2 processors (Pentium 4 and older)
56SOFTFLOAT_VARS=	GO386=softfloat
57V1_DESC=	Use baseline x86-64 instruction set
58V1_VARS=	GOAMD64=v1
59V2_DESC=	V1 instructions plus CMPXCHG16B, LAHF, SAHF, POPCNT, SSE*
60V2_VARS=	GOAMD64=v2
61V3_DESC=	V2 instructions plus AVX*, BMI*, F16C, FMA, LZCNT, MOVBE, OSXSAVE
62V3_VARS=	GOAMD64=v3
63V4_DESC=	V3 instructions plus AVX512*
64V4_VARS=	GOAMD64=v4
65
66BOOTSTRAP_TAG=	go1.20
67GO_SUFFIX=	${PKGNAMESUFFIX}
68
69GOARCH_aarch64=	arm64
70GOARCH_amd64=	amd64
71GOARCH_armv6=	arm
72GOARCH_armv7=	arm
73GOARCH_i386=	386
74GOARCH_riscv64=	riscv64
75GOARM_armv6=	6
76GOARM_armv7=	7
77
78.include <bsd.port.pre.mk>
79
80post-extract:
81	@[ -z "${GH_TAGNAME}" ] || \
82		${ECHO_CMD} "devel ${DISTVERSION}-${GH_TAGNAME} freebsd/${GOARCH_${ARCH}}" > ${WRKSRC}/VERSION
83
84post-patch:
85	@${REINPLACE_CMD} -e 's|type -ap |type |' ${WRKSRC}/src/make.bash
86	@${REINPLACE_CMD} -e 's|^if ulimit -T|false \&\& &|' ${WRKSRC}/src/run.bash
87
88pre-build:
89 	# Check that the running kernel has COMPAT_FREEBSD11 required by lang/go{,-devel} post-ino64
90	@${SETENV} CC="${CC}" OPSYS="freebsd" OSVERSION="${OSVERSION}" WRKDIR="${WRKDIR}" \
91		${SH} ${SCRIPTSDIR}/rust-compat11-canary.sh
92
93do-build:
94	cd ${WRKSRC}/src ; ${SETENV} \
95		XDG_CACHE_HOME=${WRKDIR} \
96		GOROOT_BOOTSTRAP=${WRKDIR}/go-freebsd-${GOARCH_${ARCH}}${GOARM_${ARCH}}-bootstrap \
97		GOROOT=${WRKSRC} \
98		GOROOT_FINAL=${PREFIX}/go${GO_SUFFIX} \
99		GOBIN= \
100		GOOS=freebsd \
101		GOARCH=${GOARCH_${ARCH}} \
102		GO386=${GO386} \
103		GOARM=${GOARM_${ARCH}} \
104		CC=${CC} \
105		${BASH} make.bash -v
106
107do-install:
108	-cd ${WRKSRC} ; \
109		${RM} -r .gitattributes .gitignore .github favicon.ico robots.txt \
110		pkg/obj pkg/bootstrap pkg/freebsd_${GOARCH_${ARCH}}/cmd
111	@${MKDIR} ${PREFIX}/go${GO_SUFFIX}
112	@${CP} -a ${WRKSRC}/* ${PREFIX}/go${GO_SUFFIX}
113	@${STRIP_CMD} ${PREFIX}/go${GO_SUFFIX}/bin/*
114	@${STRIP_CMD} ${PREFIX}/go${GO_SUFFIX}/pkg/tool/freebsd_${GOARCH_${ARCH}}/*
115.for f in go gofmt
116	${LN} -sf ../go${GO_SUFFIX}/bin/${f} ${PREFIX}/bin/${f}${GO_SUFFIX}
117	@${ECHO_CMD} bin/${f}${GO_SUFFIX} >> ${TMPPLIST}
118.endfor
119	-${RM} -rf ${PREFIX}/go${GO_SUFFIX}/test/fixedbugs
120	@cd ${PREFIX} && ${FIND} go${GO_SUFFIX} -type f >> ${TMPPLIST}
121
122.if !defined(_GO_MAKESUM_GUARD)
123makesum:
124	${MAKE} -D_GO_MAKESUM_GUARD makesum ARCH=${ONLY_FOR_ARCHS:O:[1]} DISTINFO_FILE=${DISTINFO_FILE}.tmp
125.for arch in ${ONLY_FOR_ARCHS:O:[2..-1]}
126	${MAKE} -D_GO_MAKESUM_GUARD makesum ARCH=${arch} DISTINFO_FILE=${DISTINFO_FILE}.${arch}
127	${SED} 1d ${DISTINFO_FILE}.${arch} >> ${DISTINFO_FILE}.tmp
128	${RM} ${DISTINFO_FILE}.${arch}
129.endfor
130	${AWK} '!seen[$$0]++' ${DISTINFO_FILE}.tmp > ${DISTINFO_FILE}
131	${RM} ${DISTINFO_FILE}.tmp
132.endif
133
134.include <bsd.port.post.mk>
135