| #!/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 |