get_cmake_property(ENABLED_LANGUAGES ENABLED_LANGUAGES) include(CheckCXXCompilerFlag) include(CheckCCompilerFlag) if(NOT CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL .lib) list(FIND ENABLED_LANGUAGES C found) if(${found} GREATER -1) set(CMAKE_REQUIRED_FLAGS -static-libgcc) check_c_compiler_flag(-static-libgcc ld-static-libgcc) set(CMAKE_REQUIRED_FLAGS) endif() endif() if(NOT CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL .lib) list(FIND ENABLED_LANGUAGES CXX found) if(${found} GREATER -1) set(CMAKE_REQUIRED_FLAGS -static-libstdc++) check_cxx_compiler_flag(-static-libstdc++ ld-static-libstdcxx) set(CMAKE_REQUIRED_FLAGS) endif() endif() function(target_link_static_3_13) function(string_append var) foreach(arg ${ARGN}) string(FIND "${${var}}" "${arg}" found) if(${found} EQUAL -1) string(STRIP "${${var}} ${arg}" ${var}) endif() endforeach() set(${var} "${${var}}" PARENT_SCOPE) endfunction() foreach(target ${ARGN}) if(TARGET ${target}) get_property(LINK_FLAGS TARGET ${target} PROPERTY LINK_FLAGS) if(ld-static-libgcc) string_append(LINK_FLAGS -static-libgcc) endif() if(ld-static-libstdcxx) string_append(LINK_FLAGS -static-libstdc++) endif() set_property(TARGET ${target} PROPERTY LINK_FLAGS "${LINK_FLAGS}") endif() endforeach() endfunction() function(target_link_static_3_15) foreach(target ${ARGN}) if(TARGET ${target}) set_property(TARGET ${target} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>" ) endif() endforeach() endfunction() function(target_link_static) if(CMAKE_VERSION VERSION_LESS 3.13) target_link_static_3_13(${ARGN}) return() endif() if(NOT CMAKE_VERSION VERSION_LESS 3.15) target_link_static_3_15(${ARGN}) endif() set(scope PRIVATE) foreach(target ${ARGN}) if(target MATCHES "^INTERFACE|PUBLIC|PRIVATE") set(scope ${target}) continue() endif() if(ld-static-libgcc) target_link_options(${target} ${scope} -static-libgcc) endif() if(ld-static-libstdcxx) target_link_options(${target} ${scope} $<$:-static-libstdc++>) endif() endforeach() endfunction()