SDL: cmake: only add <LANG>_VISIBILITY_PRESET properties when compiler supports -fvisibility=

From 4ec3a5ac27a808ad91eb680cd96a4506b29c4b97 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Wed, 25 Jan 2023 22:27:47 +0100
Subject: [PATCH] cmake: only add <LANG>_VISIBILITY_PRESET properties when
 compiler supports -fvisibility=

---
 CMakeLists.txt | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ef4efa31c2ac..89fcc1bb1b01 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -628,6 +628,15 @@ if(USE_GCC OR USE_CLANG)
     endif()
   endif()
 
+  cmake_push_check_state()
+  set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -fvisibility=hidden -Werror")
+  check_c_source_compiles("
+      #if !defined(__GNUC__) || __GNUC__ < 4
+      #error SDL only uses visibility attributes in GCC 4 or newer
+      #endif
+      int main(int argc, char **argv) { return 0; }" HAVE_GCC_FVISIBILITY)
+  cmake_pop_check_state()
+
   check_c_compiler_flag(-Wshadow HAVE_GCC_WSHADOW)
   if(HAVE_GCC_WSHADOW)
     target_compile_options(sdl-global-options INTERFACE "-Wshadow")
@@ -3091,13 +3100,17 @@ if(SDL_SHARED)
   # alias target for in-tree builds
   add_library(SDL3::SDL3 ALIAS SDL3)
   set_target_properties(SDL3 PROPERTIES
-    C_VISIBILITY_PRESET "hidden"
-    CXX_VISIBILITY_PRESET "hidden"
-    OBJC_VISIBILITY_PRESET "hidden"
     POSITION_INDEPENDENT_CODE TRUE
     LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/dynapi/SDL_dynapi.sym"
     INTERFACE_LINK_DEPENDS "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/dynapi/SDL_dynapi.sym>"
   )
+  if(HAVE_GCC_FVISIBILITY)
+    set_target_properties(SDL3 PROPERTIES
+      C_VISIBILITY_PRESET "hidden"
+      CXX_VISIBILITY_PRESET "hidden"
+      OBJC_VISIBILITY_PRESET "hidden"
+    )
+  endif()
   if(NOT SDL_LIBC)
     if(MSVC AND SDL_CPU_X86)
       # FIXME: should be added for all architectures (missing symbols for ARM)