VideoTools/scripts/build-windows.sh

164 lines
5.5 KiB
Bash
Executable File

#!/bin/bash
# VideoTools Windows Build Script
# Cross-compiles VideoTools for Windows from Linux
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BUILD_OUTPUT="$PROJECT_ROOT/VideoTools.exe"
DIST_DIR="$PROJECT_ROOT/dist/windows"
echo "════════════════════════════════════════════════════════════════"
echo " VideoTools Windows Build Script (Cross-Compilation)"
echo "════════════════════════════════════════════════════════════════"
echo ""
# Check if go is installed
if ! command -v go &> /dev/null; then
echo "❌ ERROR: Go is not installed. Please install Go 1.21 or later."
exit 1
fi
echo "📦 Go version:"
go version
echo ""
# Check if MinGW-w64 is installed
if ! command -v x86_64-w64-mingw32-gcc &> /dev/null; then
echo "❌ ERROR: MinGW-w64 cross-compiler not found!"
echo ""
echo "To install on Fedora/RHEL:"
echo " sudo dnf install mingw64-gcc mingw64-winpthreads-static"
echo ""
echo "To install on Debian/Ubuntu:"
echo " sudo apt-get install gcc-mingw-w64"
echo ""
exit 1
fi
echo "🔧 MinGW-w64 detected:"
x86_64-w64-mingw32-gcc --version | head -1
echo ""
# Change to project directory
cd "$PROJECT_ROOT"
echo "🧹 Cleaning previous Windows builds..."
rm -f "$BUILD_OUTPUT" 2>/dev/null || true
rm -rf "$DIST_DIR" 2>/dev/null || true
echo "✓ Previous builds cleaned"
echo ""
echo "⬇️ Downloading and verifying dependencies..."
go mod download
go mod verify
echo "✓ Dependencies verified"
echo ""
echo "🔨 Cross-compiling for Windows (amd64)..."
echo " Target: windows/amd64"
echo " Compiler: x86_64-w64-mingw32-gcc"
echo ""
# Set Windows build environment
export GOOS=windows
export GOARCH=amd64
export CGO_ENABLED=1
export CC=x86_64-w64-mingw32-gcc
export CXX=x86_64-w64-mingw32-g++
# Build flags
# -H windowsgui: Hide console window (GUI application)
# -s -w: Strip debug symbols (smaller binary)
LDFLAGS="-H windowsgui -s -w"
if go build -ldflags="$LDFLAGS" -o "$BUILD_OUTPUT" .; then
echo "✓ Cross-compilation successful!"
echo ""
else
echo "❌ Build failed!"
exit 1
fi
echo "📦 Creating distribution package..."
mkdir -p "$DIST_DIR"
# Copy executable
cp "$BUILD_OUTPUT" "$DIST_DIR/"
echo "✓ Copied VideoTools.exe"
# Copy documentation
cp README.md "$DIST_DIR/" 2>/dev/null || echo "⚠️ README.md not found"
cp LICENSE "$DIST_DIR/" 2>/dev/null || echo "⚠️ LICENSE not found"
# Download and bundle FFmpeg automatically
if [ ! -f "ffmpeg.exe" ]; then
echo "📥 FFmpeg not found locally, downloading..."
FFMPEG_URL="https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip"
FFMPEG_ZIP="$PROJECT_ROOT/ffmpeg-windows.zip"
if command -v wget &> /dev/null; then
wget -q --show-progress "$FFMPEG_URL" -O "$FFMPEG_ZIP"
elif command -v curl &> /dev/null; then
curl -L "$FFMPEG_URL" -o "$FFMPEG_ZIP" --progress-bar
else
echo "⚠️ wget or curl not found. Cannot download FFmpeg automatically."
echo " Please download manually from: $FFMPEG_URL"
echo " Extract ffmpeg.exe and ffprobe.exe to project root"
echo ""
fi
if [ -f "$FFMPEG_ZIP" ]; then
echo "📦 Extracting FFmpeg..."
unzip -q "$FFMPEG_ZIP" "*/bin/ffmpeg.exe" "*/bin/ffprobe.exe" -d "$PROJECT_ROOT/ffmpeg-temp"
# Find and copy the executables (they're nested in a versioned directory)
find "$PROJECT_ROOT/ffmpeg-temp" -name "ffmpeg.exe" -exec cp {} "$PROJECT_ROOT/" \;
find "$PROJECT_ROOT/ffmpeg-temp" -name "ffprobe.exe" -exec cp {} "$PROJECT_ROOT/" \;
# Cleanup
rm -rf "$PROJECT_ROOT/ffmpeg-temp" "$FFMPEG_ZIP"
echo "✓ FFmpeg downloaded and extracted"
fi
fi
# Bundle FFmpeg with the distribution
if [ -f "ffmpeg.exe" ]; then
cp ffmpeg.exe "$DIST_DIR/"
echo "✓ Bundled ffmpeg.exe"
else
echo "⚠️ ffmpeg.exe not found - distribution will require separate FFmpeg installation"
fi
if [ -f "ffprobe.exe" ]; then
cp ffprobe.exe "$DIST_DIR/"
echo "✓ Bundled ffprobe.exe"
else
echo "⚠️ ffprobe.exe not found"
fi
echo ""
echo "════════════════════════════════════════════════════════════════"
echo "✅ WINDOWS BUILD COMPLETE"
echo "════════════════════════════════════════════════════════════════"
echo ""
echo "Output directory: $DIST_DIR"
echo "Contents:"
ls -lh "$DIST_DIR"
echo ""
echo "Windows executable: $DIST_DIR/VideoTools.exe"
echo "Size: $(du -h "$DIST_DIR/VideoTools.exe" | cut -f1)"
echo ""
echo "Next steps:"
echo " 1. Test on Windows 10/11"
echo " 2. Create installer with NSIS (optional)"
echo " 3. Package with FFmpeg for distribution"
echo ""
echo "To download FFmpeg for Windows:"
echo " wget https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl.zip"
echo " unzip ffmpeg-master-latest-win64-gpl.zip"
echo " cp ffmpeg-master-latest-win64-gpl/bin/ffmpeg.exe ."
echo " cp ffmpeg-master-latest-win64-gpl/bin/ffprobe.exe ."
echo " ./scripts/build-windows.sh # Rebuild to include FFmpeg"
echo ""