@echo off setlocal enabledelayedexpansion :: ============================================================================== :: PATHS :: ============================================================================== set "SCRIPT_DIR=%~dp0" set "PROJECT_ROOT=%SCRIPT_DIR%.." set "BUILD_DIR=%PROJECT_ROOT%\build_windows\x64" set "QT_X64_BIN=C:\Qt\6.8.3\msvc2022_64\bin" set "QT_X64_PLUGINS=C:\Qt\6.8.3\msvc2022_64\plugins" set "TRIPLETS_DIR=%PROJECT_ROOT%\custom_triplets" :: ============================================================================== :: ENVIRONMENT SETUP :: ============================================================================== if defined VSINSTALLDIR ( set "VS_INSTALL_DIR=!VSINSTALLDIR!" ) else ( if exist "C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Auxiliary\Build\vcvarsall.bat" ( set "VS_INSTALL_DIR=C:\Program Files\Microsoft Visual Studio\2022\Preview" ) else if exist "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ( set "VS_INSTALL_DIR=C:\Program Files\Microsoft Visual Studio\2022\Enterprise" ) else if exist "C:\Program Files\Microsoft Visual Studio\18\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ( set "VS_INSTALL_DIR=C:\Program Files\Microsoft Visual Studio\18\Enterprise" ) ) if "!VS_INSTALL_DIR:~-1!"=="\" set "VS_INSTALL_DIR=!VS_INSTALL_DIR:~0,-1!" set "VCVARSALL=!VS_INSTALL_DIR!\VC\Auxiliary\Build\vcvarsall.bat" set "VCPKG_EXE=!VS_INSTALL_DIR!\VC\vcpkg\vcpkg.exe" set "VCPKG_CMAKE=!VS_INSTALL_DIR!\VC\vcpkg\scripts\buildsystems\vcpkg.cmake" :: ============================================================================== :: 1. CLEANUP & PREP :: ============================================================================== echo [INFO] Cleaning up previous configurations... if exist "%TRIPLETS_DIR%" rmdir /s /q "%TRIPLETS_DIR%" del "%PROJECT_ROOT%\vcpkg.json" 2>nul :: GENERATE VCPKG.JSON ( echo { echo "name": "yrcrystals", echo "version-string": "1.0.0", echo "builtin-baseline": "b1b19307e2d2ec1eefbdb7ea069de7d4bcd31f01", echo "dependencies": [ "fftw3" ] echo } ) > "%PROJECT_ROOT%\vcpkg.json" :: GENERATE OVERLAY TRIPLET if not exist "%TRIPLETS_DIR%" mkdir "%TRIPLETS_DIR%" ( echo set(VCPKG_TARGET_ARCHITECTURE x64^) echo set(VCPKG_CRT_LINKAGE dynamic^) echo set(VCPKG_LIBRARY_LINKAGE dynamic^) echo set(VCPKG_CMAKE_SYSTEM_NAME Windows^) echo set(VCPKG_PLATFORM_TOOLSET v143^) echo set(VCPKG_ENV_PASSTHROUGH_UNTRACKED LIB LIBPATH INCLUDE PATH^) ) > "%TRIPLETS_DIR%\x64-windows.cmake" :: ============================================================================== :: 2. NINJA HUNT (Explicit Download Check) :: ============================================================================== echo [INFO] Hunting for ARM64 Ninja... :: 1. Ask VCPKG to fetch it (ensures it is on disk) "!VCPKG_EXE!" fetch ninja >nul :: 2. Manually look for the downloaded version to avoid picking up the VS one set "GOOD_NINJA_DIR=" for /d %%d in ("%LOCALAPPDATA%\vcpkg\downloads\tools\ninja\*") do ( if exist "%%d\ninja.exe" set "GOOD_NINJA_DIR=%%d" ) :: 3. Fallback: Ask VCPKG where it is (if manual search failed) if "!GOOD_NINJA_DIR!"=="" ( for /f "delims=" %%i in ('"!VCPKG_EXE!" fetch ninja') do set "GOOD_NINJA_EXE=%%i" for %%F in ("!GOOD_NINJA_EXE!") do set "GOOD_NINJA_DIR=%%~dpF" ) echo [INFO] Found Ninja at: !GOOD_NINJA_DIR! :: ============================================================================== :: 3. IMAGE MAGICK CHECK :: ============================================================================== set "MAGICK_PATH=" where magick >nul 2>nul if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where magick') do set "MAGICK_PATH=%%i" ) if not defined MAGICK_PATH ( for /d %%d in ("C:\Program Files\ImageMagick*") do ( if exist "%%d\magick.exe" set "MAGICK_PATH=%%d\magick.exe" ) ) if defined MAGICK_PATH ( set "CMAKE_MAGICK_ARG=-DMAGICK_EXECUTABLE="!MAGICK_PATH!"" ) else ( set "CMAKE_MAGICK_ARG=" ) :: ============================================================================== :: 4. CONFIGURATION (The Flattened Double Tap) :: ============================================================================== echo [INFO] Setting up Environment... call "!VCVARSALL!" arm64_x64 set "PATH=!GOOD_NINJA_DIR!;!PATH!" if not exist "%BUILD_DIR%" mkdir "%BUILD_DIR%" cd "%BUILD_DIR%" if exist "build.ninja" if exist "CMakeCache.txt" goto BUILD_STEP :CONFIG_ROUND_1 echo [INFO] Attempting CMake Configure (Round 1)... cmake -G "Ninja" ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_PREFIX_PATH="%QT_X64_BIN%\..;%PROJECT_ROOT%\vcpkg_installed\x64-windows" ^ -DCMAKE_TOOLCHAIN_FILE="!VCPKG_CMAKE!" ^ -DVCPKG_TARGET_TRIPLET=x64-windows ^ -DVCPKG_HOST_TRIPLET=arm64-windows ^ -DVCPKG_OVERLAY_TRIPLETS="%TRIPLETS_DIR%" ^ !CMAKE_MAGICK_ARG! ^ "%PROJECT_ROOT%" if %errorlevel% equ 0 goto BUILD_STEP :CONFIG_PATCH echo. echo [WARN] Configuration Failed. Applying "Double Tap" Patch... set "SHADOW_VCPKG=%BUILD_DIR%\vcpkg_installed\x64-windows" set "SHADOW_BIN=!SHADOW_VCPKG!\bin\fftw3.dll" set "SHADOW_TOOLS_DIR=!SHADOW_VCPKG!\tools\fftw3" set "SHADOW_TOOLS_DLL=!SHADOW_TOOLS_DIR!\fftw3.dll" if not exist "!SHADOW_BIN!" ( echo [ERROR] Could not find Shadow Build artifacts to patch. pause exit /b 1 ) if not exist "!SHADOW_TOOLS_DIR!" mkdir "!SHADOW_TOOLS_DIR!" copy /Y "!SHADOW_BIN!" "!SHADOW_TOOLS_DLL!" >nul echo [INFO] Patch Applied. :CONFIG_ROUND_2 echo. echo [INFO] Retrying Configuration (Round 2)... cmake -G "Ninja" ^ -DCMAKE_BUILD_TYPE=Release ^ -DCMAKE_PREFIX_PATH="%QT_X64_BIN%\..;%PROJECT_ROOT%\vcpkg_installed\x64-windows" ^ -DCMAKE_TOOLCHAIN_FILE="!VCPKG_CMAKE!" ^ -DVCPKG_TARGET_TRIPLET=x64-windows ^ -DVCPKG_HOST_TRIPLET=arm64-windows ^ -DVCPKG_OVERLAY_TRIPLETS="%TRIPLETS_DIR%" ^ !CMAKE_MAGICK_ARG! ^ "%PROJECT_ROOT%" if %errorlevel% neq 0 ( echo [ERROR] Configuration Failed even after patch. pause exit /b %errorlevel% ) :BUILD_STEP echo [INFO] Building... cmake --build . if %errorlevel% neq 0 ( echo [ERROR] Build Failed. pause exit /b %errorlevel% ) :: ============================================================================== :: 5. THE NUKE & COPY :: ============================================================================== echo. echo [CLEAN] Removing old DLLs... del /f /q *.dll 2>nul if exist "platforms" rmdir /s /q "platforms" if exist "styles" rmdir /s /q "styles" if exist "multimedia" rmdir /s /q "multimedia" if exist "audio" rmdir /s /q "audio" if exist "imageformats" rmdir /s /q "imageformats" if exist "iconengines" rmdir /s /q "iconengines" if exist "tls" rmdir /s /q "tls" echo. echo [COPY] Copying DLLs... :: Core & Helpers copy /Y "%QT_X64_BIN%\Qt6Core.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6Gui.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6Widgets.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6Multimedia.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6OpenGL.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6OpenGLWidgets.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6Network.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6Svg.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6ShaderTools.dll" . >nul copy /Y "%QT_X64_BIN%\Qt6Concurrent.dll" . >nul copy /Y "%QT_X64_BIN%\d3dcompiler_47.dll" . >nul copy /Y "%QT_X64_BIN%\opengl32sw.dll" . >nul :: FFmpeg copy /Y "%QT_X64_BIN%\avcodec*.dll" . >nul copy /Y "%QT_X64_BIN%\avformat*.dll" . >nul copy /Y "%QT_X64_BIN%\avutil*.dll" . >nul copy /Y "%QT_X64_BIN%\swresample*.dll" . >nul copy /Y "%QT_X64_BIN%\swscale*.dll" . >nul :: Plugins if not exist "platforms" mkdir "platforms" copy /Y "%QT_X64_PLUGINS%\platforms\qwindows.dll" "platforms\" >nul if not exist "styles" mkdir "styles" copy /Y "%QT_X64_PLUGINS%\styles\qwindowsvistastyle.dll" "styles\" >nul if not exist "imageformats" mkdir "imageformats" copy /Y "%QT_X64_PLUGINS%\imageformats\*.dll" "imageformats\" >nul if not exist "multimedia" mkdir "multimedia" copy /Y "%QT_X64_PLUGINS%\multimedia\*.dll" "multimedia\" >nul if not exist "iconengines" mkdir "iconengines" copy /Y "%QT_X64_PLUGINS%\iconengines\*.dll" "iconengines\" >nul if not exist "tls" mkdir "tls" copy /Y "%QT_X64_PLUGINS%\tls\*.dll" "tls\" >nul :: FFTW3 (x64) - Grab from shadow build if present if exist "%BUILD_DIR%\vcpkg_installed\x64-windows\bin\fftw3.dll" ( copy /Y "%BUILD_DIR%\vcpkg_installed\x64-windows\bin\fftw3.dll" . >nul ) echo. echo [SUCCESS] x64 Build Complete. echo [NOTE] This executable requires an x64 machine or Emulator settings to run. pause