From c2f99a603a5f1649b1643d934060bc4d2af5e81c Mon Sep 17 00:00:00 2001 From: pszsh Date: Fri, 30 Jan 2026 01:26:27 -0800 Subject: [PATCH] jesus. i hacked the fuck out of the build environement and got x64 and arm64 bins built on an arm64 virtual machine. There is no way that it is a good a proper build script, but it works... --- .gitignore | 1 + windows/build_x64.bat | 176 +++++++++++++++++++++++------------------- 2 files changed, 98 insertions(+), 79 deletions(-) diff --git a/.gitignore b/.gitignore index d20b6bd..dab6bcf 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ build_windows/ icons *.png vamp-plugin/ +libraries/loop-tempo-estimator/ tests/ ADC-2024/ *.json diff --git a/windows/build_x64.bat b/windows/build_x64.bat index e1ed842..f65ae95 100644 --- a/windows/build_x64.bat +++ b/windows/build_x64.bat @@ -9,10 +9,10 @@ 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 "VCPKG_BIN=%PROJECT_ROOT%\vcpkg_installed\x64-windows\bin" +set "TRIPLETS_DIR=%PROJECT_ROOT%\custom_triplets" :: ============================================================================== -:: ENVIRONMENT SETUP (VS Discovery) +:: ENVIRONMENT SETUP :: ============================================================================== if defined VSINSTALLDIR ( set "VS_INSTALL_DIR=!VSINSTALLDIR!" @@ -32,74 +32,62 @@ set "VCPKG_EXE=!VS_INSTALL_DIR!\VC\vcpkg\vcpkg.exe" set "VCPKG_CMAKE=!VS_INSTALL_DIR!\VC\vcpkg\scripts\buildsystems\vcpkg.cmake" :: ============================================================================== -:: 0. DYNAMIC BASELINE DISCOVERY +:: 1. CLEANUP & PREP :: ============================================================================== -echo [INFO] Probing for latest vcpkg baseline... +echo [INFO] Cleaning up previous configurations... +if exist "%TRIPLETS_DIR%" rmdir /s /q "%TRIPLETS_DIR%" +del "%PROJECT_ROOT%\vcpkg.json" 2>nul -:: 1. Create temporary manifest with empty baseline to provoke the "suggestion" error +:: GENERATE VCPKG.JSON ( echo { echo "name": "yrcrystals", echo "version-string": "1.0.0", - echo "dependencies": [ "fftw3" ], - echo "builtin-baseline": "" + echo "builtin-baseline": "b1b19307e2d2ec1eefbdb7ea069de7d4bcd31f01", + echo "dependencies": [ "fftw3" ] echo } ) > "%PROJECT_ROOT%\vcpkg.json" -:: 2. Run dry-run and capture output (stderr included) -"!VCPKG_EXE!" install --triplet x64-windows --dry-run > "%PROJECT_ROOT%\vcpkg_probe.log" 2>&1 - -:: 3. Extract the hash using PowerShell regex -:: Matches pattern: "builtin-baseline": "HEX_HASH" -set "DETECTED_HASH=" -for /f "usebackq tokens=*" %%H in (`powershell -NoProfile -Command "$content = Get-Content '%PROJECT_ROOT%\vcpkg_probe.log' -Raw; if ($content -match 'builtin-baseline.: .([a-f0-9]+).') { $matches[1] }"`) do ( - set "DETECTED_HASH=%%H" -) - -if "!DETECTED_HASH!"=="" ( - echo [WARNING] Could not auto-detect baseline. Defaulting to standard hash. - set "DETECTED_HASH=b1b19307e2d2ec1eefbdb7ea069de7d4bcd31f01" -) else ( - echo [INFO] Detected Baseline: !DETECTED_HASH! -) - -:: Clean up log -del "%PROJECT_ROOT%\vcpkg_probe.log" 2>nul - -:: 4. Generate Final Manifest with discovered hash -echo [INFO] Writing vcpkg.json... +:: GENERATE OVERLAY TRIPLET +if not exist "%TRIPLETS_DIR%" mkdir "%TRIPLETS_DIR%" ( - echo { - echo "name": "yrcrystals", - echo "version-string": "1.0.0", - echo "builtin-baseline": "!DETECTED_HASH!", - echo "dependencies": [ - echo "fftw3" - echo ] - echo } -) > "%PROJECT_ROOT%\vcpkg.json" + 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" :: ============================================================================== -:: 1. INSTALL DEPENDENCIES (Targeting x64-windows) +:: 2. NINJA HUNT (Explicit Download Check) :: ============================================================================== -echo [INFO] Verifying dependencies for x64... -cd "%PROJECT_ROOT%" -"!VCPKG_EXE!" install --triplet x64-windows +echo [INFO] Hunting for ARM64 Ninja... -if %errorlevel% neq 0 ( - echo [ERROR] VCPKG install failed. - pause - exit /b %errorlevel% +:: 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! + :: ============================================================================== -:: 2. AUTO-DETECT MAGICK +:: 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" - echo [INFO] Found Magick in PATH. ) if not defined MAGICK_PATH ( for /d %%d in ("C:\Program Files\ImageMagick*") do ( @@ -107,44 +95,76 @@ if not defined MAGICK_PATH ( ) ) if defined MAGICK_PATH ( - echo [INFO] Using ImageMagick: !MAGICK_PATH! set "CMAKE_MAGICK_ARG=-DMAGICK_EXECUTABLE="!MAGICK_PATH!"" ) else ( - echo [WARNING] ImageMagick not found. Icons will be skipped. set "CMAKE_MAGICK_ARG=" ) :: ============================================================================== -:: 3. CONFIGURE & BUILD +:: 4. CONFIGURATION (The Flattened Double Tap) :: ============================================================================== -echo [INFO] Setting up Environment for x64 Build... -:: CRITICAL: arm64_x64 means "Use ARM64 host to build x64 binaries" +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%" -set "NEED_CONFIG=0" -if not exist "build.ninja" set "NEED_CONFIG=1" -if not exist "CMakeCache.txt" set "NEED_CONFIG=1" +if exist "build.ninja" if exist "CMakeCache.txt" goto BUILD_STEP -if "!NEED_CONFIG!"=="1" ( - echo [INFO] Build configuration missing. Running CMake Configure... - 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 ^ - !CMAKE_MAGICK_ARG! ^ - "%PROJECT_ROOT%" - - if !errorlevel! neq 0 ( - echo [ERROR] Configuration Failed. - pause - exit /b !errorlevel! - ) +: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 . @@ -155,10 +175,10 @@ if %errorlevel% neq 0 ( ) :: ============================================================================== -:: 4. THE NUKE (Clean Slate) +:: 5. THE NUKE & COPY :: ============================================================================== echo. -echo [CLEAN] Removing old DLLs and Plugins... +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" @@ -168,9 +188,6 @@ if exist "imageformats" rmdir /s /q "imageformats" if exist "iconengines" rmdir /s /q "iconengines" if exist "tls" rmdir /s /q "tls" -:: ============================================================================== -:: 5. COPY DEPENDENCIES (x64 Source) -:: ============================================================================== echo. echo [COPY] Copying DLLs... @@ -214,11 +231,12 @@ 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) -if exist "%VCPKG_BIN%\fftw3.dll" ( - copy /Y "%VCPKG_BIN%\fftw3.dll" . >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 \ No newline at end of file