@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 login from here on, REM plus kick it off right now too (a fresh login won't retroactively REM fire for this already-logged-in session). Deliberately an All-Users REM Startup-folder entry, NOT a SYSTEM-context Scheduled Task: confirmed REM on a real run that a /ru SYSTEM task can't see Z:\ at all and spins REM forever on watch_build.bat's own "if not exist Z:\" wait -- Z:\ (the REM /shared mount) is mapped per INTERACTIVE session, invisible to a REM SYSTEM task with no session of its own. Startup-folder entries run REM in whichever user's session actually logs in, inheriting their REM drive mappings correctly. call :log "registering build watcher (Startup folder) ..." copy /y C:\OEM\watch_build.bat "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\FenigmaBuildWatcher.bat" >> 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