val 0.4.0

An arbitrary precision calculator language
Documentation
#!/usr/bin/env bash

set -euxo pipefail

VERSION=${REF#"refs/tags/"}
DIST=$(pwd)/dist

echo "Packaging val $VERSION for $TARGET..."

test -f Cargo.lock || cargo generate-lockfile

echo "Installing rust toolchain for $TARGET..."

CARGO=(cargo)
RUSTC=(rustc)

if [[ $TARGET == x86_64-pc-windows-gnu ]]; then
  TOOLCHAIN=stable-x86_64-pc-windows-gnu
  rustup toolchain install "$TOOLCHAIN"
  rustup target add "$TARGET" --toolchain "$TOOLCHAIN"
  CARGO=(cargo +"$TOOLCHAIN")
  RUSTC=(rustc +"$TOOLCHAIN")
else
  rustup target add "$TARGET"
fi

HOST=$("${RUSTC[@]}" -vV | sed -n 's/^host: //p')
FEATURES=()

if [[ $TARGET != "$HOST" ]]; then
  FEATURES=(--features force-cross)
fi

if [[ $TARGET == aarch64-unknown-linux-musl ]]; then
  export CC=aarch64-linux-gnu-gcc
fi

echo "Building val..."

RUSTFLAGS="--deny warnings --codegen target-feature=+crt-static $TARGET_RUSTFLAGS" \
  "${CARGO[@]}" build --bin val "${FEATURES[@]}" --target "$TARGET" --release

EXECUTABLE=target/$TARGET/release/val

if [[ $OS == windows-latest ]]; then
  EXECUTABLE=$EXECUTABLE.exe
fi

echo "Copying release files..."

mkdir dist

cp -r \
  "$EXECUTABLE" \
  Cargo.lock \
  Cargo.toml \
  LICENSE \
  README.md \
  "$DIST"

cd "$DIST"

echo "Creating release archive..."

case $OS in
  ubuntu-latest | macos-latest)
    ARCHIVE=val-$VERSION-$TARGET.tar.gz
    tar czf "$ARCHIVE" ./*
    echo "archive=$DIST/$ARCHIVE" >> "$GITHUB_OUTPUT"
    ;;
  windows-latest)
    ARCHIVE=val-$VERSION-$TARGET.zip
    7z a "$ARCHIVE" ./*
    echo "archive=$(pwd -W)/$ARCHIVE" >> "$GITHUB_OUTPUT"
    ;;
esac