aluf/windows/build_x64.bat

242 lines
8.4 KiB
Batchfile

@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