#!/bin/bash # Copyright (c) Tailscale Inc & AUTHORS # SPDX-License-Identifier: BSD-3-Clause set -eo pipefail if [[ "${CI:-}" == "true" && "${NOBASHDEBUG:-}" != "true" ]]; then set -x fi tsandroid=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )/.." &> /dev/null && pwd ) # Allow TOOLCHAINDIR to be overridden, as a special case for the fdroid build if [[ -z "${TOOLCHAINDIR}" ]]; then toolchain="$HOME/.cache/tailscale-go" if [[ -d "$toolchain" ]]; then # A toolchain exists, but is it recent enough to compile gocross? If not, # wipe it out so that the next if block fetches a usable one. want_go_minor=$(grep -E '^go ' "go.mod" | cut -f2 -d'.') have_go_minor="" if [[ -f "$toolchain/VERSION" ]]; then have_go_minor=$(head -1 "$toolchain/VERSION" | cut -f2 -d'.') fi # Shortly before stable releases, we run release candidate # toolchains, which have a non-numeric suffix on the version # number. Remove the rc qualifier, we just care about the minor # version. have_go_minor="${have_go_minor%rc*}" if [[ -z "$have_go_minor" || "$have_go_minor" -lt "$want_go_minor" ]]; then rm -rf "$toolchain" "$toolchain.extracted" fi fi REV="$(<${tsandroid}/go.toolchain.rev)" EREV="" [[ -f ${toolchain}.extracted ]] && EREV="$(<${toolchain}.extracted)" if [[ ! -d "$toolchain" || "$EREV" != "$REV" ]]; then mkdir -p "$HOME/.cache" case "$REV" in /*) toolchain="$REV" ;; *) # This works for linux and darwin, which is sufficient # (we do not build tailscale-go for other targets). HOST_OS=$(uname -s | tr A-Z a-z) HOST_ARCH="$(uname -m)" if [[ "$HOST_ARCH" == "aarch64" ]]; then # Go uses the name "arm64". HOST_ARCH="arm64" elif [[ "$HOST_ARCH" == "x86_64" ]]; then # Go uses the name "amd64". HOST_ARCH="amd64" fi rm -rf "$toolchain" "$toolchain.extracted" curl -f -L -o "$toolchain.tar.gz" "https://github.com/tailscale/go/releases/download/build-${REV}/${HOST_OS}-${HOST_ARCH}.tar.gz" mkdir -p "$toolchain" (cd "$toolchain" && tar --strip-components=1 -xf "$toolchain.tar.gz") echo "$REV" >"$toolchain.extracted" rm -f "$toolchain.tar.gz" ;; esac fi else # fdroid supplies its own toolchain, rather than using ours. toolchain="${TOOLCHAINDIR}" fi exec "${toolchain}/bin/go" "$@"