blob: 03d8d74e9f520bd3b57e73e7cf9363a034cbcecf [file] [log] [blame]
#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This script sets the go version used by all Beam SDK scripts.
# It requires an existing Go installation greater than 1.16 on the system, which
# will be used to download specific versions of Go.
#
# The Go installation will use the local host platform, while the actual
# go command will use the set GOOS and GOARCH env variables.
#
# Accepts the following optional flags, after which all following parameters
# will be provided to the go version tool.
# --version -> A string for a fully qualified go version, eg go1.16.5 or go1.18beta1
# The list of available versions are at https://go.dev/dl/
# --gocmd -> a specific path to a Go command to execute. If present, ignores --version flag
# and avoids doing the download check step.
set -e
# The specific Go version used by default for Beam infrastructure.
#
# This variable is also used as the execution command downscript.
# The list of downloadable versions are at https://go.dev/dl/
GOVERS=go1.21.8
if ! command -v go &> /dev/null
then
echo "go could not be found. This script requires a go installation > 1.16 to bootstrap using specific go versions."
exit 1
fi
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--version)
GOVERS="$2"
shift # past argument
shift # past value
;;
--gocmd)
GOCMD="$2"
shift # past argument
shift # past value
;;
*) # unknown options are go tool args.
break
;;
esac
done
GOPATH=`go env GOPATH`
GOBIN=$GOPATH/bin
GOHOSTOS=`go env GOHOSTOS`
GOHOSTARCH=`go env GOHOSTARCH`
# Check if we've already prepared the Go command. If so, then we don't need to
# do the download and versioning check.
if [ -z "$GOCMD" ] ; then
# Outputing the system Go version for debugging purposes.
echo "System Go installation: `which go` is `go version`; Preparing to use $GOBIN/$GOVERS"
# Ensure it's installed in the GOBIN directory, using the local host platform.
GOOS=$GOHOSTOS GOARCH=$GOHOSTARCH GOBIN=$GOBIN go install golang.org/dl/$GOVERS@latest
LOCKFILE=$GOBIN/$GOVERS.lock
# The download command isn't concurrency safe so we get an exclusive lock, without wait.
# If we're first, we ensure the command is downloaded, releasing the lock afterwards.
# This operation is cached on system and won't be re-downloaded at least.
flock --exclusive --nonblock --conflict-exit-code 0 $LOCKFILE $GOBIN/$GOVERS download
# Execute the script with the remaining arguments.
# We get a shared lock for the ordinary go command execution.
echo $GOBIN/$GOVERS $@
flock --shared --timeout=10 $LOCKFILE $GOBIN/$GOVERS $@
else
# Minor TODO: Figure out if we can pull out the GOCMD env variable after goPrepare
# completion, and avoid this brittle GOBIN substitution.
GOCMD=${GOCMD/GOBIN/$GOBIN}
echo $GOCMD $@
CGO_ENABLED=0 $GOCMD $@
fi