Anki/qt/launcher/lin/build.sh
2025-06-22 21:52:44 +07:00

87 lines
2.9 KiB
Bash
Executable file

#!/bin/bash
#
# This script currently only supports universal builds on x86_64.
#
set -e
# Add Linux cross-compilation target
rustup target add aarch64-unknown-linux-gnu
# Detect host architecture
HOST_ARCH=$(uname -m)
# Define output paths
OUTPUT_DIR="../../../out/launcher"
LAUNCHER_DIR="$OUTPUT_DIR/anki-launcher"
# Clean existing output directory
rm -rf "$LAUNCHER_DIR"
# Build binaries based on host architecture
if [ "$HOST_ARCH" = "aarch64" ]; then
# On aarch64 host, only build for aarch64
cargo build -p launcher --release --target aarch64-unknown-linux-gnu
else
# On other hosts, build for both architectures
cargo build -p launcher --release --target x86_64-unknown-linux-gnu
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc \
cargo build -p launcher --release --target aarch64-unknown-linux-gnu
# Extract uv_lin_arm for cross-compilation
(cd ../../.. && ./ninja extract:uv_lin_arm)
fi
# Create output directory
mkdir -p "$LAUNCHER_DIR"
# Copy binaries and support files
TARGET_DIR=${CARGO_TARGET_DIR:-../../../target}
# Copy binaries with architecture suffixes
if [ "$HOST_ARCH" = "aarch64" ]; then
# On aarch64 host, copy arm64 binary to both locations
cp "$TARGET_DIR/aarch64-unknown-linux-gnu/release/launcher" "$LAUNCHER_DIR/launcher.amd64"
cp "$TARGET_DIR/aarch64-unknown-linux-gnu/release/launcher" "$LAUNCHER_DIR/launcher.arm64"
# Copy uv binary to both locations
cp "../../../out/extracted/uv/uv" "$LAUNCHER_DIR/uv.amd64"
cp "../../../out/extracted/uv/uv" "$LAUNCHER_DIR/uv.arm64"
else
# On other hosts, copy architecture-specific binaries
cp "$TARGET_DIR/x86_64-unknown-linux-gnu/release/launcher" "$LAUNCHER_DIR/launcher.amd64"
cp "$TARGET_DIR/aarch64-unknown-linux-gnu/release/launcher" "$LAUNCHER_DIR/launcher.arm64"
cp "../../../out/extracted/uv/uv" "$LAUNCHER_DIR/uv.amd64"
cp "../../../out/extracted/uv_lin_arm/uv" "$LAUNCHER_DIR/uv.arm64"
fi
# Copy support files from lin directory
for file in README.md anki.1 anki.desktop anki.png anki.xml anki.xpm install.sh uninstall.sh anki; do
cp "$file" "$LAUNCHER_DIR/"
done
# Copy additional files from parent directory
cp ../pyproject.toml "$LAUNCHER_DIR/"
cp ../../../.python-version "$LAUNCHER_DIR/"
# Set executable permissions
chmod +x \
"$LAUNCHER_DIR/anki" \
"$LAUNCHER_DIR/launcher.amd64" \
"$LAUNCHER_DIR/launcher.arm64" \
"$LAUNCHER_DIR/uv.amd64" \
"$LAUNCHER_DIR/uv.arm64" \
"$LAUNCHER_DIR/install.sh" \
"$LAUNCHER_DIR/uninstall.sh"
# Set proper permissions and create tarball
chmod -R a+r "$LAUNCHER_DIR"
# Create tarball using the same options as the Rust template
ZSTD="zstd -c --long -T0 -18"
TRANSFORM="s%^.%anki-launcher%S"
TARBALL="$OUTPUT_DIR/anki-launcher.tar.zst"
tar -I "$ZSTD" --transform "$TRANSFORM" -cf "$TARBALL" -C "$LAUNCHER_DIR" .
echo "Build complete:"
echo "Universal launcher: $LAUNCHER_DIR"
echo "Tarball: $TARBALL"