197 lines
5.2 KiB
Bash
Executable File
197 lines
5.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# HMAC File Server v3.2 - Multi-Architecture Build Script
|
|
# Compiles binaries for AMD64, ARM64, and ARM32 architectures
|
|
|
|
# Remove set -e to prevent early exit on errors
|
|
|
|
# Colors for output
|
|
GREEN='\033[0;32m'
|
|
BLUE='\033[0;34m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m'
|
|
|
|
print_status() {
|
|
echo -e "${GREEN}[BUILD]${NC} $1"
|
|
}
|
|
|
|
print_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
print_arch() {
|
|
echo -e "${CYAN}[ARCH]${NC} $1"
|
|
}
|
|
|
|
# Check if Go is installed
|
|
if ! command -v go &> /dev/null; then
|
|
print_error "Go is not installed or not in PATH"
|
|
exit 1
|
|
fi
|
|
|
|
# Create temp directory if it doesn't exist
|
|
TEMP_DIR="./temp"
|
|
if [[ ! -d "$TEMP_DIR" ]]; then
|
|
mkdir -p "$TEMP_DIR"
|
|
print_info "Created temp directory: $TEMP_DIR"
|
|
fi
|
|
|
|
# Source files to compile
|
|
SOURCE_FILES="cmd/server/main.go cmd/server/helpers.go cmd/server/config_validator.go cmd/server/config_test_scenarios.go"
|
|
|
|
print_status "Starting multi-architecture build for HMAC File Server v3.2"
|
|
print_info "Source files: $SOURCE_FILES"
|
|
print_info "Output directory: $TEMP_DIR"
|
|
echo ""
|
|
|
|
# Build function
|
|
build_for_arch() {
|
|
local goos=$1
|
|
local goarch=$2
|
|
local output_name=$3
|
|
local arch_description=$4
|
|
|
|
print_arch "Building for $arch_description ($goos/$goarch)..."
|
|
|
|
# Set environment variables for cross-compilation
|
|
export GOOS=$goos
|
|
export GOARCH=$goarch
|
|
export CGO_ENABLED=0
|
|
|
|
# Build the binary
|
|
if go build -ldflags="-w -s" -o "$TEMP_DIR/$output_name" $SOURCE_FILES 2>/dev/null; then
|
|
# Get file size
|
|
if [[ "$OSTYPE" == "darwin"* ]]; then
|
|
# macOS
|
|
SIZE=$(stat -f%z "$TEMP_DIR/$output_name" | awk '{printf "%.1fMB", $1/1024/1024}')
|
|
else
|
|
# Linux
|
|
SIZE=$(stat -c%s "$TEMP_DIR/$output_name" | awk '{printf "%.1fMB", $1/1024/1024}')
|
|
fi
|
|
|
|
print_status "Build successful: $arch_description"
|
|
print_info " Binary: $TEMP_DIR/$output_name"
|
|
print_info " Size: $SIZE"
|
|
|
|
# Test binary (version check)
|
|
if timeout 10s "$TEMP_DIR/$output_name" --version >/dev/null 2>&1; then
|
|
print_info " Version check: PASSED"
|
|
else
|
|
print_warning " Version check: SKIPPED (cross-compiled binary)"
|
|
fi
|
|
|
|
return 0
|
|
else
|
|
print_error "Build failed: $arch_description"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Track build results
|
|
BUILDS_ATTEMPTED=0
|
|
BUILDS_SUCCESSFUL=0
|
|
FAILED_BUILDS=()
|
|
|
|
echo "Starting builds..."
|
|
echo "===================="
|
|
echo ""
|
|
|
|
# Build for AMD64 (x86_64)
|
|
print_arch "AMD64 (Intel/AMD 64-bit)"
|
|
((BUILDS_ATTEMPTED++))
|
|
if build_for_arch "linux" "amd64" "hmac-file-server-linux-amd64" "AMD64 Linux"; then
|
|
((BUILDS_SUCCESSFUL++))
|
|
else
|
|
FAILED_BUILDS+=("AMD64")
|
|
fi
|
|
echo ""
|
|
|
|
# Build for ARM64 (AArch64)
|
|
print_arch "ARM64 (AArch64)"
|
|
((BUILDS_ATTEMPTED++))
|
|
if build_for_arch "linux" "arm64" "hmac-file-server-linux-arm64" "ARM64 Linux"; then
|
|
((BUILDS_SUCCESSFUL++))
|
|
else
|
|
FAILED_BUILDS+=("ARM64")
|
|
fi
|
|
echo ""
|
|
|
|
# Build for ARM32 (ARMv7)
|
|
print_arch "ARM32 (ARMv7)"
|
|
export GOARM=7 # ARMv7 with hardware floating point
|
|
((BUILDS_ATTEMPTED++))
|
|
if build_for_arch "linux" "arm" "hmac-file-server-linux-arm32" "ARM32 Linux"; then
|
|
((BUILDS_SUCCESSFUL++))
|
|
else
|
|
FAILED_BUILDS+=("ARM32")
|
|
fi
|
|
echo ""
|
|
|
|
# Reset environment variables
|
|
unset GOOS GOARCH CGO_ENABLED GOARM
|
|
|
|
# Build summary
|
|
echo "Build Summary"
|
|
echo "================"
|
|
print_info "Builds attempted: $BUILDS_ATTEMPTED"
|
|
print_info "Builds successful: $BUILDS_SUCCESSFUL"
|
|
|
|
if [[ $BUILDS_SUCCESSFUL -eq $BUILDS_ATTEMPTED ]]; then
|
|
print_status "ALL BUILDS SUCCESSFUL!"
|
|
echo ""
|
|
print_info "Generated binaries in $TEMP_DIR:"
|
|
ls -lh "$TEMP_DIR"/hmac-file-server-* | while read -r line; do
|
|
echo " $line"
|
|
done
|
|
echo ""
|
|
print_info "Usage examples:"
|
|
echo " - Copy to target system and run: ./hmac-file-server-linux-amd64 --version"
|
|
echo " - Deploy with installer: cp temp/hmac-file-server-linux-amd64 /opt/hmac-file-server/"
|
|
echo " - Docker deployment: COPY temp/hmac-file-server-linux-amd64 /usr/local/bin/"
|
|
|
|
elif [[ $BUILDS_SUCCESSFUL -gt 0 ]]; then
|
|
print_warning "PARTIAL SUCCESS: $BUILDS_SUCCESSFUL/$BUILDS_ATTEMPTED builds completed"
|
|
if [[ ${#FAILED_BUILDS[@]} -gt 0 ]]; then
|
|
print_error "Failed architectures: ${FAILED_BUILDS[*]}"
|
|
fi
|
|
|
|
else
|
|
print_error "ALL BUILDS FAILED!"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
print_info "Architecture compatibility:"
|
|
echo " - AMD64: Intel/AMD 64-bit servers, desktops, cloud instances"
|
|
echo " - ARM64: Apple Silicon, AWS Graviton, modern ARM servers"
|
|
echo " - ARM32: Raspberry Pi, embedded systems, older ARM devices"
|
|
|
|
echo ""
|
|
print_status "Multi-architecture build completed!"
|
|
|
|
# Final verification
|
|
echo ""
|
|
print_info "Final verification:"
|
|
for binary in "$TEMP_DIR"/hmac-file-server-*; do
|
|
if [[ -f "$binary" ]]; then
|
|
filename=$(basename "$binary")
|
|
if file "$binary" >/dev/null 2>&1; then
|
|
file_info=$(file "$binary" | cut -d: -f2- | sed 's/^ *//')
|
|
print_info " OK $filename: $file_info"
|
|
else
|
|
print_info " OK $filename: Binary file"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
exit 0
|