Sdl12-compat: MinGW builds link without libc, updates to CMakeLists.txt for MSVC:

From d10c2d295a604e09843bfa674a882a34f2b9343f Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Tue, 23 Feb 2021 14:00:02 +0300
Subject: [PATCH] MinGW builds link without libc, updates to CMakeLists.txt for
 MSVC:

MinGW builds now use the same DllMainCRTStartup as the MSVC builds.
CMake MSVC builds now link OK. (Only X86 Debug builds fail because
of SDL_Swap64, to be addressed later..)
---
 CMakeLists.txt     | 19 ++++++++++++++-----
 src/SDL12_compat.c | 18 ++++++++++--------
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ad35a1c..3713c38 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,17 +17,19 @@ set(SDL12COMPAT_SRCS
 add_library(SDL SHARED ${SDL12COMPAT_SRCS})
 
 target_include_directories(SDL PRIVATE "/usr/local/include/SDL2")  # !!! FIXME
-add_definitions("-D_THREAD_SAFE")  # !!! FIXME
 
 # avoid DLL having 'lib' prefix with Windows MinGW builds
 if(WIN32)
   set(CMAKE_SHARED_LIBRARY_PREFIX "")
+  set_target_properties(SDL PROPERTIES COMPILE_DEFINITIONS "DLL_EXPORT")
 endif()
 
 if(UNIX AND NOT APPLE)
+    add_definitions("-D_REENTRANT")
     target_link_libraries(SDL PRIVATE dl)
 endif()
 if(APPLE)
+    add_definitions("-D_THREAD_SAFE")
     target_link_libraries(SDL PRIVATE "-framework AppKit")
 endif()
 
@@ -48,14 +50,21 @@ else()
       OUTPUT_NAME "SDL")
 endif()
 
+if(MINGW)
+    set_target_properties(SDL PROPERTIES LINK_FLAGS "-nostdlib")
+endif()
 if(MSVC)
     # Don't try to link with the default set of libraries.
-    set_target_properties(SDL PROPERTIES LINK_FLAGS_RELEASE "/NODEFAULTLIB")
-    set_target_properties(SDL PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB")
-    set_target_properties(SDL PROPERTIES STATIC_LIBRARY_FLAGS "/NODEFAULTLIB")
+    set_target_properties(SDL PROPERTIES COMPILE_FLAGS "/GS-")
+    set_target_properties(SDL PROPERTIES LINK_FLAGS "/NODEFAULTLIB")
+    # Make sure /RTC1 is disabled: (from SDL2 CMake)
+    foreach(flag_var
+      CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
+      CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
+      string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
+    endforeach(flag_var)
 endif()
 
-
 # test programs...
 macro(test_program _NAME _SRCS)
     add_executable(${_NAME} ${_SRCS})
diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c
index 3267028..6f4647e 100644
--- a/src/SDL12_compat.c
+++ b/src/SDL12_compat.c
@@ -894,18 +894,13 @@ static void error_dialog(const char *errorMsg)
 }
 #endif
 
-#if defined(__GNUC__)
+#if defined(__GNUC__) && !defined(_WIN32)
 static void dllinit(void) __attribute__((constructor));
 static void dllinit(void)
 {
     if (!LoadSDL20()) {
         error_dialog(loaderror);
-        #ifdef _WIN32
-        TerminateProcess(GetCurrentProcess(), 42);
-        ExitProcess(42);
-        #else
         abort();
-        #endif
     }
 }
 static void dllquit(void) __attribute__((destructor));
@@ -914,11 +909,14 @@ static void dllquit(void)
     UnloadSDL20();
 }
 
-#elif defined(_MSC_VER) && defined(_WIN32)
-#ifndef __FLTUSED__
+#elif defined(_WIN32)
+#if defined(_MSC_VER) && !defined(__FLTUSED__)
 #define __FLTUSED__
 __declspec(selectany) int _fltused = 1;
 #endif
+#if defined(__MINGW32__)
+#define _DllMainCRTStartup DllMainCRTStartup
+#endif
 BOOL WINAPI _DllMainCRTStartup(HANDLE dllhandle, DWORD reason, LPVOID reserved)
 {
     switch (reason) {
@@ -929,6 +927,10 @@ BOOL WINAPI _DllMainCRTStartup(HANDLE dllhandle, DWORD reason, LPVOID reserved)
     case DLL_PROCESS_ATTACH: /* init once for each new process */
         if (!LoadSDL20()) {
             error_dialog(loaderror);
+            #if 0
+            TerminateProcess(GetCurrentProcess(), 42);
+            ExitProcess(42);
+            #endif
             return FALSE;
         }
         break;