sdl2-compat: cmake use CheckCPUArchitecture to detect x86

From 8acec2fff1fb869d75b475787910d6785c4a294e Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Tue, 29 Nov 2022 22:42:51 +0100
Subject: [PATCH] cmake use CheckCPUArchitecture to detect x86

---
 CMakeLists.txt                   | 10 +++-----
 cmake/CheckCPUArchitecture.cmake | 42 ++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 6 deletions(-)
 create mode 100644 cmake/CheckCPUArchitecture.cmake

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 16a3665..7b9639f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,12 +24,15 @@ include(CheckCCompilerFlag)
 include(CMakePackageConfigHelpers)
 include(CMakePushCheckState)
 include(GNUInstallDirs)
+include("${CMAKE_CURRENT_LIST_DIR}/cmake/CheckCPUArchitecture.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlchecks.cmake")
 include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlplatform.cmake")
 
 SDL_DetectCMakePlatform()
 CheckOpenGLES()
 
+check_cpu_architecture(x86 SDL_CPU_X86)
+
 if(NOT MSVC AND NOT APPLE AND NOT OPENBSD)
   cmake_push_check_state()
   set(CMAKE_REQUIRED_FLAGS "-Wl,--no-undefined")
@@ -202,12 +205,7 @@ endif()
 if(MSVC)
   # Don't try to link with the default set of libraries.
   set(MSVC_FLAGS "/GS-")
-  check_c_source_compiles("int main(void) {
-#ifndef _M_IX86
-#error not x86
-#endif
-return 0; }" IS_X86)
-  if(IS_X86)  # don't emit SSE2 in x86 builds
+  if(SDL_CPU_X86)  # don't emit SSE2 in x86 builds
     set(MSVC_FLAGS "${MSVC_FLAGS} /arch:SSE")
   endif()
   set_target_properties(SDL2 PROPERTIES COMPILE_FLAGS ${MSVC_FLAGS})
diff --git a/cmake/CheckCPUArchitecture.cmake b/cmake/CheckCPUArchitecture.cmake
new file mode 100644
index 0000000..1eebbd4
--- /dev/null
+++ b/cmake/CheckCPUArchitecture.cmake
@@ -0,0 +1,42 @@
+include(CheckCSourceCompiles)
+include(CMakePushCheckState)
+
+function(_internal_check_cpu_architecture macro_check NAME VARIABLE)
+  cmake_push_check_state()
+  string(TOUPPER "${NAME}" UPPER_NAME)
+  set(CACHE_VARIABLE "CHECK_CPU_ARCHITECTURE_${UPPER_NAME}")
+  set(test_src "
+int main(int argc, char *argv[]) {
+#if ${macro_check}
+  return 0;
+#else
+  choke
+#endif
+}
+")
+  check_c_source_compiles("${test_src}" "${CACHE_VARIABLE}")
+  cmake_pop_check_state()
+  if(${CACHE_VARIABLE})
+    set(${VARIABLE} "TRUE" PARENT_SCOPE)
+  else()
+    set(${VARIABLE} "FALSE" PARENT_SCOPE)
+  endif()
+endfunction()
+
+function(check_cpu_architecture ARCH VARIABLE)
+  if(ARCH STREQUAL "x86")
+    _internal_check_cpu_architecture("defined(__i386__) || defined(__i486__) || defined(__i586__) || defined(__i686__) ||defined( __i386) || defined(_M_IX86)" x86 ${VARIABLE})
+  elseif(ARCH STREQUAL "x64")
+    _internal_check_cpu_architecture("defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)" x64 ${VARIABLE})
+  elseif(ARCH STREQUAL "arm32")
+    _internal_check_cpu_architecture("defined(__arm__) || defined(_M_ARM)" arm32 ${VARIABLE})
+  elseif(ARCH STREQUAL "arm64")
+    _internal_check_cpu_architecture("defined(__aarch64__) || defined(_M_ARM64)" arm64 ${VARIABLE})
+  elseif(ARCH STREQUAL "loongarch64")
+    _internal_check_cpu_architecture("defined(__loongarch64)" loongarch64 ${VARIABLE})
+  else()
+    message(WARNING "Unknown CPU architectures (${ARCH}).")
+    set(${VARIABLE} FALSE)
+  endif()
+  set("${VARIABLE}" "${${VARIABLE}}" PARENT_SCOPE)
+endfunction()