feat: remain windows support (#3162)

Refine process so now it's look cleaner and simple
This commit is contained in:
Darshan K 2025-03-05 21:21:59 +05:30 committed by GitHub
parent dcf09dd365
commit 5f1a3406d1
7 changed files with 115 additions and 90 deletions

View File

@ -34,14 +34,14 @@ ifneq (,$(findstring MINGW,$(detected_OS)))
endif endif
ifeq ($(detected_OS),Windows) ifeq ($(detected_OS),Windows)
# Define a new temporary directory for Windows # Update MINGW_PATH to standard MinGW location
TMP_DIR := $(CURDIR)/tmp MINGW_PATH = /mingw64
$(shell mkdir -p $(TMP_DIR)) NIM_PARAMS += --passC:"-I$(MINGW_PATH)/include"
export TMP := $(TMP_DIR) NIM_PARAMS += --passL:"-L$(MINGW_PATH)/lib"
export TEMP := $(TMP_DIR) NIM_PARAMS += --passL:"-Lvendor/nim-nat-traversal/vendor/miniupnp/miniupnpc"
NIM_PARAMS += --passL:"-Lvendor/nim-nat-traversal/vendor/libnatpmp-upstream"
# Add the necessary libraries to the linker flags
LIBS = -static -lws2_32 -lbcrypt -luserenv -lntdll -lminiupnpc LIBS = -static -lws2_32 -lbcrypt -liphlpapi -luserenv -lntdll -lminiupnpc -lnatpmp -lpq
NIM_PARAMS += $(foreach lib,$(LIBS),--passL:"$(lib)") NIM_PARAMS += $(foreach lib,$(LIBS),--passL:"$(lib)")
endif endif

View File

@ -52,14 +52,42 @@ If you encounter difficulties building the project on WSL, consider placing the
### How to Build & Run ( Windows ) ### How to Build & Run ( Windows )
Note: This is a work in progress. The current setup procedure is as follows: ### Windows Build Instructions
Goal: Get rid of windows specific procedures and make the build process the same as linux/macos.
The current setup procedure is as follows: #### 1. Install Required Tools
- **Git Bash Terminal**: Download and install from https://git-scm.com/download/win
- **MSYS2**:
a. Download installer from https://www.msys2.org
b. Install at "C:\" (default location). Remove/rename the msys folder in case of previous installation.
c. Use the mingw64 terminal from msys64 directory for package installation.
1. Clone the repository and checkout master branch #### 2. Install Dependencies
2. Ensure prerequisites are installed (Make, GCC, MSYS2/MinGW) Open MSYS2 mingw64 terminal and run the following one-by-one :
3. Run scripts/windows_setup.sh ```bash
pacman -Syu --noconfirm
pacman -S --noconfirm --needed mingw-w64-x86_64-toolchain
pacman -S --noconfirm --needed base-devel make cmake upx
pacman -S --noconfirm --needed mingw-w64-x86_64-rust
pacman -S --noconfirm --needed mingw-w64-x86_64-postgresql
pacman -S --noconfirm --needed mingw-w64-x86_64-gcc
pacman -S --noconfirm --needed mingw-w64-x86_64-gcc-libs
pacman -S --noconfirm --needed mingw-w64-x86_64-libwinpthread-git
pacman -S --noconfirm --needed mingw-w64-x86_64-zlib
pacman -S --noconfirm --needed mingw-w64-x86_64-openssl
pacman -S --noconfirm --needed mingw-w64-x86_64-python
```
#### 3. Build Wakunode
- Open Git Bash as administrator
- clone nwaku and cd nwaku
- Execute: `./scripts/build_wakunode_windows.sh`
#### 4. Troubleshooting
If `wakunode2.exe` isn't generated:
- **Missing Dependencies**: Verify with:
`which make cmake gcc g++ rustc cargo python3 upx`
If missing, revisit Step 2 or ensure MSYS2 is at `C:\`
- **Installation Conflicts**: Remove existing MinGW/MSYS2/Git Bash installations and perform fresh install
### Developing ### Developing

View File

@ -7,6 +7,7 @@ else:
if defined(windows): if defined(windows):
switch("passL", "rln.lib") switch("passL", "rln.lib")
switch("define", "postgres=false")
# Automatically add all vendor subdirectories # Automatically add all vendor subdirectories
for dir in walkDir("./vendor"): for dir in walkDir("./vendor"):

View File

@ -43,12 +43,13 @@ else
# first, check if submodule version = version in Makefile # first, check if submodule version = version in Makefile
cargo metadata --format-version=1 --no-deps --manifest-path "${build_dir}/rln/Cargo.toml" cargo metadata --format-version=1 --no-deps --manifest-path "${build_dir}/rln/Cargo.toml"
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then detected_OS=$(uname -s)
if [[ "$detected_OS" == MINGW* || "$detected_OS" == MSYS* ]]; then
submodule_version=$(cargo metadata --format-version=1 --no-deps --manifest-path "${build_dir}/rln/Cargo.toml" | sed -n 's/.*"name":"rln","version":"\([^"]*\)".*/\1/p') submodule_version=$(cargo metadata --format-version=1 --no-deps --manifest-path "${build_dir}/rln/Cargo.toml" | sed -n 's/.*"name":"rln","version":"\([^"]*\)".*/\1/p')
else else
submodule_version=$(cargo metadata --format-version=1 --no-deps --manifest-path "${build_dir}/rln/Cargo.toml" | jq -r '.packages[] | select(.name == "rln") | .version') submodule_version=$(cargo metadata --format-version=1 --no-deps --manifest-path "${build_dir}/rln/Cargo.toml" | jq -r '.packages[] | select(.name == "rln") | .version')
fi fi
if [[ "v${submodule_version}" != "${rln_version}" ]]; then if [[ "v${submodule_version}" != "${rln_version}" ]]; then
echo "Submodule version (v${submodule_version}) does not match version in Makefile (${rln_version})" echo "Submodule version (v${submodule_version}) does not match version in Makefile (${rln_version})"
echo "Please update the submodule to ${rln_version}" echo "Please update the submodule to ${rln_version}"

View File

@ -0,0 +1,60 @@
#!/bin/sh
echo "- - - - - - - - - - Windows Setup Script - - - - - - - - - -"
success_count=0
failure_count=0
# Function to execute a command and check its status
execute_command() {
echo "Executing: $1"
if eval "$1"; then
echo -e "✓ Command succeeded \n"
((success_count++))
else
echo -e "✗ Command failed \n"
((failure_count++))
fi
}
echo "1. -.-.-.-- Set PATH -.-.-.-"
export PATH="/c/msys64/usr/bin:/c/msys64/mingw64/bin:/c/msys64/usr/lib:/c/msys64/mingw64/lib:$PATH"
echo "2. -.-.-.- Verify dependencies -.-.-.-"
execute_command "which gcc g++ make cmake cargo upx rustc python"
echo "3. -.-.-.- Updating submodules -.-.-.-"
execute_command "git submodule update --init --recursive"
echo "4. -.-.-.- Creating tmp directory -.-.-.-"
execute_command "mkdir -p tmp"
echo "5. -.-.-.- Building Nim -.-.-.-"
cd vendor/nimbus-build-system/vendor/Nim
execute_command "./build_all.bat"
cd ../../../..
echo "6. -.-.-.- Building libunwind -.-.-.-"
cd vendor/nim-libbacktrace
execute_command "make all V=1"
execute_command "make install/usr/lib/libunwind.a V=1"
cp ./vendor/libunwind/build/lib/libunwind.a install/usr/lib
cd ../../
echo "7. -.-.-.- Building miniupnpc -.-.-.- "
cd vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc
execute_command "git checkout little_chore_windows_support"
execute_command "make -f Makefile.mingw CC=gcc CXX=g++ libminiupnpc.a V=1"
cd ../../../../..
echo "8. -.-.-.- Building libnatpmp -.-.-.- "
cd ./vendor/nim-nat-traversal/vendor/libnatpmp-upstream
make CC="gcc -fPIC -D_WIN32_WINNT=0x0600 -DNATPMP_STATICLIB" libnatpmp.a V=1
cd ../../../../
echo "9. -.-.-.- Building wakunode2 -.-.-.- "
execute_command "make wakunode2 LOG_LEVEL=DEBUG V=1 -j8"
echo "Windows setup completed successfully!"
echo "✓ Successful commands: $success_count"
echo "✗ Failed commands: $failure_count"

View File

@ -1,68 +0,0 @@
#!/bin/bash
set -e # Exit immediately if a command exits with a non-zero status
echo "Windows Setup Script"
echo "===================="
# Function to execute a command and check its status
execute_command() {
echo "Executing: $1"
if eval "$1"; then
echo "✓ Command succeeded"
else
echo "✗ Command failed"
exit 1
fi
}
# Function to change directory safely
change_directory() {
echo "Changing to directory: $1"
if cd "$1"; then
echo "✓ Changed directory successfully"
else
echo "✗ Failed to change directory"
exit 1
fi
}
# Function to build a component
build_component() {
local dir="$1"
local command="$2"
local name="$3"
echo "Building $name"
if [ -d "$dir" ]; then
change_directory "$dir"
execute_command "$command"
change_directory - > /dev/null
else
echo "$name directory not found: $dir"
exit 1
fi
}
echo "1. Updating submodules"
execute_command "git submodule update --init --recursive"
echo "2. Creating tmp directory"
execute_command "mkdir -p tmp"
echo "3. Building Nim"
build_component "vendor/nimbus-build-system/vendor/Nim" "./build_all.bat" "Nim"
echo "4. Building miniupnpc"
build_component "vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc" "./mingw32make.bat" "miniupnpc"
echo "5. Building libnatpmp"
build_component "vendor/nim-nat-traversal/vendor/libnatpmp-upstream" "./build.bat" "libnatpmp"
echo "6. Building libunwind"
build_component "vendor/nim-libbacktrace" "make install/usr/lib/libunwind.a" "libunwind"
echo "7. Building wakunode2"
execute_command "make wakunode2 V=1 NIMFLAGS="-d:disableMarchNative -d:postgres -d:chronicles_colors:none" "
echo "Windows setup completed successfully!"

View File

@ -182,12 +182,15 @@ proc waitQueryToFinish(
let asyncFd = cast[asyncengine.AsyncFD](pqsocket(dbConnWrapper.dbConn)) let asyncFd = cast[asyncengine.AsyncFD](pqsocket(dbConnWrapper.dbConn))
asyncengine.addReader2(asyncFd, onDataAvailable).isOkOr: when not defined(windows):
dbConnWrapper.futBecomeFree.fail(newException(ValueError, $error)) asyncengine.addReader2(asyncFd, onDataAvailable).isOkOr:
return err("failed to add event reader in waitQueryToFinish: " & $error) dbConnWrapper.futBecomeFree.fail(newException(ValueError, $error))
defer: return err("failed to add event reader in waitQueryToFinish: " & $error)
asyncengine.removeReader2(asyncFd).isOkOr: defer:
return err("failed to remove event reader in waitQueryToFinish: " & $error) asyncengine.removeReader2(asyncFd).isOkOr:
return err("failed to remove event reader in waitQueryToFinish: " & $error)
else:
return err("Postgres not supported on Windows")
await futDataAvailable await futDataAvailable