#!/bin/bash # DRG-XMRig (DragonX miner) Release Build Script # Usage: ./build.sh [--linux-release] [--win-release] [--macos-release] set -e ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RELEASE_DIR="$ROOT_DIR/release" VERSION=$(grep '#define APP_VERSION' "$ROOT_DIR/src/version.h" | sed 's/.*"\(.*\)"/\1/') BUILD_LINUX=false BUILD_WIN=false BUILD_MACOS=false for arg in "$@"; do case "$arg" in --linux-release) BUILD_LINUX=true ;; --win-release) BUILD_WIN=true ;; --macos-release) BUILD_MACOS=true ;; *) echo "Usage: $0 [--linux-release] [--win-release] [--macos-release]" exit 1 ;; esac done if ! $BUILD_LINUX && ! $BUILD_WIN && ! $BUILD_MACOS; then echo "Usage: $0 [--linux-release] [--win-release] [--macos-release]" echo "" echo "Flags:" echo " --linux-release Build Linux x86_64 release" echo " --win-release Build Windows x86_64 release (cross-compile with MinGW)" echo " --macos-release Build macOS release for the host architecture (uses Homebrew deps)" exit 1 fi echo "=== DRG-XMRig Release Builder v${VERSION} ===" mkdir -p "$RELEASE_DIR" build_linux() { echo "" echo "=========================================" echo " Building Linux x86_64 Release" echo "=========================================" local BUILD_DIR="$ROOT_DIR/build-linux" local DEPS_DIR="$ROOT_DIR/scripts/deps" # Build dependencies if needed if [ ! -f "$DEPS_DIR/lib/libuv.a" ] || [ ! -f "$DEPS_DIR/lib/libssl.a" ] || [ ! -f "$DEPS_DIR/lib/libhwloc.a" ]; then echo "--- Building Linux dependencies ---" cd "$ROOT_DIR/scripts" bash build_deps.sh fi # Configure and build mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" cmake "$ROOT_DIR" \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_STATIC=ON \ -DWITH_OPENCL=OFF \ -DWITH_CUDA=OFF \ -DXMRIG_DEPS="$DEPS_DIR" make -j"$(nproc)" strip xmrig # Package local PKG_NAME="drg-xmrig-${VERSION}-linux-x64" local PKG_DIR="$RELEASE_DIR/$PKG_NAME" rm -rf "$PKG_DIR" mkdir -p "$PKG_DIR" cp "$BUILD_DIR/xmrig" "$PKG_DIR/" cp "$ROOT_DIR/src/config.example.json" "$PKG_DIR/config.json" cp "$ROOT_DIR/README.md" "$PKG_DIR/" cd "$RELEASE_DIR" zip -r "${PKG_NAME}.zip" "$PKG_NAME" rm -rf "$PKG_DIR" echo "" echo "Linux release: release/${PKG_NAME}.zip" } build_windows() { echo "" echo "=========================================" echo " Building Windows x86_64 Release" echo "=========================================" # Delegate to the existing cross-compilation script cd "$ROOT_DIR/scripts" bash build_windows.sh local BUILD_DIR="$ROOT_DIR/build-windows" # Package local PKG_NAME="drg-xmrig-${VERSION}-win-x64" local PKG_DIR="$RELEASE_DIR/$PKG_NAME" rm -rf "$PKG_DIR" mkdir -p "$PKG_DIR" cp "$BUILD_DIR/xmrig.exe" "$PKG_DIR/" cp "$ROOT_DIR/bin/WinRing0/WinRing0x64.sys" "$PKG_DIR/" cp "$ROOT_DIR/src/config.example.json" "$PKG_DIR/config.json" cp "$ROOT_DIR/README.md" "$PKG_DIR/" cd "$RELEASE_DIR" zip -r "${PKG_NAME}.zip" "$PKG_NAME" rm -rf "$PKG_DIR" echo "" echo "Windows release: release/${PKG_NAME}.zip" } build_macos() { echo "" echo "=========================================" echo " Building macOS Release" echo "=========================================" if ! command -v brew >/dev/null 2>&1; then echo "ERROR: Homebrew is required. Install from https://brew.sh and run:" echo " brew install libuv hwloc openssl@3" exit 1 fi # Resolve Homebrew dependency prefixes (works on Intel /usr/local and Apple Silicon /opt/homebrew) local OPENSSL_PREFIX UV_PREFIX HWLOC_PREFIX OPENSSL_PREFIX=$(brew --prefix openssl@3 2>/dev/null) || true UV_PREFIX=$(brew --prefix libuv 2>/dev/null) || true HWLOC_PREFIX=$(brew --prefix hwloc 2>/dev/null) || true if [ ! -f "$OPENSSL_PREFIX/lib/libssl.a" ] || [ ! -f "$UV_PREFIX/lib/libuv.a" ] || [ ! -f "$HWLOC_PREFIX/lib/libhwloc.a" ]; then echo "ERROR: missing static dependencies. Install them with:" echo " brew install libuv hwloc openssl@3" exit 1 fi local BUILD_DIR="$ROOT_DIR/build-macos" local ARCH; ARCH=$(uname -m) # x86_64 or arm64 local JOBS; JOBS=$(sysctl -n hw.ncpu) mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" # Statically link libuv/hwloc/openssl so the binary is portable (no Homebrew needed at runtime). # Homebrew's static libhwloc.a pulls in libxml2 and the OpenCL framework, both shipped with macOS. cmake "$ROOT_DIR" \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_OPENCL=OFF \ -DWITH_CUDA=OFF \ -DWITH_HWLOC=ON \ -DWITH_TLS=ON \ -DXMRIG_DEPS="$OPENSSL_PREFIX" \ -DUV_LIBRARY="$UV_PREFIX/lib/libuv.a" \ -DUV_INCLUDE_DIR="$UV_PREFIX/include" \ -DHWLOC_LIBRARY="$HWLOC_PREFIX/lib/libhwloc.a" \ -DHWLOC_INCLUDE_DIR="$HWLOC_PREFIX/include" \ -DCMAKE_EXE_LINKER_FLAGS="-lxml2 -framework OpenCL" make -j"$JOBS" # Package local PKG_NAME="drg-xmrig-${VERSION}-macos-${ARCH}" local PKG_DIR="$RELEASE_DIR/$PKG_NAME" rm -rf "$PKG_DIR" mkdir -p "$PKG_DIR" cp "$BUILD_DIR/xmrig" "$PKG_DIR/" cp "$ROOT_DIR/src/config.example.json" "$PKG_DIR/config.json" cp "$ROOT_DIR/README.md" "$PKG_DIR/" cd "$RELEASE_DIR" rm -f "${PKG_NAME}.zip" zip -r "${PKG_NAME}.zip" "$PKG_NAME" rm -rf "$PKG_DIR" echo "" echo "macOS release: release/${PKG_NAME}.zip" } # Run selected builds $BUILD_LINUX && build_linux $BUILD_WIN && build_windows $BUILD_MACOS && build_macos echo "" echo "=========================================" echo " Release artifacts in release/" echo "=========================================" ls -lh "$RELEASE_DIR"/*.zip 2>/dev/null || true