165 lines
5.1 KiB
Bash
Executable File
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 "=========================================="
|