SDL: cmake: build ci and and release with static runtime library

From d1eab18de2a00610b7fffe146a89907dd3402532 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Wed, 10 Jul 2024 19:07:27 +0200
Subject: [PATCH] cmake: build ci and and release with static runtime library

(The Visual Studio projects do this as well)
---
 .github/workflows/msvc.yml     | 16 +++++++++++++---
 CMakeLists.txt                 |  3 ---
 build-scripts/build-release.py |  4 ++++
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/msvc.yml b/.github/workflows/msvc.yml
index 0ce24788928ec..b72a2b85c43c4 100644
--- a/.github/workflows/msvc.yml
+++ b/.github/workflows/msvc.yml
@@ -35,13 +35,23 @@ jobs:
         builddir = f"{ srcdir }/build"
         os.makedirs(builddir)
         cmakelists_txt = textwrap.dedent(f"""\
-          # Always build .PDB symbol file
+          # MSVC debug information format flags are selected by an abstraction
           set(CMAKE_POLICY_DEFAULT_CMP0141 "NEW" CACHE STRING "MSVC debug information format flags are selected by an abstraction")
+          # MSVC runtime library flags are selected by an abstraction
+          set(CMAKE_POLICY_DEFAULT_CMP0091 "NEW" CACHE STRING "MSVC runtime library flags are selected by an abstraction")
+          cmake_minimum_required(VERSION 3.0...3.25)
+          project(sdl_user)
+          # Always build .PDB symbol file
           set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "ProgramDatabase" CACHE STRING "MSVC debug information format")
           set(CMAKE_EXE_LINKER_FLAGS "-DEBUG" CACHE STRING "Linker flags for executables")
           set(CMAKE_SHARED_LINKER_FLAGS "-DEBUG" CACHE STRING "Linker flag for shared libraries")
-          cmake_minimum_required(VERSION 3.0...3.25)
-          project(sdl_user)
+          if(WINDOWS_STORE) # WINDOWS_STORE is available AFTER project()
+            # UWP only supports dynamic runtime
+            set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL" CACHE STRING "MSVC runtime libary")
+          else()
+            # Use static runtime library
+            set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>" CACHE STRING "MSVC runtime libary")
+          endif()
           enable_testing()
           add_subdirectory("{ srcdir }" SDL)
         """)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f5eef6cb109b0..a2298d806bc8c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,9 +4,6 @@ if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
   message(FATAL_ERROR "Prevented in-tree build. Please create a build directory outside of the SDL source code and run \"cmake -S ${CMAKE_SOURCE_DIR} -B .\" from there")
 endif()
 
-# MSVC runtime library flags are selected by an abstraction.
-set(CMAKE_POLICY_DEFAULT_CMP0091 NEW)
-
 # See docs/release_checklist.md
 project(SDL3 LANGUAGES C VERSION "3.1.2")
 
diff --git a/build-scripts/build-release.py b/build-scripts/build-release.py
index c9cb821711bec..735890005ba9d 100755
--- a/build-scripts/build-release.py
+++ b/build-scripts/build-release.py
@@ -471,6 +471,10 @@ def build_vs_cmake(self, arch: str, arch_cmake: str):
                 "-DCMAKE_EXE_LINKER_FLAGS=-DEBUG",
                 # Linker flag for shared libraries
                 "-DCMAKE_SHARED_LINKER_FLAGS=-INCREMENTAL:NO -DEBUG -OPT:REF -OPT:ICF",
+                # MSVC runtime library flags are selected by an abstraction
+                "-DCMAKE_POLICY_DEFAULT_CMP0091=NEW",
+                # Use statically linked runtime (-MT) (ideally, should be "MultiThreaded$<$<CONFIG:Debug>:Debug>")
+                "-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded",
             ])
 
         with self.section_printer.group(f"Build VC CMake project for {arch}"):