diff --git a/buildwin.bat b/buildwin.bat index 1a1f77e..70762ec 100644 --- a/buildwin.bat +++ b/buildwin.bat @@ -1,42 +1,42 @@ @echo off -REM This script builds a Windows x64 release binary and creates a tarball with checksum. -REM It requires vcpkg to be installed at root of C: drive (https://github.com/microsoft/vcpkg). -REM This script will install Rust (using chocolatey) if it is not already installed. -REM -REM Call with -force to clone and bootstrap vcpkg if it is not found +REM --------------------------------------------------------------------------- +REM Build a Windows-x64 release of Kingfisher and package it with checksums. REM +REM • Installs Hyperscan statically via vcpkg so vectorscan-rs-sys can link +REM against hs.lib. +REM • Installs Rust (via Chocolatey) if missing. +REM • Call with -force to clone & bootstrap vcpkg if it isn’t found. +REM --------------------------------------------------------------------------- -setlocal +setlocal enabledelayedexpansion -REM Set your Cargo project name manually here if desired: +REM ── Project name ──────────────────────────────────────────────────────────── set "PROJECT_NAME=kingfisher" -REM Optional check for OS: +REM ── Require Windows ───────────────────────────────────────────────────────── if NOT "%OS%"=="Windows_NT" ( echo This script must be run on Windows. exit /b 1 ) + +REM ── Locate MSVC toolchain ─────────────────────────────────────────────────── if "%VCINSTALLDIR%"=="" ( - echo VCINSTALLDIR not set - attempting auto-detection… + echo VCINSTALLDIR not set — attempting auto-detection... for %%P in ( "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC" "C:\Program Files\Microsoft Visual Studio\2022\Professional\VC" "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC" "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC" - ) do ( - if exist "%%~P\Auxiliary\Build\vcvars64.bat" ( - set "VCINSTALLDIR=%%~P" - echo Found Visual C++ Build Tools at: %%~P - goto :vc_found - ) + ) do if exist "%%~P\Auxiliary\Build\vcvars64.bat" ( + set "VCINSTALLDIR=%%~P" + echo Found Visual C++ Build Tools at: %%~P + goto :vc_found ) echo ERROR: Could not find a suitable Visual Studio installation. echo Install “Desktop development with C++” or set VCINSTALLDIR. exit /b 1 ) :vc_found - -REM Strip trailing backslash if present if "%VCINSTALLDIR:~-1%"=="\" set "VCINSTALLDIR=%VCINSTALLDIR:~0,-1%" echo Initialising MSVC environment… @@ -45,96 +45,95 @@ call "%VCINSTALLDIR%\Auxiliary\Build\vcvars64.bat" || ( exit /b 1 ) -REM Locate vcpkg.exe -where vcpkg.exe >nul 2>nul +REM ── Locate or bootstrap vcpkg ─────────────────────────────────────────────── +where vcpkg.exe >nul 2>&1 if %ERRORLEVEL% NEQ 0 ( if exist "%HOMEDRIVE%\vcpkg\vcpkg.exe" ( set "VCPKG_EXE=%HOMEDRIVE%\vcpkg\vcpkg.exe" echo Found vcpkg at: %VCPKG_EXE% + ) else if "%~1"=="-force" ( + echo Cloning and bootstrapping vcpkg… + if exist "%HOMEDRIVE%\vcpkg" rmdir /s /q "%HOMEDRIVE%\vcpkg" + git clone https://github.com/microsoft/vcpkg.git "%HOMEDRIVE%\vcpkg" + pushd "%HOMEDRIVE%\vcpkg" + call .\bootstrap-vcpkg.bat || (echo ERROR: vcpkg bootstrap failed.&exit /b 1) + set "VCPKG_EXE=%CD%\vcpkg.exe" + popd ) else ( - if "%~1"=="-force" ( - echo Cloning and bootstrapping vcpkg... - if exist "%HOMEDRIVE%\vcpkg" ( - rmdir /s /q "%HOMEDRIVE%\vcpkg" - ) - git clone https://github.com/microsoft/vcpkg.git "%HOMEDRIVE%\vcpkg" - pushd "%HOMEDRIVE%\vcpkg" - dir - call .\bootstrap-vcpkg.bat - set "VCPKG_EXE=%CD%\vcpkg.exe" - popd - echo Installed vcpkg at: %VCPKG_EXE% - ) else ( - echo ERROR: vcpkg not found. Please install it or re-run script with -force. - exit /b 1 - ) + echo ERROR: vcpkg not found. Install it or rerun with -force. + exit /b 1 ) ) else ( - for /f "tokens=*" %%i in ('where vcpkg.exe') do ( - set "VCPKG_EXE=%%i" - goto :found_vcpkg - ) - :found_vcpkg + for /f "tokens=*" %%i in ('where vcpkg.exe') do set "VCPKG_EXE=%%i" echo Found vcpkg at: %VCPKG_EXE% ) -REM Check if LOCALAPPDATA starts with a drive letter, if not set it to APPDATA +REM ── Ensure LOCALAPPDATA has a drive letter (GitHub Actions quirk) ─────────── if /I not "%LOCALAPPDATA:~1,1%"==":" ( - echo LOCALAPPDATA does not start with a drive letter. Setting it to APPDATA. + echo LOCALAPPDATA lacks drive letter; pointing it at APPDATA. set "LOCALAPPDATA=%APPDATA%" ) -echo Installing hyperscan via vcpkg... -set -"%HOMEDRIVE%\vcpkg\vcpkg.exe" install hyperscan:x64-windows +REM ── Install Hyperscan statically ──────────────────────────────────────────── +set "VCPKG_TRIPLET=x64-windows-static" +echo Installing Hyperscan (%VCPKG_TRIPLET%) via vcpkg… +call "%VCPKG_EXE%" install hyperscan:%VCPKG_TRIPLET% --clean-after-build || ( + echo ERROR: vcpkg install failed. + exit /b 1 +) set "LIBHS_NO_PKG_CONFIG=1" -REM Point vectorscan-rs-sys at the Hyperscan install from vcpkg -set "HYPERSCAN_ROOT=%HOMEDRIVE%\vcpkg\installed\x64-windows" +REM Path hints for vectorscan-rs-sys +set "HYPERSCAN_ROOT=%HOMEDRIVE%\vcpkg\installed\%VCPKG_TRIPLET%" set "LIB=%HYPERSCAN_ROOT%\lib;%LIB%" set "INCLUDE=%HYPERSCAN_ROOT%\include;%INCLUDE%" -REM Check for Rust, install if missing -where rustc.exe >nul 2>nul -if %ERRORLEVEL% NEQ 0 ( - echo Installing Rust... - choco install rust-ms -y - choco install cmake -y --installargs "ADD_CMAKE_TO_PATH=System" - call refreshenv +REM Fallback: rename vectorscan.lib -> hs.lib if vcpkg changed the name +if not exist "%HYPERSCAN_ROOT%\lib\hs.lib" if exist "%HYPERSCAN_ROOT%\lib\vectorscan.lib" ( + copy "%HYPERSCAN_ROOT%\lib\vectorscan.lib" "%HYPERSCAN_ROOT%\lib\hs.lib" >nul +) +REM ── Install Rust toolchain if absent ──────────────────────────────────────── +where rustc.exe >nul 2>&1 +if %ERRORLEVEL% NEQ 0 ( + echo Installing Rust via Chocolatey… + choco install rust-ms -y || exit /b 1 + choco install cmake -y --installargs "ADD_CMAKE_TO_PATH=System" || exit /b 1 + call refreshenv ) else ( echo Rust is already installed. ) -echo Building for Windows x64... +REM ── Build ─────────────────────────────────────────────────────────────────── +echo Building for Windows x64… cargo build --release --target x86_64-pc-windows-msvc || ( - echo Cargo build failed. + echo ERROR: Cargo build failed. exit /b 1 ) -echo Generating CHECKSUM.txt... +REM ── Package & checksum ────────────────────────────────────────────────────── +echo Generating CHECKSUM.txt… powershell -Command ^ "Get-FileHash .\target\x86_64-pc-windows-msvc\release\%PROJECT_NAME%.exe -Algorithm SHA256 | Out-File .\target\x86_64-pc-windows-msvc\release\CHECKSUM.txt" if not exist "target\release" mkdir "target\release" -copy /Y "target\x86_64-pc-windows-msvc\release\%PROJECT_NAME%.exe" "target\release\" >nul -copy /Y "target\x86_64-pc-windows-msvc\release\CHECKSUM.txt" "target\release\CHECKSUM-windows-x64.txt" >nul +copy /Y "target\x86_64-pc-windows-msvc\release\%PROJECT_NAME%.exe" "target\release\" >nul +copy /Y "target\x86_64-pc-windows-msvc\release\CHECKSUM.txt" "target\release\CHECKSUM-windows-x64.txt" >nul -cd target\release +pushd target\release echo Creating archive: %PROJECT_NAME%-windows-x64.zip if exist "%PROJECT_NAME%-windows-x64.zip" del /f /q "%PROJECT_NAME%-windows-x64.zip" powershell -Command "Compress-Archive -Path '%PROJECT_NAME%.exe','CHECKSUM-windows-x64.txt' -DestinationPath '%PROJECT_NAME%-windows-x64.zip' -Force" if exist "%PROJECT_NAME%-windows-x64.zip" ( - REM -- append the ZIP’s SHA-256 to the existing checksum file ---- certutil -hashfile "%PROJECT_NAME%-windows-x64.zip" SHA256 >> "CHECKSUM-windows-x64.txt" echo Created: %PROJECT_NAME%-windows-x64.zip ) else ( echo ERROR: Archive not created. ) - echo Archives in target\release: dir /b *.zip 2>nul || echo None found. +popd endlocal exit /b 0