kingfisher/buildwin.bat
2025-07-28 14:14:47 -07:00

139 lines
6.3 KiB
Batchfile
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@echo off
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 isnt found.
REM ---------------------------------------------------------------------------
setlocal enabledelayedexpansion
REM ── Project name ────────────────────────────────────────────────────────────
set "PROJECT_NAME=kingfisher"
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...
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 VisualC++ 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
if "%VCINSTALLDIR:~-1%"=="\" set "VCINSTALLDIR=%VCINSTALLDIR:~0,-1%"
echo Initialising MSVC environment…
call "%VCINSTALLDIR%\Auxiliary\Build\vcvars64.bat" || (
echo ERROR: Failed to initialise MSVC toolchain.
exit /b 1
)
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 (
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"
echo Found vcpkg at: %VCPKG_EXE%
)
REM ── Ensure LOCALAPPDATA has a drive letter (GitHub Actions quirk) ───────────
if /I not "%LOCALAPPDATA:~1,1%"==":" (
echo LOCALAPPDATA lacks drive letter; pointing it at APPDATA.
set "LOCALAPPDATA=%APPDATA%"
)
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 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 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.
)
REM ── Build ───────────────────────────────────────────────────────────────────
echo Building for Windows x64…
cargo build --release --target x86_64-pc-windows-msvc || (
echo ERROR: Cargo build failed.
exit /b 1
)
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
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" (
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