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;