Files
didactyl/deploy_local.sh

165 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# Build the didactyl static binary and install it to /usr/local/bin/didactyl
# Usage:
# ./deploy_local.sh # Release build + install
# ./deploy_local.sh --debug # Debug build + install
# ./deploy_local.sh --no-build # Install existing binary without rebuilding
# ./deploy_local.sh --platform=linux/arm64 # Cross-compile + install
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_PREFIX="/usr/local"
INSTALL_TARGET="${INSTALL_PREFIX}/bin/didactyl"
# Parse command line arguments
DEBUG_BUILD=false
SKIP_BUILD=false
TARGET_PLATFORM=""
for arg in "$@"; do
case "$arg" in
--debug)
DEBUG_BUILD=true
;;
--no-build)
SKIP_BUILD=true
;;
--platform=*)
TARGET_PLATFORM="${arg#*=}"
;;
-h|--help)
echo "Usage: $0 [--debug] [--no-build] [--platform=linux/amd64|linux/arm64]"
echo ""
echo "Options:"
echo " --debug Build with debug symbols"
echo " --no-build Skip build; install an existing binary"
echo " --platform=<platform> Cross-compile for the given platform"
echo " -h, --help Show this help message"
exit 0
;;
*)
echo "ERROR: Unknown argument: $arg"
echo "Run '$0 --help' for usage."
exit 1
;;
esac
done
# Determine which built binary to install
ARCH=$(uname -m)
case "$ARCH" in
x86_64) DEFAULT_OUTPUT_NAME="didactyl_static_x86_64" ;;
aarch64|arm64) DEFAULT_OUTPUT_NAME="didactyl_static_arm64" ;;
armv7l) DEFAULT_OUTPUT_NAME="didactyl_static_armv7" ;;
armv6l) DEFAULT_OUTPUT_NAME="didactyl_static_armv6" ;;
*) DEFAULT_OUTPUT_NAME="didactyl_static_${ARCH}" ;;
esac
# Override output name when an explicit target platform is given
if [ -n "$TARGET_PLATFORM" ]; then
case "$TARGET_PLATFORM" in
linux/amd64) OUTPUT_NAME="didactyl_static_x86_64" ;;
linux/arm64) OUTPUT_NAME="didactyl_static_arm64" ;;
linux/arm/v7) OUTPUT_NAME="didactyl_static_armv7" ;;
linux/arm/v6) OUTPUT_NAME="didactyl_static_armv6" ;;
*) OUTPUT_NAME="didactyl_static_custom" ;;
esac
else
OUTPUT_NAME="$DEFAULT_OUTPUT_NAME"
fi
if [ "$DEBUG_BUILD" = true ]; then
OUTPUT_NAME="${OUTPUT_NAME}_debug"
fi
SOURCE_BINARY="$SCRIPT_DIR/$OUTPUT_NAME"
echo "=========================================="
echo " Didactyl Local Deploy"
echo "=========================================="
echo "Source binary: $SOURCE_BINARY"
echo "Install target: $INSTALL_TARGET"
echo "Debug build: $DEBUG_BUILD"
echo "Skip build: $SKIP_BUILD"
[ -n "$TARGET_PLATFORM" ] && echo "Target platform: $TARGET_PLATFORM"
echo ""
# Build the binary unless explicitly skipped
if [ "$SKIP_BUILD" = false ]; then
BUILD_ARGS=""
if [ "$DEBUG_BUILD" = true ]; then
BUILD_ARGS="--debug"
fi
if [ -n "$TARGET_PLATFORM" ]; then
BUILD_ARGS="$BUILD_ARGS --platform=$TARGET_PLATFORM"
fi
echo "Building static binary..."
"$SCRIPT_DIR/build_static.sh" $BUILD_ARGS
echo ""
else
echo "Skipping build (--no-build)"
echo ""
fi
# Verify the source binary exists
if [ ! -f "$SOURCE_BINARY" ]; then
echo "ERROR: Binary not found at $SOURCE_BINARY"
echo ""
if [ "$SKIP_BUILD" = true ]; then
echo "Run '$0' (without --no-build) to build it first."
else
echo "The build may have failed or produced a differently named binary."
echo "Available didactyl_static_* binaries in $SCRIPT_DIR:"
ls -1 "$SCRIPT_DIR"/didactyl_static_* 2>/dev/null || echo " (none found)"
fi
exit 1
fi
# Make sure the source binary is executable
chmod +x "$SOURCE_BINARY"
# Choose an install command (need root for /usr/local/bin)
INSTALL_CMD="install -m 0755"
if [ ! -w "${INSTALL_PREFIX}/bin" ] && [ "$(id -u)" -ne 0 ]; then
if command -v sudo >/dev/null 2>&1; then
INSTALL_CMD="sudo install -m 0755"
else
echo "ERROR: Cannot write to ${INSTALL_PREFIX}/bin and sudo is not available."
echo "Re-run this script as root or with sudo."
exit 1
fi
fi
echo "Installing $SOURCE_BINARY -> $INSTALL_TARGET"
$INSTALL_CMD "$SOURCE_BINARY" "$INSTALL_TARGET"
# Verify the install
if [ ! -x "$INSTALL_TARGET" ]; then
echo "ERROR: Install verification failed: $INSTALL_TARGET is not executable"
exit 1
fi
echo ""
echo "Binary info:"
file "$INSTALL_TARGET"
ls -lh "$INSTALL_TARGET"
echo ""
# Quick smoke test: print version/help if the binary supports it
echo "Smoke test: $INSTALL_TARGET --help"
if "$INSTALL_TARGET" --help >/dev/null 2>&1; then
echo "✓ Binary runs successfully"
else
echo "⚠ '$INSTALL_TARGET --help' returned non-zero (may be normal if --help is unsupported)"
fi
echo ""
echo "=========================================="
echo " LOCAL DEPLOYMENT COMPLETE"
echo "=========================================="
echo "Installed: $INSTALL_TARGET"
echo "Run with: didactyl"
echo "=========================================="