SDL_image: Don't allow undefined symbols, when buildind a shared SDL2_image

From a6d33028e3cfd2ee0c00621670e922768ef4649b Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Wed, 25 May 2022 20:53:59 +0200
Subject: [PATCH] Don't allow undefined symbols, when buildind a shared
 SDL2_image

---
 CMakeLists.txt                  |  4 ++++
 cmake/PrivateSdlFunctions.cmake | 23 +++++++++++++++++++++++
 2 files changed, 27 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 13af3fbd..78fcfee8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -267,6 +267,10 @@ endif()
 set_property(TARGET SDL2_image PROPERTY INTERFACE_SDL2_SHARED ${SDL2IMAGE_BUILD_SHARED_LIBS})
 set_property(TARGET SDL2_image APPEND PROPERTY COMPATIBLE_INTERFACE_BOOL SDL2_SHARED)
 
+if(SDL2IMAGE_BUILD_SHARED_LIBS)
+    sdl_target_link_options_no_undefined(SDL2_image)
+endif()
+
 if(SDL2IMAGE_BUILD_SHARED_LIBS)
     # Make sure static library dependencies are built with -fPIC when building a shared SDL2_image
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 91262b06..acfe943c 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -218,3 +218,26 @@ macro(sdl_check_project_in_subfolder relative_subfolder name)
             "Run the download script in the external folder, or re-configure with -DSDL2IMAGE_VENDORED=OFF to use system packages.")
     endif()
 endmacro()
+
+macro(sdl_check_linker_flag flag var)
+    # FIXME: Use CheckLinkerFlag module once cmake minimum version >= 3.18
+    include(CMakePushCheckState)
+    include(CheckCSourceCompiles)
+    cmake_push_check_state(RESET)
+    set(CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--no-undefined")
+    check_c_source_compiles("int main() { return 0; }" ${var})
+    cmake_pop_check_state()
+endmacro()
+
+function(sdl_target_link_options_no_undefined TARGET)
+    if(NOT MSVC)
+        if(CMAKE_C_COMPILER_ID MATCHES "AppleClang")
+            target_link_options(${TARGET} PRIVATE "-Wl,-undefined,error")
+        else()
+            sdl_check_linker_flag("-Wl,--no-undefined" HAVE_WL_NO_UNDEFINED)
+            if(HAVE_WL_NO_UNDEFINED)
+                target_link_options(${TARGET} PRIVATE "-Wl,--no-undefined")
+            endif()
+        endif()
+    endif()
+endfunction()