aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build.yml151
-rw-r--r--.github/workflows/trigger_release.yml20
-rw-r--r--.gitignore3
-rw-r--r--.gitmodules6
-rw-r--r--CMakeLists.txt113
-rw-r--r--README.md35
-rw-r--r--cmake/MacOSXBundleInfo.plist.in23
-rw-r--r--launcher/Application.cpp94
-rw-r--r--launcher/Application.h10
-rw-r--r--launcher/BaseInstaller.h5
-rw-r--r--launcher/BaseVersion.h5
-rw-r--r--launcher/BaseVersionList.cpp10
-rw-r--r--launcher/BaseVersionList.h8
-rw-r--r--launcher/CMakeLists.txt144
-rw-r--r--launcher/InstanceCopyPrefs.cpp135
-rw-r--r--launcher/InstanceCopyPrefs.h41
-rw-r--r--launcher/InstanceCopyTask.cpp10
-rw-r--r--launcher/InstanceCopyTask.h16
-rw-r--r--launcher/java/JavaInstallList.cpp10
-rw-r--r--launcher/java/JavaInstallList.h6
-rw-r--r--launcher/java/JavaUtils.cpp25
-rw-r--r--launcher/main.cpp2
-rw-r--r--launcher/meta/Index.cpp16
-rw-r--r--launcher/meta/Index.h17
-rw-r--r--launcher/meta/JsonFormat.cpp18
-rw-r--r--launcher/meta/Version.cpp4
-rw-r--r--launcher/meta/Version.h11
-rw-r--r--launcher/meta/VersionList.cpp30
-rw-r--r--launcher/meta/VersionList.h32
-rw-r--r--launcher/minecraft/VanillaInstanceCreationTask.cpp2
-rw-r--r--launcher/minecraft/VanillaInstanceCreationTask.h8
-rw-r--r--launcher/modplatform/ModAPI.h2
-rw-r--r--launcher/modplatform/atlauncher/ATLPackInstallTask.cpp4
-rw-r--r--launcher/modplatform/atlauncher/ATLPackInstallTask.h6
-rw-r--r--launcher/modplatform/modrinth/ModrinthPackManifest.cpp2
-rw-r--r--launcher/net/HttpMetaCache.cpp2
-rw-r--r--launcher/resources/backgrounds/backgrounds.qrc3
-rw-r--r--launcher/resources/backgrounds/kitteh-spooky.pngbin0 -> 94677 bytes
-rw-r--r--launcher/resources/backgrounds/rory-flat-spooky.pngbin0 -> 66906 bytes
-rw-r--r--launcher/resources/backgrounds/rory-spooky.pngbin0 -> 95940 bytes
-rw-r--r--launcher/ui/MainWindow.cpp43
-rw-r--r--launcher/ui/MainWindow.h2
-rw-r--r--launcher/ui/dialogs/CopyInstanceDialog.cpp100
-rw-r--r--launcher/ui/dialogs/CopyInstanceDialog.h19
-rw-r--r--launcher/ui/dialogs/CopyInstanceDialog.ui121
-rw-r--r--launcher/ui/dialogs/VersionSelectDialog.cpp2
-rw-r--r--launcher/ui/dialogs/VersionSelectDialog.h2
-rw-r--r--launcher/ui/pages/global/LauncherPage.cpp45
-rw-r--r--launcher/ui/pages/modplatform/VanillaPage.cpp8
-rw-r--r--launcher/ui/pages/modplatform/VanillaPage.h12
-rw-r--r--launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.cpp2
-rw-r--r--launcher/ui/pages/modplatform/atlauncher/AtlUserInteractionSupportImpl.h2
-rw-r--r--launcher/ui/themes/CustomTheme.cpp239
-rw-r--r--launcher/ui/themes/CustomTheme.h46
-rw-r--r--launcher/ui/themes/SystemTheme.cpp45
-rw-r--r--launcher/ui/themes/ThemeManager.cpp155
-rw-r--r--launcher/ui/themes/ThemeManager.h52
-rw-r--r--launcher/ui/widgets/JavaSettingsWidget.cpp2
-rw-r--r--launcher/ui/widgets/JavaSettingsWidget.h2
-rw-r--r--launcher/ui/widgets/ModFilterWidget.h4
-rw-r--r--launcher/ui/widgets/VersionSelectWidget.cpp6
-rw-r--r--launcher/ui/widgets/VersionSelectWidget.h4
m---------libraries/extra-cmake-modules0
-rw-r--r--libraries/hoedown/src/autolink.c6
m---------libraries/zlib0
-rw-r--r--program_info/CMakeLists.txt1
-rw-r--r--program_info/modrinth-mrpack-mime.xml9
-rw-r--r--program_info/org.prismlauncher.PrismLauncher.desktop.in1
-rw-r--r--snap/snapcraft.yaml55
-rw-r--r--tests/GZip_test.cpp2
70 files changed, 1459 insertions, 557 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index c74d8c4f..3225cf1e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -25,8 +25,10 @@ jobs:
- os: ubuntu-20.04
qt_ver: 6
qt_host: linux
+ qt_arch: ''
qt_version: '6.2.4'
qt_modules: 'qt5compat qtimageformats'
+ qt_tools: ''
- os: windows-2022
name: "Windows-Legacy"
@@ -38,13 +40,39 @@ jobs:
msystem: clang64
qt_ver: 6
+ - os: windows-2022
+ name: "Windows-Legacy-MSVC"
+ msystem: ''
+ architecture: 'win32'
+ vcvars_arch: 'amd64_x86'
+ qt_ver: 5
+ qt_host: windows
+ qt_arch: 'win32_msvc2019'
+ qt_version: '5.15.2'
+ qt_modules: ''
+ qt_tools: 'tools_openssl_x86'
+
+ - os: windows-2022
+ name: "Windows-MSVC"
+ msystem: ''
+ architecture: 'x64'
+ vcvars_arch: 'amd64'
+ qt_ver: 6
+ qt_host: windows
+ qt_arch: ''
+ qt_version: '6.4.0'
+ qt_modules: 'qt5compat qtimageformats'
+ qt_tools: ''
+
- os: macos-12
name: macOS
macosx_deployment_target: 10.15
qt_ver: 6
qt_host: mac
+ qt_arch: ''
qt_version: '6.3.0'
qt_modules: 'qt5compat qtimageformats'
+ qt_tools: ''
- os: macos-12
name: macOS-Legacy
@@ -53,6 +81,7 @@ jobs:
qt_host: mac
qt_version: '5.15.2'
qt_modules: ''
+ qt_tools: ''
runs-on: ${{ matrix.os }}
@@ -82,7 +111,7 @@ jobs:
languages: cpp, java
- name: 'Setup MSYS2'
- if: runner.os == 'Windows'
+ if: runner.os == 'Windows' && matrix.msystem != ''
uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.msystem }}
@@ -102,14 +131,19 @@ jobs:
ccache:p
${{ matrix.qt_ver == 6 && 'qt6-5compat:p' || '' }}
+ - name: Force newer ccache
+ if: runner.os == 'Windows' && matrix.msystem == '' && inputs.build_type == 'Debug'
+ run: |
+ choco install ccache --version 4.7.1
+
- name: Setup ccache
- if: runner.os != 'Windows' && inputs.build_type == 'Debug'
- uses: hendrikmuhs/ccache-action@v1.2.4
+ if: (runner.os != 'Windows' || matrix.msystem == '') && inputs.build_type == 'Debug'
+ uses: hendrikmuhs/ccache-action@v1.2.5
with:
key: ${{ matrix.os }}-qt${{ matrix.qt_ver }}
- - name: Setup ccache (Windows)
- if: runner.os == 'Windows' && inputs.build_type == 'Debug'
+ - name: Setup ccache (Windows MinGW-w64)
+ if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug'
shell: msys2 {0}
run: |
ccache --set-config=cache_dir='${{ github.workspace }}\.ccache'
@@ -124,8 +158,8 @@ jobs:
run: |
echo "CCACHE_VAR=ccache" >> $GITHUB_ENV
- - name: Retrieve ccache cache (Windows)
- if: runner.os == 'Windows' && inputs.build_type == 'Debug'
+ - name: Retrieve ccache cache (Windows MinGW-w64)
+ if: runner.os == 'Windows' && matrix.msystem != '' && inputs.build_type == 'Debug'
uses: actions/cache@v3.0.11
with:
path: '${{ github.workspace }}\.ccache'
@@ -156,14 +190,16 @@ jobs:
run: |
sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5
- - name: Install Qt (macOS and AppImage)
- if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS'
+ - name: Install Qt (macOS, AppImage & Windows MSVC)
+ if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' || (runner.os == 'Windows' && matrix.msystem == '')
uses: jurplel/install-qt-action@v3
with:
version: ${{ matrix.qt_version }}
host: ${{ matrix.qt_host }}
target: 'desktop'
+ arch: ${{ matrix.qt_arch }}
modules: ${{ matrix.qt_modules }}
+ tools: ${{ matrix.qt_tools }}
cache: true
cache-key-prefix: ${{ matrix.qt_host }}-${{ matrix.qt_version }}-"${{ matrix.qt_modules }}"-qt_cache
@@ -190,12 +226,27 @@ jobs:
run: |
cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DMACOSX_SPARKLE_UPDATE_PUBLIC_KEY="" -DMACOSX_SPARKLE_UPDATE_FEED_URL="" -G Ninja
- - name: Configure CMake (Windows)
- if: runner.os == 'Windows'
+ - name: Configure CMake (Windows MinGW-w64)
+ if: runner.os == 'Windows' && matrix.msystem != ''
shell: msys2 {0}
run: |
cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DCMAKE_C_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DCMAKE_CXX_COMPILER_LAUNCHER=${{ env.CCACHE_VAR }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_OBJDUMP=/mingw64/bin/objdump.exe -G Ninja
+ - name: Configure CMake (Windows MSVC)
+ if: runner.os == 'Windows' && matrix.msystem == ''
+ run: |
+ cmake -S . -B ${{ env.BUILD_DIR }} -DCMAKE_INSTALL_PREFIX=${{ env.INSTALL_DIR }} -DCMAKE_BUILD_TYPE=${{ inputs.build_type }} -DENABLE_LTO=ON -DLauncher_BUILD_PLATFORM=${{ matrix.name }} -DLauncher_QT_VERSION_MAJOR=${{ matrix.qt_ver }} -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreadedDLL" -A${{ matrix.architecture}}
+ # https://github.com/ccache/ccache/wiki/MS-Visual-Studio (I coudn't figure out the compiler prefix)
+ if ("${{ env.CCACHE_VAR }}")
+ {
+ Copy-Item C:/ProgramData/chocolatey/lib/ccache/tools/ccache-4.7.1-windows-x86_64/ccache.exe -Destination C:/ProgramData/chocolatey/lib/ccache/tools/ccache-4.7.1-windows-x86_64/cl.exe
+ echo "CLToolExe=cl.exe" >> $env:GITHUB_ENV
+ echo "CLToolPath=C:/ProgramData/chocolatey/lib/ccache/tools/ccache-4.7.1-windows-x86_64/" >> $env:GITHUB_ENV
+ echo "TrackFileAccess=false" >> $env:GITHUB_ENV
+ }
+ # Needed for ccache, but also speeds up compile
+ echo "UseMultiToolTask=true" >> $env:GITHUB_ENV
+
- name: Configure CMake (Linux)
if: runner.os == 'Linux'
run: |
@@ -210,12 +261,17 @@ jobs:
run: |
cmake --build ${{ env.BUILD_DIR }}
- - name: Build (Windows)
- if: runner.os == 'Windows'
+ - name: Build (Windows MinGW-w64)
+ if: runner.os == 'Windows' && matrix.msystem != ''
shell: msys2 {0}
run: |
cmake --build ${{ env.BUILD_DIR }}
+ - name: Build (Windows MSVC)
+ if: runner.os == 'Windows' && matrix.msystem == ''
+ run: |
+ cmake --build ${{ env.BUILD_DIR }} --config ${{ inputs.build_type }}
+
##
# TEST
##
@@ -223,13 +279,18 @@ jobs:
- name: Test
if: runner.os != 'Windows'
run: |
- ctest --test-dir build --output-on-failure
+ ctest -E "^example64|example$" --test-dir build --output-on-failure
- - name: Test (Windows)
- if: runner.os == 'Windows'
+ - name: Test (Windows MinGW-w64)
+ if: runner.os == 'Windows' && matrix.msystem != ''
shell: msys2 {0}
run: |
- ctest --test-dir build --output-on-failure
+ ctest -E "^example64|example$" --test-dir build --output-on-failure
+
+ - name: Test (Windows MSVC)
+ if: runner.os == 'Windows' && matrix.msystem == ''
+ run: |
+ ctest -E "^example64|example$" --test-dir build --output-on-failure -C ${{ inputs.build_type }}
##
# CODE SCAN
@@ -273,8 +334,14 @@ jobs:
EOF
fi
- - name: Package (Windows)
- if: runner.os == 'Windows'
+ - name: Add VC Enviroment Variables
+ if: runner.os == 'Windows' && matrix.msystem == ''
+ uses: ilammy/msvc-dev-cmd@v1
+ with:
+ arch: ${{ matrix.vcvars_arch }}
+
+ - name: Package (Windows MinGW-w64)
+ if: runner.os == 'Windows' && matrix.msystem != ''
shell: msys2 {0}
run: |
cmake --install ${{ env.BUILD_DIR }}
@@ -284,13 +351,31 @@ jobs:
cp /clang32/bin/libcrypto-1_1.dll /clang32/bin/libssl-1_1.dll ./
fi
- - name: Package (Windows, portable)
- if: runner.os == 'Windows'
+ - name: Package (Windows MSVC)
+ if: runner.os == 'Windows' && matrix.msystem == ''
+ run: |
+ cmake --install ${{ env.BUILD_DIR }} --config ${{ inputs.build_type }}
+
+ cd ${{ env.INSTALL_DIR }}
+ if ("${{ matrix.qt_ver }}" -eq "5")
+ {
+ Copy-Item D:/a/PrismLauncher/Qt/Tools/OpenSSL/Win_x86/bin/libcrypto-1_1.dll -Destination libcrypto-1_1.dll
+ Copy-Item D:/a/PrismLauncher/Qt/Tools/OpenSSL/Win_x86/bin/libssl-1_1.dll -Destination libssl-1_1.dll
+ }
+
+ - name: Package (Windows MinGW-w64, portable)
+ if: runner.os == 'Windows' && matrix.msystem != ''
shell: msys2 {0}
run: |
cp -r ${{ env.INSTALL_DIR }} ${{ env.INSTALL_PORTABLE_DIR }} # cmake install on Windows is slow, let's just copy instead
cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable
+ - name: Package (Windows MSVC, portable)
+ if: runner.os == 'Windows' && matrix.msystem == ''
+ run: |
+ cp -r ${{ env.INSTALL_DIR }} ${{ env.INSTALL_PORTABLE_DIR }} # cmake install on Windows is slow, let's just copy instead
+ cmake --install ${{ env.BUILD_DIR }} --prefix ${{ env.INSTALL_PORTABLE_DIR }} --component portable
+
- name: Package (Windows, installer)
if: runner.os == 'Windows'
run: |
@@ -411,5 +496,25 @@ jobs:
with:
name: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-${{ inputs.build_type }}-x86_64.AppImage
path: PrismLauncher-${{ runner.os }}-${{ env.VERSION }}-${{ inputs.build_type }}-x86_64.AppImage
-
-
+ snap:
+ runs-on: ubuntu-20.04
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ with:
+ submodules: 'true'
+ - name: Set short version
+ shell: bash
+ run: |
+ ver_short=`git rev-parse --short HEAD`
+ echo "VERSION=$ver_short" >> $GITHUB_ENV
+ - name: Package Snap (Linux)
+ id: snapcraft
+ if: runner.os == 'Linux' && matrix.qt_ver != 5
+ uses: snapcore/action-build@v1
+ - name: Upload Snap (Linux)
+ if: runner.os == 'Linux' && matrix.qt_ver != 5
+ uses: actions/upload-artifact@v3
+ with:
+ name: prismlauncher_${{ env.VERSION }}_amd64.snap
+ path: ${{ steps.snapcraft.outputs.snap }}
diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml
index e74e870a..d415b2b1 100644
--- a/.github/workflows/trigger_release.yml
+++ b/.github/workflows/trigger_release.yml
@@ -47,10 +47,12 @@ jobs:
for d in PrismLauncher-Windows-*; do
cd "${d}" || continue
+ MSVC="$(echo -n ${d} | grep -o MSVC || true)"
LEGACY="$(echo -n ${d} | grep -o Legacy || true)"
INST="$(echo -n ${d} | grep -o Setup || true)"
PORT="$(echo -n ${d} | grep -o Portable || true)"
NAME="PrismLauncher-Windows"
+ test -z "${MSVC}" && NAME="${NAME}-MinGW" || NAME="${NAME}-MSVC"
test -z "${LEGACY}" || NAME="${NAME}-Legacy"
test -z "${PORT}" || NAME="${NAME}-Portable"
test -z "${INST}" || mv PrismLauncher-*.exe ../${NAME}-Setup-${{ env.VERSION }}.exe
@@ -72,14 +74,20 @@ jobs:
PrismLauncher-Linux-${{ env.VERSION }}.tar.gz
PrismLauncher-Linux-Portable-${{ env.VERSION }}.tar.gz
PrismLauncher-Linux-${{ env.VERSION }}-x86_64.AppImage
- PrismLauncher-Windows-Legacy-${{ env.VERSION }}.zip
PrismLauncher-Linux-Qt6-${{ env.VERSION }}.tar.gz
PrismLauncher-Linux-Qt6-Portable-${{ env.VERSION }}.tar.gz
- PrismLauncher-Windows-Legacy-Portable-${{ env.VERSION }}.zip
- PrismLauncher-Windows-Legacy-Setup-${{ env.VERSION }}.exe
- PrismLauncher-Windows-${{ env.VERSION }}.zip
- PrismLauncher-Windows-Portable-${{ env.VERSION }}.zip
- PrismLauncher-Windows-Setup-${{ env.VERSION }}.exe
+ PrismLauncher-Windows-MinGW-Legacy-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MinGW-Legacy-Portable-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MinGW-Legacy-Setup-${{ env.VERSION }}.exe
+ PrismLauncher-Windows-MinGW-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MinGW-Portable-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MinGW-Setup-${{ env.VERSION }}.exe
+ PrismLauncher-Windows-MSVC-Legacy-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MSVC-Legacy-Portable-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MSVC-Legacy-Setup-${{ env.VERSION }}.exe
+ PrismLauncher-Windows-MSVC-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MSVC-Portable-${{ env.VERSION }}.zip
+ PrismLauncher-Windows-MSVC-Setup-${{ env.VERSION }}.exe
PrismLauncher-macOS-${{ env.VERSION }}.tar.gz
PrismLauncher-macOS-Legacy-${{ env.VERSION }}.tar.gz
PrismLauncher-${{ env.VERSION }}.tar.gz
diff --git a/.gitignore b/.gitignore
index f5917a46..010bc323 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,3 +47,6 @@ result/
# Flatpak
.flatpak-builder
flatbuild
+
+# Snap
+*.snap
diff --git a/.gitmodules b/.gitmodules
index 8d034354..95274f15 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,3 +10,9 @@
[submodule "libraries/libnbtplusplus"]
path = libraries/libnbtplusplus
url = https://github.com/PrismLauncher/libnbtplusplus.git
+[submodule "libraries/zlib"]
+ path = libraries/zlib
+ url = https://github.com/madler/zlib.git
+[submodule "libraries/extra-cmake-modules"]
+ path = libraries/extra-cmake-modules
+ url = https://github.com/KDE/extra-cmake-modules
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ed83c205..0db05f98 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,10 +1,5 @@
cmake_minimum_required(VERSION 3.15) # minimum version required by QuaZip
-if(WIN32)
- # In Qt 5.1+ we have our own main() function, don't autolink to qtmain on Windows
- cmake_policy(SET CMP0020 OLD)
-endif()
-
project(Launcher)
string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BUILD_DIR}" IS_IN_SOURCE_BUILD)
@@ -32,11 +27,42 @@ set(CMAKE_C_STANDARD_REQUIRED true)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)
include(GenerateExportHeader)
-set(CMAKE_CXX_FLAGS "-Wall -pedantic -fstack-protector-strong --param=ssp-buffer-size=4 ${CMAKE_CXX_FLAGS}")
+if(MSVC)
+ # Use /W4 as /Wall includes unnesserey warnings such as added padding to structs
+ # /permissive- specify standards-conforming compiler behavior, also enabled by Qt6, default on with std:c++20
+ # /GS Adds buffer security checks, default on but incuded anyway to mirror gcc's fstack-protector flag
+ set(CMAKE_CXX_FLAGS "/W4 /permissive- /GS ${CMAKE_CXX_FLAGS}")
+
+ # LINK accepts /SUBSYSTEM whics sets if we are a WINDOWS (gui) or a CONSOLE programs
+ # This implicitly selects an entrypoint specific to the subsystem selected
+ # qtmain/QtEntryPointLib provides the correct entrypoint (wWinMain) for gui programs
+ # Additinaly LINK autodetects we use a GUI so we can omit /SUBSYSTEM
+ # This allows tests to still use have console without using seperate linker flags
+ # /MANIFEST:NO disables generating a manifest file, we instead provide our own
+ # /STACK sets the stack reserve size, ATL's pack list needs 3-4 MiB as of November 2022, provide 8 MiB
+ set(CMAKE_EXE_LINKER_FLAGS "/MANIFEST:NO /STACK:8388608 ${CMAKE_EXE_LINKER_FLAGS}")
+
+ # See https://github.com/ccache/ccache/issues/1040
+ # Note, CMake 3.25 replaces this with CMAKE_MSVC_DEBUG_INFORMATION_FORMAT
+ # See https://cmake.org/cmake/help/v3.25/variable/CMAKE_MSVC_DEBUG_INFORMATION_FORMAT.html
+ foreach(config DEBUG RELWITHDEBINFO)
+ foreach(lang C CXX)
+ set(flags_var "CMAKE_${lang}_FLAGS_${config}")
+ string(REGEX REPLACE "/Z[Ii]" "/Z7" ${flags_var} "${${flags_var}}")
+ endforeach()
+ endforeach()
+
+ if(CMAKE_MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreadedDLL")