148 lines
4.3 KiB
Bash
Executable File
148 lines
4.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Build fully static MUSL binary for caching_relay using Alpine Docker.
|
|
# Produces a truly portable binary with zero runtime dependencies.
|
|
# Adapted from c-relay's build_static.sh.
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
DOCKERFILE="$SCRIPT_DIR/Dockerfile.alpine-musl"
|
|
|
|
# Parse command line arguments
|
|
DEBUG_BUILD=false
|
|
TARGET_ARCH=""
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--debug)
|
|
DEBUG_BUILD=true
|
|
shift
|
|
;;
|
|
--arch)
|
|
if [[ -z "$2" ]]; then
|
|
echo "ERROR: --arch requires a value"
|
|
echo "Usage: $0 [--debug] [--arch <arm64|x86_64>]"
|
|
exit 1
|
|
fi
|
|
case "$2" in
|
|
arm64|x86_64)
|
|
TARGET_ARCH="$2"
|
|
;;
|
|
*)
|
|
echo "ERROR: Unsupported architecture '$2'"
|
|
echo "Supported values: arm64, x86_64"
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift 2
|
|
;;
|
|
*)
|
|
echo "ERROR: Unknown argument '$1'"
|
|
echo "Usage: $0 [--debug] [--arch <arm64|x86_64>]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$DEBUG_BUILD" = true ]; then
|
|
echo "=========================================="
|
|
echo "caching_relay MUSL Static Binary Builder (DEBUG MODE)"
|
|
echo "=========================================="
|
|
else
|
|
echo "=========================================="
|
|
echo "caching_relay MUSL Static Binary Builder (PRODUCTION MODE)"
|
|
echo "=========================================="
|
|
fi
|
|
echo "Project directory: $SCRIPT_DIR"
|
|
echo ""
|
|
|
|
if ! command -v docker &> /dev/null; then
|
|
echo "ERROR: Docker is not installed or not in PATH"
|
|
exit 1
|
|
fi
|
|
if ! docker info &> /dev/null; then
|
|
echo "ERROR: Docker daemon is not running or user not in docker group"
|
|
exit 1
|
|
fi
|
|
echo "Docker is available and running"
|
|
echo ""
|
|
|
|
# Detect host architecture
|
|
ARCH=$(uname -m)
|
|
case "$ARCH" in
|
|
x86_64) ARCH="x86_64";;
|
|
aarch64) ARCH="arm64";;
|
|
arm64) ARCH="arm64";;
|
|
esac
|
|
if [[ -n "$TARGET_ARCH" ]]; then
|
|
ARCH="$TARGET_ARCH"
|
|
echo "Using target architecture: $ARCH"
|
|
else
|
|
echo "Detected host architecture: $ARCH"
|
|
fi
|
|
echo ""
|
|
|
|
# nostr_core_lib is inside the c-relay-pg project root (one dir up from caching/).
|
|
# Copy it into the Docker build context (excluding .git and build artifacts).
|
|
NOSTR_CORE_DIR="$SCRIPT_DIR/../nostr_core_lib"
|
|
if [ ! -d "$NOSTR_CORE_DIR" ]; then
|
|
echo "ERROR: nostr_core_lib not found at $NOSTR_CORE_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
NEEDS_COPY=1
|
|
if [ -d "$SCRIPT_DIR/nostr_core_lib" ] && [ ! -L "$SCRIPT_DIR/nostr_core_lib" ]; then
|
|
# Already a real directory (e.g. from a previous run); assume it's good.
|
|
NEEDS_COPY=0
|
|
fi
|
|
if [ "$NEEDS_COPY" = "1" ]; then
|
|
echo "Copying nostr_core_lib into build context..."
|
|
rm -rf "$SCRIPT_DIR/nostr_core_lib"
|
|
mkdir -p "$SCRIPT_DIR/nostr_core_lib"
|
|
rsync -a --exclude='.git' --exclude='*.a' --exclude='*.o' \
|
|
--exclude='.venv*' --exclude='backups' --exclude='verify_*' \
|
|
--exclude='rewrite_mirror' --exclude='websocket_debug' \
|
|
"$NOSTR_CORE_DIR/" "$SCRIPT_DIR/nostr_core_lib/"
|
|
COPIED_NOSTR_CORE=1
|
|
fi
|
|
|
|
# Build args
|
|
BUILD_ARGS="--build-arg DEBUG_BUILD=$DEBUG_BUILD"
|
|
if [ "$ARCH" = "arm64" ] && [ "$(uname -m)" != "aarch64" ] && [ "$(uname -m)" != "arm64" ]; then
|
|
BUILD_ARGS="$BUILD_ARGS --platform linux/arm64"
|
|
fi
|
|
|
|
IMAGE_TAG="caching_relay_builder:latest"
|
|
|
|
echo "Building Docker image..."
|
|
docker build $BUILD_ARGS \
|
|
-f "$DOCKERFILE" \
|
|
-t "$IMAGE_TAG" \
|
|
"$SCRIPT_DIR" 2>&1
|
|
|
|
BUILD_RC=$?
|
|
|
|
# Clean up the copied nostr_core_lib to keep the project dir tidy.
|
|
if [ "${COPIED_NOSTR_CORE:-0}" = "1" ]; then
|
|
echo "Cleaning up copied nostr_core_lib from build context..."
|
|
rm -rf "$SCRIPT_DIR/nostr_core_lib"
|
|
fi
|
|
|
|
if [ $BUILD_RC -ne 0 ]; then
|
|
exit $BUILD_RC
|
|
fi
|
|
|
|
echo ""
|
|
echo "Extracting binary from image..."
|
|
# The output stage is FROM scratch with no CMD, so pass an empty command.
|
|
CONTAINER_ID=$(docker create "$IMAGE_TAG" "")
|
|
docker cp "$CONTAINER_ID:/caching_relay_static" "$SCRIPT_DIR/caching_relay"
|
|
docker rm "$CONTAINER_ID" >/dev/null
|
|
chmod +x "$SCRIPT_DIR/caching_relay"
|
|
|
|
echo ""
|
|
echo "=== Build complete ==="
|
|
ls -lh "$SCRIPT_DIR/caching_relay"
|
|
file "$SCRIPT_DIR/caching_relay"
|