SDL: include: SDL_dynapi.h depends on platform defines

From f91a7475490aceb7cb190894bab89896a2f462e3 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Sun, 8 Jan 2023 00:40:09 +0100
Subject: [PATCH] include: SDL_dynapi.h depends on platform defines

---
 VisualC-GDK/SDL/SDL.vcxproj                   |   1 +
 VisualC-GDK/SDL/SDL.vcxproj.filters           |   3 +
 VisualC-WinRT/SDL-UWP.vcxproj                 |   1 +
 VisualC-WinRT/SDL-UWP.vcxproj.filters         |   3 +
 VisualC/SDL/SDL.vcxproj                       |   1 +
 VisualC/SDL/SDL.vcxproj.filters               |   3 +
 docs/README-porting.md                        |   2 +-
 include/SDL3/SDL.h                            |   1 +
 include/SDL3/SDL_atomic.h                     |   2 +-
 include/SDL3/SDL_oldnames.h                   |   2 +-
 include/SDL3/SDL_opengles.h                   |   2 +-
 include/SDL3/SDL_opengles2.h                  |   2 +-
 include/SDL3/SDL_platform.h                   | 181 +--------------
 include/SDL3/SDL_platform_defines.h           | 210 ++++++++++++++++++
 include/SDL3/SDL_stdinc.h                     |   2 +-
 include/SDL3/SDL_syswm.h                      |   2 +-
 include/build_config/SDL_build_config.h       |   2 +-
 include/build_config/SDL_build_config.h.cmake |   2 +-
 .../build_config/SDL_build_config_android.h   |   2 +-
 .../SDL_build_config_emscripten.h             |   2 +-
 include/build_config/SDL_build_config_ios.h   |   2 +-
 include/build_config/SDL_build_config_macos.h |   2 +-
 .../build_config/SDL_build_config_minimal.h   |   2 +-
 include/build_config/SDL_build_config_ngage.h |   2 +-
 .../build_config/SDL_build_config_windows.h   |   2 +-
 .../build_config/SDL_build_config_wingdk.h    |   2 +-
 include/build_config/SDL_build_config_winrt.h |   2 +-
 include/build_config/SDL_build_config_xbox.h  |   2 +-
 src/SDL_internal.h                            |   7 +-
 29 files changed, 249 insertions(+), 200 deletions(-)
 create mode 100644 include/SDL3/SDL_platform_defines.h

diff --git a/VisualC-GDK/SDL/SDL.vcxproj b/VisualC-GDK/SDL/SDL.vcxproj
index d6df2314de51..0481c83e14db 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj
+++ b/VisualC-GDK/SDL/SDL.vcxproj
@@ -332,6 +332,7 @@
     <ClInclude Include="..\..\include\SDL3\SDL_opengles2_khrplatform.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_pixels.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_platform.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_platform_defines.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_power.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_quit.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_rect.h" />
diff --git a/VisualC-GDK/SDL/SDL.vcxproj.filters b/VisualC-GDK/SDL/SDL.vcxproj.filters
index 4db42dd26ddd..bc84abc5e69e 100644
--- a/VisualC-GDK/SDL/SDL.vcxproj.filters
+++ b/VisualC-GDK/SDL/SDL.vcxproj.filters
@@ -300,6 +300,9 @@
     <ClInclude Include="..\..\include\SDL3\SDL_platform.h">
       <Filter>API Headers</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\include\SDL3\SDL_platform_defines.h">
+      <Filter>API Headers</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\include\SDL3\SDL_power.h">
       <Filter>API Headers</Filter>
     </ClInclude>
diff --git a/VisualC-WinRT/SDL-UWP.vcxproj b/VisualC-WinRT/SDL-UWP.vcxproj
index 04b21ff445ad..0ca94fdc2cf8 100644
--- a/VisualC-WinRT/SDL-UWP.vcxproj
+++ b/VisualC-WinRT/SDL-UWP.vcxproj
@@ -70,6 +70,7 @@
     <ClInclude Include="..\include\SDL3\SDL_opengles2.h" />
     <ClInclude Include="..\include\SDL3\SDL_pixels.h" />
     <ClInclude Include="..\include\SDL3\SDL_platform.h" />
+    <ClInclude Include="..\include\SDL3\SDL_platform_defines.h" />
     <ClInclude Include="..\include\SDL3\SDL_power.h" />
     <ClInclude Include="..\include\SDL3\SDL_quit.h" />
     <ClInclude Include="..\include\SDL3\SDL_rect.h" />
diff --git a/VisualC-WinRT/SDL-UWP.vcxproj.filters b/VisualC-WinRT/SDL-UWP.vcxproj.filters
index 7127c2c191f7..c6941033ac42 100644
--- a/VisualC-WinRT/SDL-UWP.vcxproj.filters
+++ b/VisualC-WinRT/SDL-UWP.vcxproj.filters
@@ -108,6 +108,9 @@
     <ClInclude Include="..\include\SDL3\SDL_platform.h">
       <Filter>Header Files</Filter>
     </ClInclude>
+    <ClInclude Include="..\include\SDL3\SDL_platform_defines.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
     <ClInclude Include="..\include\SDL3\SDL_power.h">
       <Filter>Header Files</Filter>
     </ClInclude>
diff --git a/VisualC/SDL/SDL.vcxproj b/VisualC/SDL/SDL.vcxproj
index 756ea5934c4e..b9ff71973c96 100644
--- a/VisualC/SDL/SDL.vcxproj
+++ b/VisualC/SDL/SDL.vcxproj
@@ -278,6 +278,7 @@
     <ClInclude Include="..\..\include\SDL3\SDL_opengles2_khrplatform.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_pixels.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_platform.h" />
+    <ClInclude Include="..\..\include\SDL3\SDL_platform_defines.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_power.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_quit.h" />
     <ClInclude Include="..\..\include\SDL3\SDL_rect.h" />
diff --git a/VisualC/SDL/SDL.vcxproj.filters b/VisualC/SDL/SDL.vcxproj.filters
index acb558a16627..8897d2fc8332 100644
--- a/VisualC/SDL/SDL.vcxproj.filters
+++ b/VisualC/SDL/SDL.vcxproj.filters
@@ -297,6 +297,9 @@
     <ClInclude Include="..\..\include\SDL3\SDL_platform.h">
       <Filter>API Headers</Filter>
     </ClInclude>
+    <ClInclude Include="..\..\include\SDL3\SDL_platform_defines.h">
+      <Filter>API Headers</Filter>
+    </ClInclude>
     <ClInclude Include="..\..\include\SDL3\SDL_power.h">
       <Filter>API Headers</Filter>
     </ClInclude>
diff --git a/docs/README-porting.md b/docs/README-porting.md
index 9bd24568d33c..e2e4d0faa77f 100644
--- a/docs/README-porting.md
+++ b/docs/README-porting.md
@@ -6,7 +6,7 @@ Porting
   The first thing you have to do when porting to a new platform, is look at
 include/SDL_platform.h and create an entry there for your operating system.
 The standard format is "__PLATFORM__", where PLATFORM is the name of the OS.
-Ideally SDL_platform.h will be able to auto-detect the system it's building
+Ideally SDL_platform_defines.h will be able to auto-detect the system it's building
 on based on C preprocessor symbols.
 
 There are two basic ways of building SDL at the moment:
diff --git a/include/SDL3/SDL.h b/include/SDL3/SDL.h
index 74c8105cd472..123bd8552190 100644
--- a/include/SDL3/SDL.h
+++ b/include/SDL3/SDL.h
@@ -60,6 +60,7 @@
 #include <SDL3/SDL_mutex.h>
 #include <SDL3/SDL_pixels.h>
 #include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 #include <SDL3/SDL_power.h>
 #include <SDL3/SDL_quit.h>
 #include <SDL3/SDL_rect.h>
diff --git a/include/SDL3/SDL_atomic.h b/include/SDL3/SDL_atomic.h
index a2722af2b4c3..3a332a055405 100644
--- a/include/SDL3/SDL_atomic.h
+++ b/include/SDL3/SDL_atomic.h
@@ -60,7 +60,7 @@
 #define SDL_atomic_h_
 
 #include <SDL3/SDL_stdinc.h>
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 #include <SDL3/SDL_begin_code.h>
 
diff --git a/include/SDL3/SDL_oldnames.h b/include/SDL3/SDL_oldnames.h
index 9807a28e2f94..dd1d635e4efd 100644
--- a/include/SDL3/SDL_oldnames.h
+++ b/include/SDL3/SDL_oldnames.h
@@ -28,7 +28,7 @@
 #ifndef SDL_oldnames_h_
 #define SDL_oldnames_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* The new function names are recommended, but if you want to have the
  * old names available while you are in the process of migrating code
diff --git a/include/SDL3/SDL_opengles.h b/include/SDL3/SDL_opengles.h
index 37cb983ea617..93a75424f52f 100644
--- a/include/SDL3/SDL_opengles.h
+++ b/include/SDL3/SDL_opengles.h
@@ -24,7 +24,7 @@
  *
  *  This is a simple file to encapsulate the OpenGL ES 1.X API headers.
  */
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 #ifdef __IOS__
 #include <OpenGLES/ES1/gl.h>
diff --git a/include/SDL3/SDL_opengles2.h b/include/SDL3/SDL_opengles2.h
index 616c3ad2a77a..57cf7e87b7f5 100644
--- a/include/SDL3/SDL_opengles2.h
+++ b/include/SDL3/SDL_opengles2.h
@@ -24,7 +24,7 @@
  *
  *  This is a simple file to encapsulate the OpenGL ES 2.0 API headers.
  */
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 #if !defined(_MSC_VER) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS)
 
diff --git a/include/SDL3/SDL_platform.h b/include/SDL3/SDL_platform.h
index 27db71d22d99..a9decea89864 100644
--- a/include/SDL3/SDL_platform.h
+++ b/include/SDL3/SDL_platform.h
@@ -22,190 +22,13 @@
 /**
  *  \file SDL_platform.h
  *
- *  Try to get a standard set of platform defines.
+ *  Header file for platform functions.
  */
 
 #ifndef SDL_platform_h_
 #define SDL_platform_h_
 
-#if defined(_AIX)
-#undef __AIX__
-#define __AIX__     1
-#endif
-#if defined(__HAIKU__)
-#undef __HAIKU__
-#define __HAIKU__   1
-#endif
-#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__)
-#undef __BSDI__
-#define __BSDI__    1
-#endif
-#if defined(_arch_dreamcast)
-#undef __DREAMCAST__
-#define __DREAMCAST__   1
-#endif
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
-#undef __FREEBSD__
-#define __FREEBSD__ 1
-#endif
-#if defined(hpux) || defined(__hpux) || defined(__hpux__)
-#undef __HPUX__
-#define __HPUX__    1
-#endif
-#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE)
-#undef __IRIX__
-#define __IRIX__    1
-#endif
-#if (defined(linux) || defined(__linux) || defined(__linux__))
-#undef __LINUX__
-#define __LINUX__   1
-#endif
-#if defined(ANDROID) || defined(__ANDROID__)
-#undef __ANDROID__
-#undef __LINUX__ /* do we need to do this? */
-#define __ANDROID__ 1
-#endif
-#if defined(__NGAGE__)
-#undef __NGAGE__
-#define __NGAGE__ 1
-#endif
-
-#if defined(__APPLE__)
-/* lets us know what version of macOS we're compiling on */
-#include <AvailabilityMacros.h>
-#include <TargetConditionals.h>
-
-/* Fix building with older SDKs that don't define these
-   See this for more information:
-   https://stackoverflow.com/questions/12132933/preprocessor-macro-for-os-x-targets
-*/
-#ifndef TARGET_OS_MACCATALYST
-#define TARGET_OS_MACCATALYST 0
-#endif
-#ifndef TARGET_OS_IOS
-#define TARGET_OS_IOS 0
-#endif
-#ifndef TARGET_OS_IPHONE
-#define TARGET_OS_IPHONE 0
-#endif
-#ifndef TARGET_OS_TV
-#define TARGET_OS_TV 0
-#endif
-#ifndef TARGET_OS_SIMULATOR
-#define TARGET_OS_SIMULATOR 0
-#endif
-
-#if TARGET_OS_TV
-#undef __TVOS__
-#define __TVOS__ 1
-#endif
-#if TARGET_OS_IPHONE
-#undef __IOS__
-#define __IOS__ 1
-#else
-#undef __MACOS__
-#define __MACOS__  1
-#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
-# error SDL for macOS only supports deploying on 10.7 and above.
-#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1070 */
-#endif /* TARGET_OS_IPHONE */
-#endif /* defined(__APPLE__) */
-
-#if defined(__NetBSD__)
-#undef __NETBSD__
-#define __NETBSD__  1
-#endif
-#if defined(__OpenBSD__)
-#undef __OPENBSD__
-#define __OPENBSD__ 1
-#endif
-#if defined(__OS2__) || defined(__EMX__)
-#undef __OS2__
-#define __OS2__     1
-#endif
-#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE)
-#undef __OSF__
-#define __OSF__     1
-#endif
-#if defined(__QNXNTO__)
-#undef __QNXNTO__
-#define __QNXNTO__  1
-#endif
-#if defined(riscos) || defined(__riscos) || defined(__riscos__)
-#undef __RISCOS__
-#define __RISCOS__  1
-#endif
-#if defined(__sun) && defined(__SVR4)
-#undef __SOLARIS__
-#define __SOLARIS__ 1
-#endif
-
-#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
-/* Try to find out if we're compiling for WinRT, GDK or non-WinRT/GDK */
-#if defined(_MSC_VER) && defined(__has_include)
-#if __has_include(<winapifamily.h>)
-#define HAVE_WINAPIFAMILY_H 1
-#else
-#define HAVE_WINAPIFAMILY_H 0
-#endif
-
-/* If _USING_V110_SDK71_ is defined it means we are using the Windows XP toolset. */
-#elif defined(_MSC_VER) && (_MSC_VER >= 1700 && !_USING_V110_SDK71_)    /* _MSC_VER == 1700 for Visual Studio 2012 */
-#define HAVE_WINAPIFAMILY_H 1
-#else
-#define HAVE_WINAPIFAMILY_H 0
-#endif
-
-#if HAVE_WINAPIFAMILY_H
-#include <winapifamily.h>
-#define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP))
-#else
-#define WINAPI_FAMILY_WINRT 0
-#endif /* HAVE_WINAPIFAMILY_H */
-
-#if WINAPI_FAMILY_WINRT
-#undef __WINRT__
-#define __WINRT__ 1
-#elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */
-#undef __WINGDK__
-#define __WINGDK__ 1
-#elif defined(_GAMING_XBOX_XBOXONE)
-#undef __XBOXONE__
-#define __XBOXONE__ 1
-#elif defined(_GAMING_XBOX_SCARLETT)
-#undef __XBOXSERIES__
-#define __XBOXSERIES__ 1
-#else
-#undef __WINDOWS__
-#define __WINDOWS__ 1
-#endif
-#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */
-
-#if defined(__WINDOWS__)
-#undef __WIN32__
-#define __WIN32__ 1
-#endif
-/* This is to support generic "any GDK" separate from a platform-specific GDK */
-#if defined(__WINGDK__) || defined(__XBOXONE__) || defined(__XBOXSERIES__)
-#undef __GDK__
-#define __GDK__ 1
-#endif
-#if defined(__PSP__)
-#undef __PSP__
-#define __PSP__ 1
-#endif
-#if defined(PS2)
-#define __PS2__ 1
-#endif
-
-#if defined(__vita__)
-#define __VITA__ 1
-#endif
-
-#if defined(__3DS__)
-#undef __3DS__
-#define __3DS__ 1
-#endif
+#include <SDL3/SDL_platform_defines.h>
 
 #include <SDL3/SDL_begin_code.h>
 /* Set up for C function definitions, even when using C++ */
diff --git a/include/SDL3/SDL_platform_defines.h b/include/SDL3/SDL_platform_defines.h
new file mode 100644
index 000000000000..906861344717
--- /dev/null
+++ b/include/SDL3/SDL_platform_defines.h
@@ -0,0 +1,210 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+/**
+ *  \file SDL_platform_defines.h
+ *
+ *  Try to get a standard set of platform defines.
+ */
+
+#ifndef SDL_platform_defines_h_
+#define SDL_platform_defines_h_
+
+#if defined(_AIX)
+#undef __AIX__
+#define __AIX__     1
+#endif
+#if defined(__HAIKU__)
+#undef __HAIKU__
+#define __HAIKU__   1
+#endif
+#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__)
+#undef __BSDI__
+#define __BSDI__    1
+#endif
+#if defined(_arch_dreamcast)
+#undef __DREAMCAST__
+#define __DREAMCAST__   1
+#endif
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
+#undef __FREEBSD__
+#define __FREEBSD__ 1
+#endif
+#if defined(hpux) || defined(__hpux) || defined(__hpux__)
+#undef __HPUX__
+#define __HPUX__    1
+#endif
+#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE)
+#undef __IRIX__
+#define __IRIX__    1
+#endif
+#if (defined(linux) || defined(__linux) || defined(__linux__))
+#undef __LINUX__
+#define __LINUX__   1
+#endif
+#if defined(ANDROID) || defined(__ANDROID__)
+#undef __ANDROID__
+#undef __LINUX__ /* do we need to do this? */
+#define __ANDROID__ 1
+#endif
+#if defined(__NGAGE__)
+#undef __NGAGE__
+#define __NGAGE__ 1
+#endif
+
+#if defined(__APPLE__)
+/* lets us know what version of macOS we're compiling on */
+#include <AvailabilityMacros.h>
+#include <TargetConditionals.h>
+
+/* Fix building with older SDKs that don't define these
+   See this for more information:
+   https://stackoverflow.com/questions/12132933/preprocessor-macro-for-os-x-targets
+*/
+#ifndef TARGET_OS_MACCATALYST
+#define TARGET_OS_MACCATALYST 0
+#endif
+#ifndef TARGET_OS_IOS
+#define TARGET_OS_IOS 0
+#endif
+#ifndef TARGET_OS_IPHONE
+#define TARGET_OS_IPHONE 0
+#endif
+#ifndef TARGET_OS_TV
+#define TARGET_OS_TV 0
+#endif
+#ifndef TARGET_OS_SIMULATOR
+#define TARGET_OS_SIMULATOR 0
+#endif
+
+#if TARGET_OS_TV
+#undef __TVOS__
+#define __TVOS__ 1
+#endif
+#if TARGET_OS_IPHONE
+#undef __IOS__
+#define __IOS__ 1
+#else
+#undef __MACOS__
+#define __MACOS__  1
+#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
+# error SDL for macOS only supports deploying on 10.7 and above.
+#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1070 */
+#endif /* TARGET_OS_IPHONE */
+#endif /* defined(__APPLE__) */
+
+#if defined(__NetBSD__)
+#undef __NETBSD__
+#define __NETBSD__  1
+#endif
+#if defined(__OpenBSD__)
+#undef __OPENBSD__
+#define __OPENBSD__ 1
+#endif
+#if defined(__OS2__) || defined(__EMX__)
+#undef __OS2__
+#define __OS2__     1
+#endif
+#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE)
+#undef __OSF__
+#define __OSF__     1
+#endif
+#if defined(__QNXNTO__)
+#undef __QNXNTO__
+#define __QNXNTO__  1
+#endif
+#if defined(riscos) || defined(__riscos) || defined(__riscos__)
+#undef __RISCOS__
+#define __RISCOS__  1
+#endif
+#if defined(__sun) && defined(__SVR4)
+#undef __SOLARIS__
+#define __SOLARIS__ 1
+#endif
+
+#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__)
+/* Try to find out if we're compiling for WinRT, GDK or non-WinRT/GDK */
+#if defined(_MSC_VER) && defined(__has_include)
+#if __has_include(<winapifamily.h>)
+#define HAVE_WINAPIFAMILY_H 1
+#else
+#define HAVE_WINAPIFAMILY_H 0
+#endif
+
+/* If _USING_V110_SDK71_ is defined it means we are using the Windows XP toolset. */
+#elif defined(_MSC_VER) && (_MSC_VER >= 1700 && !_USING_V110_SDK71_)    /* _MSC_VER == 1700 for Visual Studio 2012 */
+#define HAVE_WINAPIFAMILY_H 1
+#else
+#define HAVE_WINAPIFAMILY_H 0
+#endif
+
+#if HAVE_WINAPIFAMILY_H
+#include <winapifamily.h>
+#define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP))
+#else
+#define WINAPI_FAMILY_WINRT 0
+#endif /* HAVE_WINAPIFAMILY_H */
+
+#if WINAPI_FAMILY_WINRT
+#undef __WINRT__
+#define __WINRT__ 1
+#elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */
+#undef __WINGDK__
+#define __WINGDK__ 1
+#elif defined(_GAMING_XBOX_XBOXONE)
+#undef __XBOXONE__
+#define __XBOXONE__ 1
+#elif defined(_GAMING_XBOX_SCARLETT)
+#undef __XBOXSERIES__
+#define __XBOXSERIES__ 1
+#else
+#undef __WINDOWS__
+#define __WINDOWS__ 1
+#endif
+#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */
+
+#if defined(__WINDOWS__)
+#undef __WIN32__
+#define __WIN32__ 1
+#endif
+/* This is to support generic "any GDK" separate from a platform-specific GDK */
+#if defined(__WINGDK__) || defined(__XBOXONE__) || defined(__XBOXSERIES__)
+#undef __GDK__
+#define __GDK__ 1
+#endif
+#if defined(__PSP__)
+#undef __PSP__
+#define __PSP__ 1
+#endif
+#if defined(PS2)
+#define __PS2__ 1
+#endif
+
+#if defined(__vita__)
+#define __VITA__ 1
+#endif
+
+#if defined(__3DS__)
+#undef __3DS__
+#define __3DS__ 1
+#endif
+
+#endif /* SDL_platform_defines_h_ */
diff --git a/include/SDL3/SDL_stdinc.h b/include/SDL3/SDL_stdinc.h
index 75fc0b5eb437..6ab791aa0156 100644
--- a/include/SDL3/SDL_stdinc.h
+++ b/include/SDL3/SDL_stdinc.h
@@ -28,7 +28,7 @@
 #ifndef SDL_stdinc_h_
 #define SDL_stdinc_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 #include <inttypes.h>
diff --git a/include/SDL3/SDL_syswm.h b/include/SDL3/SDL_syswm.h
index 6dab7835d988..e344def97770 100644
--- a/include/SDL3/SDL_syswm.h
+++ b/include/SDL3/SDL_syswm.h
@@ -30,7 +30,7 @@
 
 #include <SDL3/SDL_stdinc.h>
 #include <SDL3/SDL_error.h>
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 #include <SDL3/SDL_video.h>
 
 /**
diff --git a/include/build_config/SDL_build_config.h b/include/build_config/SDL_build_config.h
index d2075ffd61c2..08ee176b60a8 100644
--- a/include/build_config/SDL_build_config.h
+++ b/include/build_config/SDL_build_config.h
@@ -22,7 +22,7 @@
 #ifndef SDL_build_config_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /**
  *  \file SDL_build_config.h
diff --git a/include/build_config/SDL_build_config.h.cmake b/include/build_config/SDL_build_config.h.cmake
index 87e9c65d7c8b..36cb0800a540 100644
--- a/include/build_config/SDL_build_config.h.cmake
+++ b/include/build_config/SDL_build_config.h.cmake
@@ -29,7 +29,7 @@
  */
 
 /* General platform specific identifiers */
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* C language features */
 #cmakedefine const @HAVE_CONST@
diff --git a/include/build_config/SDL_build_config_android.h b/include/build_config/SDL_build_config_android.h
index 4572f9aa9587..1e8262b16555 100644
--- a/include/build_config/SDL_build_config_android.h
+++ b/include/build_config/SDL_build_config_android.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_android_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /**
  *  \file SDL_build_config_android.h
diff --git a/include/build_config/SDL_build_config_emscripten.h b/include/build_config/SDL_build_config_emscripten.h
index b41574935437..13c7bffdbfa2 100644
--- a/include/build_config/SDL_build_config_emscripten.h
+++ b/include/build_config/SDL_build_config_emscripten.h
@@ -22,7 +22,7 @@
 #ifndef SDL_build_config_emscripten_h
 #define SDL_build_config_emscripten_h
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /**
  *  \file SDL_build_config_emscripten.h
diff --git a/include/build_config/SDL_build_config_ios.h b/include/build_config/SDL_build_config_ios.h
index d4f14c28fb7e..721e43a51eee 100644
--- a/include/build_config/SDL_build_config_ios.h
+++ b/include/build_config/SDL_build_config_ios.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_ios_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 #define HAVE_GCC_ATOMICS    1
 
diff --git a/include/build_config/SDL_build_config_macos.h b/include/build_config/SDL_build_config_macos.h
index f2878db25491..2d633ecbf01a 100644
--- a/include/build_config/SDL_build_config_macos.h
+++ b/include/build_config/SDL_build_config_macos.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_macos_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */
 #include <AvailabilityMacros.h>
diff --git a/include/build_config/SDL_build_config_minimal.h b/include/build_config/SDL_build_config_minimal.h
index 53702d257d30..c63595a5fd06 100644
--- a/include/build_config/SDL_build_config_minimal.h
+++ b/include/build_config/SDL_build_config_minimal.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_minimal_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /**
  *  \file SDL_build_config_minimal.h
diff --git a/include/build_config/SDL_build_config_ngage.h b/include/build_config/SDL_build_config_ngage.h
index 6ae4536940da..60b3b8e7f525 100644
--- a/include/build_config/SDL_build_config_ngage.h
+++ b/include/build_config/SDL_build_config_ngage.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_ngage_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 typedef signed char        int8_t;
 typedef unsigned char      uint8_t;
diff --git a/include/build_config/SDL_build_config_windows.h b/include/build_config/SDL_build_config_windows.h
index ecac14a058ba..7adedb0e2796 100644
--- a/include/build_config/SDL_build_config_windows.h
+++ b/include/build_config/SDL_build_config_windows.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_windows_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* winsdkver.h defines _WIN32_MAXVER for SDK version detection. It is present since at least the Windows 7 SDK,
  * but out of caution we'll only use it if the compiler supports __has_include() to confirm its presence.
diff --git a/include/build_config/SDL_build_config_wingdk.h b/include/build_config/SDL_build_config_wingdk.h
index 03c43961f28b..aaa756399ae8 100644
--- a/include/build_config/SDL_build_config_wingdk.h
+++ b/include/build_config/SDL_build_config_wingdk.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_wingdk_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* Windows GDK does not need Windows SDK version checks because it requires
  * a recent version of the Windows 10 SDK. */
diff --git a/include/build_config/SDL_build_config_winrt.h b/include/build_config/SDL_build_config_winrt.h
index 01bff80e1416..60c03801cb62 100644
--- a/include/build_config/SDL_build_config_winrt.h
+++ b/include/build_config/SDL_build_config_winrt.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_winrt_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* Make sure the Windows SDK's NTDDI_VERSION macro gets defined.  This is used
    by SDL to determine which version of the Windows SDK is being used.
diff --git a/include/build_config/SDL_build_config_xbox.h b/include/build_config/SDL_build_config_xbox.h
index 5e4d0a3b9c1e..9f81d836f144 100644
--- a/include/build_config/SDL_build_config_xbox.h
+++ b/include/build_config/SDL_build_config_xbox.h
@@ -23,7 +23,7 @@
 #define SDL_build_config_wingdk_h_
 #define SDL_build_config_h_
 
-#include <SDL3/SDL_platform.h>
+#include <SDL3/SDL_platform_defines.h>
 
 /* Windows GDK does not need Windows SDK version checks because it requires
  * a recent version of the Windows 10 SDK. */
diff --git a/src/SDL_internal.h b/src/SDL_internal.h
index 09076f29bade..c4ea14958e1b 100644
--- a/src/SDL_internal.h
+++ b/src/SDL_internal.h
@@ -49,17 +49,20 @@
         SDL_free(ptr);               \
     }
 
+#include "build_config/SDL_build_config.h"
+
 #include "dynapi/SDL_dynapi.h"
 
 #if SDL_DYNAMIC_API
 #include "dynapi/SDL_dynapi_overrides.h"
 /* force DECLSPEC off...it's all internal symbols now.
    These will have actual #defines during SDL_dynapi.c only */
+#ifdef DECLSPEC
+#undef DECLSPEC
+#endif
 #define DECLSPEC
 #endif
 
-#include "build_config/SDL_build_config.h"
-
 #ifdef __APPLE__
 #ifndef _DARWIN_C_SOURCE
 #define _DARWIN_C_SOURCE 1 /* for memset_pattern4() */