#!/bin/bash # Cross-compilation script for building Windows binaries on Linux set -e echo "RLogg - Cross-Platform Builder (Linux → All Platforms)" echo "=======================================================" echo "" # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Extract version from Cargo.toml VERSION=$(grep -m1 '^version = ' Cargo.toml | sed 's/version = "\(.*\)"/\1/') echo "Version: $VERSION" echo "" # Create dist directory DIST_DIR="dist" mkdir -p "$DIST_DIR" # Check if cross is installed check_cross() { if ! command -v cross &> /dev/null; then echo -e "${YELLOW}Installing 'cross' for cross-compilation...${NC}" cargo install cross --git https://github.com/cross-rs/cross else echo -e "${GREEN}✓ 'cross' is already installed${NC}" fi } # Build using cross build_with_cross() { local target=$1 local name=$2 echo "" echo -e "${BLUE}=== Building for $name ===${NC}" echo -e "${YELLOW}Target: $target${NC}" # Clean build artifacts to avoid GLIBC mismatch with build scripts echo -e "${YELLOW}Cleaning build artifacts...${NC}" cargo clean --release --target "$target" if cross build --release --target "$target"; then echo -e "${GREEN}✓ Build successful for $name${NC}" # Copy binary to dist directory with version if [[ "$target" == *"windows"* ]]; then cp "target/$target/release/rlogg.exe" "$DIST_DIR/rlogg-$VERSION-$name.exe" echo -e "${GREEN}✓ Binary: $DIST_DIR/rlogg-$VERSION-$name.exe${NC}" else cp "target/$target/release/rlogg" "$DIST_DIR/rlogg-$VERSION-$name" strip "$DIST_DIR/rlogg-$VERSION-$name" 2>/dev/null || true echo -e "${GREEN}✓ Binary: $DIST_DIR/rlogg-$VERSION-$name${NC}" fi return 0 else echo -e "${RED}✗ Build failed for $name${NC}" return 1 fi } # Build using regular cargo (for native Linux) build_native() { echo "" echo -e "${BLUE}=== Building for Linux (native) ===${NC}" if cargo build --release; then echo -e "${GREEN}✓ Build successful for Linux${NC}" cp "target/release/rlogg" "$DIST_DIR/rlogg-$VERSION-linux-x86_64" strip "$DIST_DIR/rlogg-$VERSION-linux-x86_64" 2>/dev/null || true echo -e "${GREEN}✓ Binary: $DIST_DIR/rlogg-$VERSION-linux-x86_64${NC}" return 0 else echo -e "${RED}✗ Build failed for Linux${NC}" return 1 fi } # Main menu show_menu() { echo "" echo "Select targets to build:" echo " 1) Linux x86_64 (native)" echo " 2) Windows x86_64 (cross-compile with MinGW)" echo " 3) Both Linux and Windows" echo " 4) Exit" echo "" read -p "Enter choice [1-4]: " choice echo "" } # Parse command line arguments if [ $# -eq 0 ]; then # Interactive mode while true; do show_menu case $choice in 1) build_native ;; 2) check_cross build_with_cross "x86_64-pc-windows-gnu" "windows-x86_64" ;; 3) build_native check_cross build_with_cross "x86_64-pc-windows-gnu" "windows-x86_64" ;; 4) echo "Exiting..." break ;; *) echo -e "${RED}Invalid choice${NC}" ;; esac done else # Command line mode case "$1" in linux) build_native ;; windows|win) check_cross build_with_cross "x86_64-pc-windows-gnu" "windows-x86_64" ;; all) build_native check_cross build_with_cross "x86_64-pc-windows-gnu" "windows-x86_64" ;; *) echo "Usage: $0 [linux|windows|all]" echo "" echo " linux - Build for Linux (native)" echo " windows - Cross-compile for Windows (MinGW)" echo " all - Build for both platforms" echo "" echo "Or run without arguments for interactive mode" exit 1 ;; esac fi echo "" echo -e "${GREEN}=== Build Complete ===${NC}" if [ -d "$DIST_DIR" ] && [ "$(ls -A $DIST_DIR)" ]; then echo "Binaries in '$DIST_DIR':" ls -lh "$DIST_DIR" else echo "No binaries were built" fi