@echo off REM One-time provisioning, auto-run by dockur/windows during the final step REM of Windows's own unattended setup (see its README's /oem mechanism). REM Everything here happens exactly once and lands on the VM's persistent REM disk -- later builds just boot this already-provisioned VM and run REM build.bat, no re-provisioning. REM REM UNTESTED end to end: written from MSYS2's documented CI bootstrap REM sequence (the same one msys2/setup-msys2 uses) and WiX's own docs, not REM verified against a live dockur/windows boot. Expect to debug this on REM the actual first run -- watch it happen at http://localhost:8006. REM REM Every step also echoes to Z:\install_progress.log (best-effort, only REM if the Z:\ shared drive happens to be up already at this point in REM setup) purely so build_windows.sh on the host has SOMETHING to show REM besides silence during the one-time provisioning run. setlocal enabledelayedexpansion call :log "starting FEnigma build-VM provisioning" REM -- MSYS2: the "base" self-extracting archive, not the GUI installer -- REM (the GUI installer has no reliable non-interactive/silent flag across REM versions; the base sfx archive is what CI pipelines actually use). REM Discover the current filename by scraping the repo listing, since it's REM datestamped and there's no stable "latest" URL. call :log "finding current MSYS2 base archive..." powershell -NoProfile -Command ^ "$ProgressPreference='SilentlyContinue';" ^ "$html = Invoke-WebRequest -Uri 'https://repo.msys2.org/distrib/x86_64/' -UseBasicParsing;" ^ "$name = ($html.Links | Where-Object { $_.href -match '^msys2-base-x86_64-.*\.sfx\.exe$' } | Select-Object -Last 1).href;" ^ "Invoke-WebRequest -Uri ('https://repo.msys2.org/distrib/x86_64/' + $name) -OutFile 'C:\msys2-base.sfx.exe' -UseBasicParsing" if not exist C:\msys2-base.sfx.exe ( call :log "FAILED: could not download MSYS2 base archive" exit /b 1 ) call :log "extracting MSYS2 to C:\msys64 ..." C:\msys2-base.sfx.exe -y -oC:\ >> C:\OEM\install.log 2>&1 del C:\msys2-base.sfx.exe REM First bash launch finalizes the base install and kills itself off REM mid-update (documented MSYS2 behavior) -- run it, ignore its exit REM code, then run the real update. call :log "bootstrapping MSYS2 (pacman -Syuu, twice) ..." C:\msys64\usr\bin\bash.exe -lc "exit 0" >> C:\OEM\install.log 2>&1 C:\msys64\usr\bin\bash.exe -lc "pacman -Syuu --noconfirm" >> C:\OEM\install.log 2>&1 C:\msys64\usr\bin\bash.exe -lc "pacman -Syuu --noconfirm" >> C:\OEM\install.log 2>&1 call :log "installing GTK4/libadwaita/PyGObject/build deps ..." C:\msys64\usr\bin\bash.exe -lc "pacman -S --noconfirm --needed mingw-w64-x86_64-python mingw-w64-x86_64-python-pip mingw-w64-x86_64-python-gobject mingw-w64-x86_64-gtk4 mingw-w64-x86_64-libadwaita mingw-w64-x86_64-python-numpy mingw-w64-x86_64-python-pillow mingw-w64-x86_64-opencv mingw-w64-x86_64-tesseract-ocr" >> C:\OEM\install.log 2>&1 call :log "pip install pytesseract (pure python, no wheel needed) ..." C:\msys64\mingw64\bin\python3.exe -m pip install pytesseract >> C:\OEM\install.log 2>&1 REM -- WiX v3 toolset (candle/light/heat), a plain zip of standalone exes, REM no installer needed. Fixed versioned URL, no scraping required. call :log "fetching WiX v3.11 ..." powershell -NoProfile -Command ^ "$ProgressPreference='SilentlyContinue';" ^ "Invoke-WebRequest -Uri 'https://github.com/wixtoolset/wix3/releases/download/wix3111rtm/wix311-binaries.zip' -OutFile 'C:\wix311-binaries.zip' -UseBasicParsing;" ^ "Expand-Archive -Path 'C:\wix311-binaries.zip' -DestinationPath 'C:\wix' -Force" del C:\wix311-binaries.zip REM -- Register the build watcher to run at every boot from here on, plus REM kick it off right now too (ONSTART won't retroactively fire for this REM already-in-progress boot). Runs as SYSTEM so it works with no user REM logged in. call :log "registering build watcher ..." schtasks /create /tn "FenigmaBuildWatcher" /sc onstart /ru SYSTEM /rl HIGHEST /tr "C:\OEM\watch_build.bat" /f >> C:\OEM\install.log 2>&1 start "" cmd /c C:\OEM\watch_build.bat call :log "provisioning done" echo DONE > C:\OEM\provisioned.marker if exist Z:\ echo DONE > Z:\PROVISIONED endlocal exit /b 0 :log echo [install.bat] %~1 >> C:\OEM\install.log if exist Z:\ echo [install.bat] %~1 >> Z:\install_progress.log exit /b 0