#!/bin/sh
set -e

__goos__deb_arch_os() {
	case "$1" in
		kfreebsd) echo freebsd ;;
		linux) echo "$1" ;;
		*) echo >&2 "error: unrecongized DEB_*_ARCH_OS: $1"; exit 1 ;;
	esac
}

__goarch__deb_arch_cpu() {
	case "$1" in
		amd64|arm|arm64|loong64|mips|ppc64|riscv64|s390x) echo "$1" ;;
		i386) echo 386 ;;
		mips64el) echo mips64le ;;
		mipsel) echo mipsle ;;
		ppc64el) echo ppc64le ;;
		*) echo >&2 "error: unrecongized DEB_*_ARCH_CPU: $1"; exit 1 ;;
	esac
}

#       build machine
#           The machine the package is built on.
#
#       host machine
#           The machine the package is built for.

export GOHOSTOS="$(__goos__deb_arch_os "$(dpkg-architecture -qDEB_BUILD_ARCH_OS 2>/dev/null)")"
export GOOS="$(__goos__deb_arch_os "$(dpkg-architecture -qDEB_HOST_ARCH_OS 2>/dev/null)")"

export GOHOSTARCH="$(__goarch__deb_arch_cpu "$(dpkg-architecture -qDEB_BUILD_ARCH_CPU 2>/dev/null)")"
export GOARCH="$(__goarch__deb_arch_cpu "$(dpkg-architecture -qDEB_HOST_ARCH_CPU 2>/dev/null)")"

if [ -z "$GOHOSTOS" -o -z "$GOOS" -o -z "$GOHOSTARCH" -o -z "$GOARCH" ]; then
	exit 1
fi

[ -e "$GOROOT_BOOTSTRAP/bin/go" ] || exit 1

export GO111MODULE=off # Avoid "go version" trying to download a newer toolchain
GOVERSION_BOOTSTRAP=$("$GOROOT_BOOTSTRAP/bin/go" version|sed -E -n 's|.*go([0-9]\.[0-9]+).*|\1|p')
unset GO111MODULE
export GOVERSION_BOOTSTRAP

# Always not use sse2. This is important to ensure that the binaries we build
# (both when compiling golang on the buildds and when users cross-compile for
# 386) can actually run on older CPUs (where old means e.g. an AMD Athlon XP
# 2400+). See http://bugs.debian.org/753160 and
# https://code.google.com/p/go/issues/detail?id=8152

# Staring from go1.16, GO386=387 is not supported, only GO386=softfloat.
unset GO386
if dpkg --compare-versions "$GOVERSION_BOOTSTRAP" ge "1.16"; then
	# Only go1.16 recognizes GO386=softfloat. Using GO386=387 to build go1.16
	# also fails.
	# https://github.com/golang/go/issues/44500
	# Need to build with GO386="" first, then rebuild go1.16+ with go1.16 and
	# GO386=softfloat
	export GO386=softfloat
fi

unset GOARM
if [ "$GOARCH" = 'arm' ]; then
	# start with GOARM=5 for maximum compatibility (see note about GO386 above)
	GOARM=5
	case "$(dpkg-architecture -qDEB_HOST_ARCH 2>/dev/null)" in
		armhf) GOARM=6 ;;
	esac
fi
export GOARM

# set CC_FOR_os_arch variables appropriately for supported architectures so that cross-compile even with cgo "just works" in more cases (also consistently across architectures for better reproducibility)
linuxArchList="$(dpkg-architecture --list-known --match-wildcard 'gnu-linux-any')"
for dpkgArch in $linuxArchList; do
	archCpu="$(dpkg-architecture --force --host-arch "$dpkgArch" --query DEB_HOST_ARCH_CPU 2>/dev/null)"
	if goArch="$(__goarch__deb_arch_cpu "$archCpu" 2>/dev/null)"; then
		gnuType="$(dpkg-architecture --force --host-arch "$dpkgArch" --query DEB_HOST_GNU_TYPE 2>/dev/null)"
		export  "CC_FOR_linux_${goArch}=${gnuType}-gcc"
		export "CXX_FOR_linux_${goArch}=${gnuType}-g++"
		unset gnuType
	fi
	unset archCpu goArch
done
unset linuxArchList dpkgArch

unset CGO_ENABLED
if [ "$GOOS" = 'linux' ] && [ "$GOARCH" != "$GOHOSTARCH" ] && eval 'test -n "${CC_FOR_'"${GOHOSTOS}_${GOHOSTARCH}"':-}" && "${CC_FOR_'"${GOHOSTOS}_${GOHOSTARCH}"'}" --version > /dev/null'; then
	# if we're cross-compiling, let's check whether we can safely explicitly enable CGO (and whether we should)
	# https://github.com/golang/go/blob/go1.24.5/src/cmd/dist/build.go#L1779-L1792 ("cgoEnabled" map)
	# minus https://github.com/golang/go/blob/go1.24.5/src/cmd/dist/build.go#L1822-L1830 ("broken" map)
	# (we could use "--dist-tool" to pre-compile the "dist" tool to then use "dist list -json" to get "CgoSupported" instead of hard-coding this list, but then we need something that can parse JSON too, and all that just feels like way too much just to get this list of platforms which should enable CGO by default -Tianon)
	# $ go tool dist list -json | jq -r 'map(select(.CgoSupported and .GOOS == "linux") | .GOOS + "/" + .GOARCH) | (map(length) | max) as $max | map(. + (" " * ($max - length))) | join(" |\\\n") + " )"'
	case "$GOOS/$GOARCH" in
		linux/386      |\
		linux/amd64    |\
		linux/arm      |\
		linux/arm64    |\
		linux/loong64  |\
		linux/mips     |\
		linux/mips64   |\
		linux/mips64le |\
		linux/mipsle   |\
		linux/ppc64le  |\
		linux/riscv64  |\
		linux/s390x    )
			if eval 'test -n "${CC_FOR_'"${GOOS}_${GOARCH}"':-}" && "${CC_FOR_'"${GOOS}_${GOARCH}"'}" --version > /dev/null'; then
				export CGO_ENABLED=1
			fi
			;;
	esac
fi

exec "$@"
