162 lines
4.4 KiB
Bash
Executable File
162 lines
4.4 KiB
Bash
Executable File
#!/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
|