build-all-platforms.sh raw

   1  #!/bin/bash
   2  
   3  # Multi-platform build script for ORLY relay
   4  # Builds binaries for Linux, macOS, Windows, and Android
   5  # NOTE: All builds use CGO_ENABLED=0 since p8k library uses purego (not CGO)
   6  #       The library dynamically loads libsecp256k1 at runtime via purego
   7  
   8  set -e
   9  
  10  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  11  REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
  12  cd "$REPO_ROOT"
  13  
  14  # Colors for output
  15  RED='\033[0;31m'
  16  GREEN='\033[0;32m'
  17  YELLOW='\033[1;33m'
  18  BLUE='\033[0;34m'
  19  NC='\033[0m' # No Color
  20  
  21  # Configuration
  22  VERSION=$(cat pkg/version/version)
  23  OUTPUT_DIR="$REPO_ROOT/build"
  24  NOSTR_REPO_BASE_URL="https://git.nostrdev.com/mleku/nostr/raw/branch/main/crypto/p8k"
  25  
  26  echo -e "${BLUE}========================================${NC}"
  27  echo -e "${BLUE}ORLY Multi-Platform Build Script${NC}"
  28  echo -e "${BLUE}========================================${NC}"
  29  echo -e "Version: ${GREEN}${VERSION}${NC}"
  30  echo -e "Output directory: ${OUTPUT_DIR}"
  31  echo -e "${BLUE}Build mode: Pure Go with purego${NC}"
  32  echo ""
  33  
  34  # Create output directory
  35  mkdir -p "$OUTPUT_DIR"
  36  
  37  # Function to build for a specific platform
  38  build_platform() {
  39      local goos=$1
  40      local goarch=$2
  41      local platform_name=$3
  42      local binary_ext=$4
  43      
  44      echo -e "${YELLOW}Building for ${platform_name} (pure Go + purego)...${NC}"
  45      
  46      local output_name="orly-${VERSION}-${platform_name}${binary_ext}"
  47      local output_path="${OUTPUT_DIR}/${output_name}"
  48      
  49      # Build with CGO_ENABLED=0 (pure Go with purego)
  50      if CGO_ENABLED=0 GOOS=$goos GOARCH=$goarch \
  51          go build -ldflags "-s -w -X main.version=${VERSION}" \
  52          -o "${output_path}" . 2>&1; then
  53          
  54          echo -e "${GREEN}✓ Built: ${output_name}${NC}"
  55          
  56          # Download appropriate runtime library from nostr repository
  57          case "$goos" in
  58              linux)
  59                  if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.so" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"; then
  60                      chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"
  61                      echo -e "${GREEN}  ✓ Downloaded libsecp256k1.so (runtime optional)${NC}"
  62                  else
  63                      echo -e "${YELLOW}  ⚠ Failed to download libsecp256k1.so (runtime optional)${NC}"
  64                  fi
  65                  ;;
  66              darwin)
  67                  if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.dylib" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dylib"; then
  68                      chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dylib"
  69                      echo -e "${GREEN}  ✓ Downloaded libsecp256k1.dylib (runtime optional)${NC}"
  70                  else
  71                      echo -e "${YELLOW}  ⚠ Failed to download libsecp256k1.dylib (runtime optional)${NC}"
  72                  fi
  73                  ;;
  74              windows)
  75                  if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.dll" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dll"; then
  76                      chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.dll"
  77                      echo -e "${GREEN}  ✓ Downloaded libsecp256k1.dll (runtime optional)${NC}"
  78                  else
  79                      echo -e "${YELLOW}  ⚠ Failed to download libsecp256k1.dll (runtime optional)${NC}"
  80                  fi
  81                  ;;
  82              android)
  83                  if wget -q "${NOSTR_REPO_BASE_URL}/libsecp256k1.so" -O "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"; then
  84                      chmod +x "${OUTPUT_DIR}/libsecp256k1-${platform_name}.so"
  85                      echo -e "${GREEN}  ✓ Downloaded libsecp256k1.so (runtime optional)${NC}"
  86                  else
  87                      echo -e "${YELLOW}  ⚠ Failed to download libsecp256k1.so (runtime optional)${NC}"
  88                  fi
  89                  ;;
  90          esac
  91          
  92          # Create SHA256 checksum
  93          (cd "$OUTPUT_DIR" && sha256sum "$output_name" >> "SHA256SUMS-${VERSION}.txt")
  94          
  95          return 0
  96      else
  97          echo -e "${RED}✗ Failed to build for ${platform_name}${NC}"
  98          return 1
  99      fi
 100  }
 101  
 102  # Clean old builds
 103  echo -e "${BLUE}Cleaning old builds...${NC}"
 104  rm -f "${OUTPUT_DIR}/orly-"* "${OUTPUT_DIR}/libsecp256k1-"* "${OUTPUT_DIR}/SHA256SUMS-"*
 105  echo ""
 106  
 107  echo -e "${BLUE}Note: Pure Go builds work on all platforms${NC}"
 108  echo -e "${BLUE}      libsecp256k1 is loaded at runtime if available (faster)${NC}"
 109  echo -e "${BLUE}      Falls back to pure Go p256k1 if library not found${NC}"
 110  echo ""
 111  
 112  # Build for each platform
 113  echo -e "${BLUE}Starting builds...${NC}"
 114  echo ""
 115  
 116  # Linux AMD64
 117  build_platform "linux" "amd64" "linux-amd64" "" || true
 118  
 119  # Linux ARM64
 120  build_platform "linux" "arm64" "linux-arm64" "" || true
 121  
 122  # macOS AMD64 (Intel)
 123  build_platform "darwin" "amd64" "darwin-amd64" "" || true
 124  
 125  # macOS ARM64 (Apple Silicon)
 126  build_platform "darwin" "arm64" "darwin-arm64" "" || true
 127  
 128  # Windows AMD64
 129  build_platform "windows" "amd64" "windows-amd64" ".exe" || true
 130  
 131  # Android builds
 132  echo -e "${BLUE}Building for Android...${NC}"
 133  
 134  # Android ARM64
 135  build_platform "android" "arm64" "android-arm64" "" || true
 136  
 137  # Android AMD64
 138  build_platform "android" "amd64" "android-amd64" "" || true
 139  
 140  echo ""
 141  echo -e "${BLUE}========================================${NC}"
 142  echo -e "${GREEN}Build Summary${NC}"
 143  echo -e "${BLUE}========================================${NC}"
 144  echo ""
 145  
 146  # List all built binaries
 147  if ls "${OUTPUT_DIR}"/orly-* 1> /dev/null 2>&1; then
 148      echo -e "${GREEN}Built binaries:${NC}"
 149      ls -lh "${OUTPUT_DIR}"/orly-* | awk '{print "  " $9 " (" $5 ")"}'
 150      echo ""
 151      
 152      if [ -f "${OUTPUT_DIR}/SHA256SUMS-${VERSION}.txt" ]; then
 153          echo -e "${GREEN}Checksums:${NC}"
 154          cat "${OUTPUT_DIR}/SHA256SUMS-${VERSION}.txt" | sed 's/^/  /'
 155          echo ""
 156      fi
 157      
 158      echo -e "${GREEN}Libraries:${NC}"
 159      ls -lh "${OUTPUT_DIR}"/libsecp256k1-* 2>/dev/null | awk '{print "  " $9 " (" $5 ")"}' || echo "  No libraries copied"
 160      echo ""
 161  else
 162      echo -e "${RED}No binaries were built successfully${NC}"
 163      exit 1
 164  fi
 165  
 166  echo -e "${BLUE}========================================${NC}"
 167  echo -e "${GREEN}Build completed!${NC}"
 168  echo -e "${BLUE}========================================${NC}"
 169  echo ""
 170  echo "Output directory: ${OUTPUT_DIR}"
 171  echo ""
 172  echo "To test a binary:"
 173  echo "  Linux:   ./${OUTPUT_DIR}/orly-${VERSION}-linux-amd64"
 174  echo "  macOS:   ./${OUTPUT_DIR}/orly-${VERSION}-darwin-arm64"
 175  echo "  Windows: ./${OUTPUT_DIR}/orly-${VERSION}-windows-amd64.exe"
 176  echo ""
 177  
 178