Reticulum-Go/scripts/ci/setup-swift.sh

109 lines
2.5 KiB
Bash
Executable file

#!/bin/sh
# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2024-2026 Quad4.io
#
# Install a pinned Swift toolchain for CI. Usage:
# sh scripts/ci/setup-swift.sh [version] [install_dir]
# Example version: 6.0.3
set -eu
SWIFT_VERSION="${1:-${CI_SWIFT_VERSION:-6.0.3}}"
INSTALL_DIR="${2:-${SWIFT_INSTALL_DIR:-$HOME/.local/swift}}"
ARCH="$(uname -m)"
case "$ARCH" in
x86_64|amd64)
ASSET_ARCH=x86_64
;;
aarch64|arm64)
ASSET_ARCH=aarch64
;;
*)
echo "unsupported arch: $ARCH" >&2
exit 1
;;
esac
OS="$(uname -s)"
case "$OS" in
Linux)
;;
*)
echo "unsupported OS for CI Swift setup: $OS" >&2
exit 1
;;
esac
# os-release defines VERSION and would overwrite SWIFT_VERSION if named VERSION.
. /etc/os-release 2>/dev/null || true
case "${VERSION_ID:-}" in
24.04*)
PLATFORM=ubuntu2404
ASSET_OS=ubuntu24.04
;;
22.04*)
PLATFORM=ubuntu2204
ASSET_OS=ubuntu22.04
;;
20.04*)
PLATFORM=ubuntu2004
ASSET_OS=ubuntu20.04
;;
*)
# GitHub ubuntu-latest is currently 24.04-class. Fall back.
PLATFORM=ubuntu2404
ASSET_OS=ubuntu24.04
echo "warning: unknown VERSION_ID=${VERSION_ID:-}, using ${PLATFORM}" >&2
;;
esac
# Allow override for non-Ubuntu hosts testing against a glibc-compatible toolchain.
PLATFORM="${SWIFT_PLATFORM:-$PLATFORM}"
ASSET_OS="${SWIFT_ASSET_OS:-$ASSET_OS}"
if [ "$ASSET_ARCH" = aarch64 ]; then
case "$PLATFORM" in
*-aarch64) ;;
*) PLATFORM="${PLATFORM}-aarch64" ;;
esac
case "$ASSET_OS" in
*-aarch64) ;;
*) ASSET_OS="${ASSET_OS}-aarch64" ;;
esac
fi
ASSET="swift-${SWIFT_VERSION}-RELEASE-${ASSET_OS}.tar.gz"
URL="https://download.swift.org/swift-${SWIFT_VERSION}-release/${PLATFORM}/swift-${SWIFT_VERSION}-RELEASE/${ASSET}"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
echo "Downloading $URL"
curl -fsSL "$URL" -o "$TMP/swift.tar.gz"
mkdir -p "$INSTALL_DIR"
tar -xzf "$TMP/swift.tar.gz" -C "$TMP"
FOUND="$(find "$TMP" \( -type f -o -type l \) -name swift | head -n 1)"
if [ -z "$FOUND" ]; then
echo "swift binary not found in archive" >&2
exit 1
fi
SRC_DIR="$(CDPATH='' cd -- "$(dirname "$FOUND")/.." && pwd)"
rm -rf "$INSTALL_DIR"
mkdir -p "$(dirname "$INSTALL_DIR")"
cp -a "$SRC_DIR" "$INSTALL_DIR"
BIN_DIR="${GITHUB_PATH_DIR:-$HOME/.local/bin}"
mkdir -p "$BIN_DIR"
ln -sfn "$INSTALL_DIR/usr/bin/swift" "$BIN_DIR/swift"
ln -sfn "$INSTALL_DIR/usr/bin/swiftc" "$BIN_DIR/swiftc"
if [ -n "${GITHUB_PATH:-}" ]; then
echo "$BIN_DIR" >>"$GITHUB_PATH"
echo "$INSTALL_DIR/usr/bin" >>"$GITHUB_PATH"
fi
export PATH="$INSTALL_DIR/usr/bin:$BIN_DIR:$PATH"
echo "Swift installed: $(command -v swift)"
swift --version | head -n 2