Browse Source
- Add #ifdef _WIN32 to use winsock2.h/ws2tcpip.h instead of sys/socket.h - Update build.sh to support both Linux and Windows/MSYS2 - Auto-detect platform and configure accordingly (--host=x86_64-w64-mingw32 for Windows) - All 22 tests pass on Linuxnodeinfo-routing-update
2 changed files with 122 additions and 5 deletions
@ -0,0 +1,112 @@ |
|||||||
|
#!/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..." |
||||||
|
if [ "$IS_WINDOWS" -eq 1 ]; then |
||||||
|
make $JOBS $MAKE_ARGS 2>&1 | tee build_win.log |
||||||
|
else |
||||||
|
make $JOBS $MAKE_ARGS 2>&1 | tee build_linux.log |
||||||
|
fi |
||||||
|
|
||||||
|
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 |
||||||
Loading…
Reference in new issue