From b5b496ec14737dd0f42e93710ec81a5168f89b47 Mon Sep 17 00:00:00 2001
From: Anonymous Maarten <[EMAIL REDACTED]>
Date: Mon, 6 Nov 2023 00:58:03 +0100
Subject: [PATCH] cmake: detect linker id, and assume MSVC does not support
version scripts
---
cmake/PrivateSdlFunctions.cmake | 34 ++++++++++++++++++++++++++-------
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git a/cmake/PrivateSdlFunctions.cmake b/cmake/PrivateSdlFunctions.cmake
index 5b33fcce..e2ff1732 100644
--- a/cmake/PrivateSdlFunctions.cmake
+++ b/cmake/PrivateSdlFunctions.cmake
@@ -240,15 +240,35 @@ macro(sdl_check_linker_flag flag var)
cmake_pop_check_state()
endmacro()
+function(SDL_detect_linker)
+ if(CMAKE_VERSION VERSION_LESS 3.29)
+ if(NOT DEFINED SDL_CMAKE_C_COMPILER_LINKER_ID)
+ execute_process(COMMAND ${CMAKE_LINKER} -v OUTPUT_VARIABLE LINKER_OUTPUT ERROR_VARIABLE LINKER_OUTPUT)
+ string(REGEX REPLACE "[\r\n]" " " LINKER_OUTPUT "${LINKER_OUTPUT}")
+ if(LINKER_OUTPUT MATCHES ".*Microsoft.*")
+ set(linker MSVC)
+ else()
+ set(linker GNUlike)
+ endif()
+ message(STATUS "Linker identification: ${linker}")
+ set(SDL_CMAKE_C_COMPILER_LINKER_ID "${linker}" CACHE STRING "Linker identification")
+ mark_as_advanced(SDL_CMAKE_C_COMPILER_LINKER_ID)
+ endif()
+ set(CMAKE_C_COMPILER_LINKER_ID "${SDL_CMAKE_C_COMPILER_LINKER_ID}")
+ endif()
+endfunction()
+
function(check_linker_support_version_script VAR)
- cmake_push_check_state(RESET)
- file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.sym" "n_0 {\n global:\n func;\n local: *;\n};\n")
- list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/dummy.sym")
- if(MSVC)
- list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "/WX")
+ SDL_detect_linker()
+ if(CMAKE_C_COMPILER_LINKER_ID MATCHES "^(MSVC)$")
+ set(LINKER_SUPPORTS_VERSION_SCRIPT FALSE)
+ else()
+ cmake_push_check_state(RESET)
+ file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/dummy.sym" "n_0 {\n global:\n func;\n local: *;\n};\n")
+ list(APPEND CMAKE_REQUIRED_LINK_OPTIONS "-Wl,--version-script=${CMAKE_CURRENT_BINARY_DIR}/dummy.sym")
+ check_c_source_compiles("int func(void) {return 0;} int main(int argc,char*argv[]){(void)argc;(void)argv;return func();}" LINKER_SUPPORTS_VERSION_SCRIPT FAIL_REGEX "(unsupported|syntax error|unrecognized option)")
+ cmake_pop_check_state()
endif()
- check_c_source_compiles("int func(void) {return 0;} int main(int argc,char*argv[]){(void)argc;(void)argv;return func();}" LINKER_SUPPORTS_VERSION_SCRIPT FAIL_REGEX "(unsupported|syntax error|unrecognized option)")
- cmake_pop_check_state()
set(${VAR} "${LINKER_SUPPORTS_VERSION_SCRIPT}" PARENT_SCOPE)
endfunction()