mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-11-21 17:46:23 +00:00
cmake: detect linker id, and assume MSVC does not support version scripts
This commit is contained in:
@@ -82,19 +82,42 @@ if(APPLE)
|
|||||||
enable_language(OBJC)
|
enable_language(OBJC)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
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_supports_version_file VAR)
|
function(check_linker_supports_version_file VAR)
|
||||||
cmake_push_check_state()
|
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")
|
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")
|
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)")
|
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()
|
cmake_pop_check_state()
|
||||||
|
endif()
|
||||||
set(${VAR} "${LINKER_SUPPORTS_VERSION_SCRIPT}" PARENT_SCOPE)
|
set(${VAR} "${LINKER_SUPPORTS_VERSION_SCRIPT}" PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
if(CMAKE_VERSION VERSION_LESS 3.18)
|
if(CMAKE_VERSION VERSION_LESS 3.18)
|
||||||
function(check_linker_flag LANG FLAG VAR)
|
function(check_linker_flag LANG FLAG VAR)
|
||||||
cmake_push_check_state()
|
cmake_push_check_state(RESET)
|
||||||
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${FLAG} )
|
list(APPEND CMAKE_REQUIRED_LINK_OPTIONS ${FLAG})
|
||||||
if(LANG STREQUAL "C")
|
if(LANG STREQUAL "C")
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
check_c_source_compiles("int main(int argc,char*argv[]){(void)argc;(void)argv;return 0;}" ${VAR} FAIL_REGEX "(unsupported|syntax error)")
|
check_c_source_compiles("int main(int argc,char*argv[]){(void)argc;(void)argv;return 0;}" ${VAR} FAIL_REGEX "(unsupported|syntax error)")
|
||||||
|
|||||||
Reference in New Issue
Block a user