From 3d8e63da9e5f55c27888f995b688a18c0b390379 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 2 Sep 2023 14:59:08 +1000 Subject: [PATCH] Scripts: Add Windows dependency build scripts --- dep/msvc/.gitignore | 3 + scripts/build-dependencies-windows-arm64.bat | 171 +++++++++++++++++++ scripts/build-dependencies-windows-x64.bat | 165 ++++++++++++++++++ scripts/cmake-toolchain-windows-arm64.cmake | 4 + 4 files changed, 343 insertions(+) create mode 100644 dep/msvc/.gitignore create mode 100644 scripts/build-dependencies-windows-arm64.bat create mode 100644 scripts/build-dependencies-windows-x64.bat create mode 100644 scripts/cmake-toolchain-windows-arm64.cmake diff --git a/dep/msvc/.gitignore b/dep/msvc/.gitignore new file mode 100644 index 000000000..79371b695 --- /dev/null +++ b/dep/msvc/.gitignore @@ -0,0 +1,3 @@ +deps-arm64/ +deps-x64/ + diff --git a/scripts/build-dependencies-windows-arm64.bat b/scripts/build-dependencies-windows-arm64.bat new file mode 100644 index 000000000..60f49b137 --- /dev/null +++ b/scripts/build-dependencies-windows-arm64.bat @@ -0,0 +1,171 @@ +@echo off +setlocal enabledelayedexpansion + +echo Setting environment... +if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" +) else if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsamd64_arm64.bat" +) else ( + echo Visual Studio 2022 not found. + goto error +) + +set SEVENZIP="C:\Program Files\7-Zip\7z.exe" + +if defined DEBUG ( + echo DEBUG=%DEBUG% +) else ( + set DEBUG=1 +) + +pushd %~dp0 +set "SCRIPTDIR=%CD%" +cd ..\dep\msvc +mkdir deps-build +cd deps-build || goto error +set "BUILDDIR=%CD%" +cd .. +mkdir deps-arm64 +cd deps-arm64 || goto error +set "INSTALLDIR=%CD%" +cd .. +cd deps-x64 || goto error +set "X64INSTALLDIR=%CD%" +cd .. +popd + +echo SCRIPTDIR=%SCRIPTDIR% +echo BUILDDIR=%BUILDDIR% +echo INSTALLDIR=%INSTALLDIR% + +cd "%BUILDDIR%" + +set QT=6.5.2 +set QTMINOR=6.5 +set SDL=SDL2-2.28.2 + +call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" 22383a6b242bac072f949d2b3854cf04c6856cae7a87eaa78c60dd733b71e41e || goto error +call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" f770a087e350d688441880d08ad2791465e5e3b9a0f8fc2cfbeb5dd305a11d50 || goto error +call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" 9757899b00eea4e6b65f81f922c0215c70969661567398d91da6639a50a788e7 || goto error +call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" 0546a6aa19f5e0188d1ba4a0e0a1423d22b7dc55ce8a614cc4aa65bfac506f74 || goto error +call :downloadfile "qttools-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttools-everywhere-src-%QT%.zip" 3148f4f263bf9930d89107eb44bc452481a5f8c6178459e26ecbf3c8dca3b5c7 || goto error +call :downloadfile "qttranslations-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttranslations-everywhere-src-%QT%.zip" 8b99046b54c40106d4e310be63b41331b717cfd8b42da4b4fc1c9169604be7fc || goto error + +call :downloadfile "4b119f48f5cb5e1499f91a0791150231c47430d4.diff" "https://github.com/qt/qtbase/commit/4b119f48f5cb5e1499f91a0791150231c47430d4.diff" d86bd2bd4ee2aff5f5e97da027aa926178dca250d163427eb21503bb357730a5 || goto error + +if %DEBUG%==1 ( + echo Building debug and release libraries... +) else ( + echo Building release libraries... +) + +set ARM64TOOLCHAIN=-DCMAKE_TOOLCHAIN_FILE="%SCRIPTDIR%\cmake-toolchain-windows-arm64.cmake" + +echo Building SDL... +rmdir /S /Q "%SDL%" +%SEVENZIP% x "%SDL%.zip" || goto error +cd "%SDL%" || goto error +if %DEBUG%==1 ( + cmake -B build-debug %ARM64TOOLCHAIN% -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DBUILD_SHARED_LIBS=ON -DSDL_SHARED=ON -DSDL_STATIC=OFF -G Ninja || goto error + cmake --build build-debug --parallel || goto error + ninja -C build-debug install || goto error +) +cmake -B build %ARM64TOOLCHAIN% -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DBUILD_SHARED_LIBS=ON -DSDL_SHARED=ON -DSDL_STATIC=OFF -G Ninja || goto error +cmake --build build --parallel || goto error +ninja -C build install || goto error +cd .. || goto error + +if %DEBUG%==1 ( + set QTBUILDSPEC=-DCMAKE_CONFIGURATION_TYPES="Release;Debug" -G "Ninja Multi-Config" +) else ( + set QTBUILDSPEC=-DCMAKE_BUILD_TYPE=Release -G Ninja +) + +echo Building Qt base... +rmdir /S /Q "qtbase-everywhere-src-%QT%" +%SEVENZIP% x "qtbase-everywhere-src-%QT%.zip" || goto error +cd "qtbase-everywhere-src-%QT%" || goto error +"C:\Program Files\Git\usr\bin\patch" -p1 < ../4b119f48f5cb5e1499f91a0791150231c47430d4.diff || goto error +cmake -B build %ARM64TOOLCHAIN% -DFEATURE_sql=OFF -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DQT_HOST_PATH="%X64INSTALLDIR%" -DINPUT_gui=yes -DINPUT_widgets=yes -DINPUT_ssl=yes -DINPUT_openssl=no -DINPUT_schannel=yes %QTBUILDSPEC% || goto error +cmake --build build --parallel || goto error +ninja -C build install || goto error +cd .. || goto error + +echo Building Qt SVG... +rmdir /S /Q "qtsvg-everywhere-src-%QT%" +%SEVENZIP% x "qtsvg-everywhere-src-%QT%.zip" || goto error +cd "qtsvg-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Building Qt Image Formats... +rmdir /S /Q "qtimageformats-everywhere-src-%QT%" +%SEVENZIP% x "qtimageformats-everywhere-src-%QT%.zip" || goto error +cd "qtimageformats-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Building Qt Tools... +rmdir /S /Q "qtimageformats-everywhere-src-%QT%" +%SEVENZIP% x "qttools-everywhere-src-%QT%.zip" || goto error +cd "qttools-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. -- -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=OFF -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Building Qt Translations... +rmdir /S /Q "qttranslations-everywhere-src-%QT%" +%SEVENZIP% x "qttranslations-everywhere-src-%QT%.zip" || goto error +cd "qttranslations-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Cleaning up... +cd .. +rd /S /Q deps-build + +echo Exiting with success. +exit 0 + +:error +echo Failed with error #%errorlevel%. +pause +exit %errorlevel% + +:downloadfile +if not exist "%~1" ( + echo Downloading %~1 from %~2... + curl -L -o "%~1" "%~2" || goto error +) + +rem based on https://gist.github.com/gsscoder/e22daefaff9b5d8ac16afb070f1a7971 +set idx=0 +for /f %%F in ('certutil -hashfile "%~1" SHA256') do ( + set "out!idx!=%%F" + set /a idx += 1 +) +set filechecksum=%out1% + +if /i %~3==%filechecksum% ( + echo Validated %~1. + exit /B 0 +) else ( + echo Expected %~3 got %filechecksum%. + exit /B 1 +) diff --git a/scripts/build-dependencies-windows-x64.bat b/scripts/build-dependencies-windows-x64.bat new file mode 100644 index 000000000..c46d303b4 --- /dev/null +++ b/scripts/build-dependencies-windows-x64.bat @@ -0,0 +1,165 @@ +@echo off +setlocal enabledelayedexpansion + +echo Setting environment... +if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat" +) else if exist "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" ( + call "%ProgramFiles%\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat" +) else ( + echo Visual Studio 2022 not found. + goto error +) + +set SEVENZIP="C:\Program Files\7-Zip\7z.exe" + +if defined DEBUG ( + echo DEBUG=%DEBUG% +) else ( + set DEBUG=1 +) + +pushd %~dp0 +set "SCRIPTDIR=%CD%" +cd ..\dep\msvc +mkdir deps-build +cd deps-build || goto error +set "BUILDDIR=%CD%" +cd .. +mkdir deps-x64 +cd deps-x64 || goto error +set "INSTALLDIR=%CD%" +popd + +echo SCRIPTDIR=%SCRIPTDIR% +echo BUILDDIR=%BUILDDIR% +echo INSTALLDIR=%INSTALLDIR% + +cd "%BUILDDIR%" + +set QT=6.5.2 +set QTMINOR=6.5 +set SDL=SDL2-2.28.2 + +call :downloadfile "%SDL%.zip" "https://libsdl.org/release/%SDL%.zip" 22383a6b242bac072f949d2b3854cf04c6856cae7a87eaa78c60dd733b71e41e || goto error +call :downloadfile "qtbase-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtbase-everywhere-src-%QT%.zip" f770a087e350d688441880d08ad2791465e5e3b9a0f8fc2cfbeb5dd305a11d50 || goto error +call :downloadfile "qtimageformats-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtimageformats-everywhere-src-%QT%.zip" 9757899b00eea4e6b65f81f922c0215c70969661567398d91da6639a50a788e7 || goto error +call :downloadfile "qtsvg-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qtsvg-everywhere-src-%QT%.zip" 0546a6aa19f5e0188d1ba4a0e0a1423d22b7dc55ce8a614cc4aa65bfac506f74 || goto error +call :downloadfile "qttools-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttools-everywhere-src-%QT%.zip" 3148f4f263bf9930d89107eb44bc452481a5f8c6178459e26ecbf3c8dca3b5c7 || goto error +call :downloadfile "qttranslations-everywhere-src-%QT%.zip" "https://download.qt.io/official_releases/qt/%QTMINOR%/%QT%/submodules/qttranslations-everywhere-src-%QT%.zip" 8b99046b54c40106d4e310be63b41331b717cfd8b42da4b4fc1c9169604be7fc || goto error + +call :downloadfile "4b119f48f5cb5e1499f91a0791150231c47430d4.diff" "https://github.com/qt/qtbase/commit/4b119f48f5cb5e1499f91a0791150231c47430d4.diff" d86bd2bd4ee2aff5f5e97da027aa926178dca250d163427eb21503bb357730a5 || goto error + +if %DEBUG%==1 ( + echo Building debug and release libraries... +) else ( + echo Building release libraries... +) + +echo Building SDL... +rmdir /S /Q "%SDL%" +%SEVENZIP% x "%SDL%.zip" || goto error +cd "%SDL%" || goto error +if %DEBUG%==1 ( + cmake -B build-debug -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DBUILD_SHARED_LIBS=ON -DSDL_SHARED=ON -DSDL_STATIC=OFF -G Ninja || goto error + cmake --build build-debug --parallel || goto error + ninja -C build-debug install || goto error +) +cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DBUILD_SHARED_LIBS=ON -DSDL_SHARED=ON -DSDL_STATIC=OFF -G Ninja || goto error +cmake --build build --parallel || goto error +ninja -C build install || goto error +cd .. || goto error + +if %DEBUG%==1 ( + set QTBUILDSPEC=-DCMAKE_CONFIGURATION_TYPES="Release;Debug" -G "Ninja Multi-Config" +) else ( + set QTBUILDSPEC=-DCMAKE_BUILD_TYPE=Release -G Ninja +) + +echo Building Qt base... +rmdir /S /Q "qtbase-everywhere-src-%QT%" +%SEVENZIP% x "qtbase-everywhere-src-%QT%.zip" || goto error +cd "qtbase-everywhere-src-%QT%" || goto error +"C:\Program Files\Git\usr\bin\patch" -p1 < ../4b119f48f5cb5e1499f91a0791150231c47430d4.diff || goto error +cmake -B build -DFEATURE_sql=OFF -DCMAKE_INSTALL_PREFIX="%INSTALLDIR%" -DINPUT_gui=yes -DINPUT_widgets=yes -DINPUT_ssl=yes -DINPUT_openssl=no -DINPUT_schannel=yes %QTBUILDSPEC% || goto error +cmake --build build --parallel || goto error +ninja -C build install || goto error +cd .. || goto error + +echo Building Qt SVG... +rmdir /S /Q "qtsvg-everywhere-src-%QT%" +%SEVENZIP% x "qtsvg-everywhere-src-%QT%.zip" || goto error +cd "qtsvg-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Building Qt Image Formats... +rmdir /S /Q "qtimageformats-everywhere-src-%QT%" +%SEVENZIP% x "qtimageformats-everywhere-src-%QT%.zip" || goto error +cd "qtimageformats-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Building Qt Tools... +rmdir /S /Q "qtimageformats-everywhere-src-%QT%" +%SEVENZIP% x "qttools-everywhere-src-%QT%.zip" || goto error +cd "qttools-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. -- -DFEATURE_assistant=OFF -DFEATURE_clang=OFF -DFEATURE_designer=OFF -DFEATURE_kmap2qmap=OFF -DFEATURE_pixeltool=OFF -DFEATURE_pkg_config=OFF -DFEATURE_qev=OFF -DFEATURE_qtattributionsscanner=OFF -DFEATURE_qtdiag=OFF -DFEATURE_qtplugininfo=OFF || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Building Qt Translations... +rmdir /S /Q "qttranslations-everywhere-src-%QT%" +%SEVENZIP% x "qttranslations-everywhere-src-%QT%.zip" || goto error +cd "qttranslations-everywhere-src-%QT%" || goto error +mkdir build || goto error +cd build || goto error +call "%INSTALLDIR%\bin\qt-configure-module.bat" .. || goto error +cmake --build . --parallel || goto error +ninja install || goto error +cd ..\.. || goto error + +echo Cleaning up... +cd .. +rd /S /Q deps-build + +echo Exiting with success. +exit 0 + +:error +echo Failed with error #%errorlevel%. +pause +exit %errorlevel% + +:downloadfile +if not exist "%~1" ( + echo Downloading %~1 from %~2... + curl -L -o "%~1" "%~2" || goto error +) + +rem based on https://gist.github.com/gsscoder/e22daefaff9b5d8ac16afb070f1a7971 +set idx=0 +for /f %%F in ('certutil -hashfile "%~1" SHA256') do ( + set "out!idx!=%%F" + set /a idx += 1 +) +set filechecksum=%out1% + +if /i %~3==%filechecksum% ( + echo Validated %~1. + exit /B 0 +) else ( + echo Expected %~3 got %filechecksum%. + exit /B 1 +) diff --git a/scripts/cmake-toolchain-windows-arm64.cmake b/scripts/cmake-toolchain-windows-arm64.cmake new file mode 100644 index 000000000..94bd86546 --- /dev/null +++ b/scripts/cmake-toolchain-windows-arm64.cmake @@ -0,0 +1,4 @@ +set(CMAKE_CROSSCOMPILING TRUE) +set(CMAKE_SYSTEM_NAME Windows) +set(CMAKE_SYSTEM_VERSION 10) +set(CMAKE_SYSTEM_PROCESSOR arm64) \ No newline at end of file