#!/bin/bash # Build script for uTun (supports both Linux and Windows/MSYS2) # Usage: ./build.sh [options] # Options: # -h, --help Show this help # --clean Clean before build # -j[N] Build with N parallel jobs (default: 4) set -e # Exit on error # Detect platform if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]] || [[ -n "$MSYSTEM" ]]; then IS_WINDOWS=1 echo "Detected Windows/MSYS2 environment" else IS_WINDOWS=0 echo "Detected Linux environment" fi # Parse arguments CLEAN=0 JOBS="-j4" MAKE_ARGS="" while [[ $# -gt 0 ]]; do case $1 in -h|--help) echo "Usage: ./build.sh [options]" echo "Options:" echo " -h, --help Show this help" echo " --clean Clean before build" echo " -j[N] Build with N parallel jobs (default: 4)" exit 0 ;; --clean) CLEAN=1 shift ;; -j*) JOBS="$1" shift ;; *) MAKE_ARGS="$MAKE_ARGS $1" shift ;; esac done # Check required tools if ! command -v gcc &> /dev/null; then echo "Error: gcc not found." if [ "$IS_WINDOWS" -eq 1 ]; then echo "Please install: pacman -S mingw-w64-ucrt-x86_64-toolchain" else echo "Please install build-essential or gcc" fi exit 1 fi # Clean if requested if [ "$CLEAN" -eq 1 ]; then echo "Cleaning build..." make clean 2>/dev/null || true rm -f config.status config.h fi # Check if configure script exists if [ ! -f ./configure ]; then echo "Configure script not found. Generating..." if ! command -v autoreconf &> /dev/null; then echo "Error: autoreconf not found." if [ "$IS_WINDOWS" -eq 1 ]; then echo "Install autotools: pacman -S autoconf automake libtool" else echo "Install autotools: apt-get install autoconf automake libtool" fi exit 1 fi autoreconf -fiv fi # Run configure if needed if [ ! -f config.status ] || [ config.status -ot configure ]; then echo "Configuring build..." if [ "$IS_WINDOWS" -eq 1 ]; then # Windows: configure for mingw ./configure --prefix=/usr/local --host=x86_64-w64-mingw32 2>&1 | tee configure.log else # Linux: standard configure ./configure --prefix=/usr/local 2>&1 | tee configure.log fi else echo "Using existing configuration." fi # Build echo "Compiling with $JOBS..." BUILD_SUCCESS=0 if [ "$IS_WINDOWS" -eq 1 ]; then make $JOBS $MAKE_ARGS 2>&1 | tee build_win.log if [ ${PIPESTATUS[0]} -eq 0 ]; then BUILD_SUCCESS=1 fi else make $JOBS $MAKE_ARGS 2>&1 | tee build_linux.log if [ ${PIPESTATUS[0]} -eq 0 ]; then BUILD_SUCCESS=1 fi fi if [ $BUILD_SUCCESS -eq 1 ]; then echo "" echo "Build completed successfully!" if [ "$IS_WINDOWS" -eq 1 ]; then echo "Binary: src/utun.exe" echo "Make sure wintun.dll is in the same directory as utun.exe" else echo "Binary: src/utun" fi else echo "" echo "ERROR: Build failed!" echo "Check build_win.log (Windows) or build_linux.log (Linux) for details" exit 1 fi