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()