diff --git a/build-compact.sh b/build-compact.sh new file mode 100755 index 0000000..e1c722e --- /dev/null +++ b/build-compact.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# Compact Build Script for fps-go-brr +# Based on techniques from: https://words.filippo.io/shrink-your-go-binaries-with-this-one-weird-trick/ +# +# This script builds a space-optimized version of the fps-go-brr binary using: +# 1. Go linker flags to strip debugging information (-s -w) +# 2. UPX compression (if available) + +set -e + +BINARY_NAME="fps-go-brr" +COMPACT_BINARY_NAME="fps-go-brr-compact" + +echo "Building compact version of $BINARY_NAME..." + +# Step 1: Build with linker flags to strip debugging info +echo "Step 1: Building with -ldflags='-s -w' to strip debugging information..." +go build -ldflags="-s -w" -o "$COMPACT_BINARY_NAME" . + +# Get initial size +INITIAL_SIZE=$(stat -c%s "$COMPACT_BINARY_NAME" 2>/dev/null || stat -f%z "$COMPACT_BINARY_NAME" 2>/dev/null || echo "unknown") +echo "Binary size after stripping: $INITIAL_SIZE bytes" + +# Step 2: Apply UPX compression if available +if command -v upx >/dev/null 2>&1; then + echo "Step 2: Applying UPX compression with --brute flag..." + upx --brute "$COMPACT_BINARY_NAME" + + # Get final size + FINAL_SIZE=$(stat -c%s "$COMPACT_BINARY_NAME" 2>/dev/null || stat -f%z "$COMPACT_BINARY_NAME" 2>/dev/null || echo "unknown") + echo "Final binary size after UPX compression: $FINAL_SIZE bytes" + + if [ "$INITIAL_SIZE" != "unknown" ] && [ "$FINAL_SIZE" != "unknown" ]; then + REDUCTION=$(echo "scale=1; (1 - $FINAL_SIZE / $INITIAL_SIZE) * 100" | bc -l 2>/dev/null || echo "N/A") + echo "Total size reduction: ~${REDUCTION}%" + fi +else + echo "Step 2: UPX not found - skipping compression" + echo "To install UPX:" + echo " - Ubuntu/Debian: sudo apt install upx-ucl" + echo " - macOS: brew install upx" + echo " - Arch Linux: sudo pacman -S upx" + echo " - Or download from: https://upx.github.io/" +fi + +echo "" +echo "Compact build complete: $COMPACT_BINARY_NAME" +echo "" +echo "Note: The compact binary may have slightly slower startup time due to UPX decompression." +echo "For production use, consider whether the size savings are worth the startup overhead." + +# Make the script executable +chmod +x "$COMPACT_BINARY_NAME" + +# Compare with regular build if it exists +if [ -f "$BINARY_NAME" ]; then + REGULAR_SIZE=$(stat -c%s "$BINARY_NAME" 2>/dev/null || stat -f%z "$BINARY_NAME" 2>/dev/null || echo "unknown") + if [ "$REGULAR_SIZE" != "unknown" ] && [ "$FINAL_SIZE" != "unknown" ]; then + TOTAL_REDUCTION=$(echo "scale=1; (1 - $FINAL_SIZE / $REGULAR_SIZE) * 100" | bc -l 2>/dev/null || echo "N/A") + echo "Comparison with regular build:" + echo " Regular build: $REGULAR_SIZE bytes" + echo " Compact build: $FINAL_SIZE bytes" + echo " Total reduction: ~${TOTAL_REDUCTION}%" + fi +fi \ No newline at end of file