diff options
author | Vladislav Vaintroub <wlad@mariadb.com> | 2019-06-27 19:25:33 +0200 |
---|---|---|
committer | Vladislav Vaintroub <wlad@mariadb.com> | 2019-06-27 19:25:33 +0200 |
commit | b60aee58c7fda4c062f1c595ece7a076abd60e03 (patch) | |
tree | 045b882380365d27c0a804372a46951953050521 /cmake/os/Windows.cmake | |
parent | 93942dfe8f3f69c43ef435cf5aacc632090729e8 (diff) | |
download | mariadb-git-b60aee58c7fda4c062f1c595ece7a076abd60e03.tar.gz |
MDEV-17279 Windows : link C runtime dynamically
Improve previous patch so we do not depend on (tiny) compiler-version
dependent libraries, i.e vcruntime140.dll, and msvcp140.dll
The remaining dependency is Universal CRT, is part of Win10+ OS,
and should already be installed by Windows update on most downlevel
systems.
Diffstat (limited to 'cmake/os/Windows.cmake')
-rw-r--r-- | cmake/os/Windows.cmake | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/cmake/os/Windows.cmake b/cmake/os/Windows.cmake index 86d7d1280ae..57594ddd1d2 100644 --- a/cmake/os/Windows.cmake +++ b/cmake/os/Windows.cmake @@ -65,7 +65,9 @@ FUNCTION(ENABLE_ASAN) ENDIF() # currently, asan is broken with static CRT. IF(NOT(MSVC_CRT_TYPE STREQUAL "/MD")) - MESSAGE(FATAL_ERROR "-DWITH_ASAN cmake parameter also requires -DMSVC_CRT_TYPE=/MD") + IF(NOT DYNAMIC_UCRT_LINK) + MESSAGE(FATAL_ERROR "-DWITH_ASAN cmake parameter also requires -DMSVC_CRT_TYPE=/MD OR DYNAMIC_UCRT_LINK=ON") + ENDIF() ENDIF() IF(CMAKE_SIZEOF_VOID_P EQUAL 4) MESSAGE(FATAL_ERROR "-DWITH_ASAN on Windows requires 64bit build") @@ -90,14 +92,10 @@ ENDFUNCTION() IF(MSVC) - IF(WITH_ASAN) - ENABLE_ASAN() - ENDIF() - # Disable mingw based pkg-config found in Strawberry perl SET(PKG_CONFIG_EXECUTABLE 0 CACHE INTERNAL "") - SET(MSVC_CRT_TYPE /MD CACHE STRING + SET(MSVC_CRT_TYPE /MT CACHE STRING "Runtime library - specify runtime library for linking (/MT,/MTd,/MD,/MDd)" ) SET(VALID_CRT_TYPES /MTd /MDd /MD /MT) @@ -105,7 +103,10 @@ IF(MSVC) MESSAGE(FATAL_ERROR "Invalid value ${MSVC_CRT_TYPE} for MSVC_CRT_TYPE, choose one of /MT,/MTd,/MD,/MDd ") ENDIF() - IF(MSVC_CRT_TYPE MATCHES "/MD") + OPTION(DYNAMIC_UCRT_LINK "Link Universal CRT dynamically, if MSVC_CRT_TYPE=/MT" ON) + SET(DYNAMIC_UCRT_LINKER_OPTION " /NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib") + + IF((MSVC_CRT_TYPE MATCHES "/MD") OR DYNAMIC_UCRT_LINK) # Dynamic runtime (DLLs), need to install CRT libraries. SET(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT VCCRT) SET(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) @@ -115,6 +116,10 @@ IF(MSVC) INCLUDE(InstallRequiredSystemLibraries) ENDIF() + IF(WITH_ASAN) + ENABLE_ASAN() + ENDIF() + # Enable debug info also in Release build, # and create PDB to be able to analyze crashes. FOREACH(type EXE SHARED MODULE) @@ -170,6 +175,11 @@ IF(MSVC) STRING(REGEX REPLACE "/INCREMENTAL:([^ ]+)" "/INCREMENTAL:NO" CMAKE_${type}_LINKER_FLAGS_DEBUG "${CMAKE_${type}_LINKER_FLAGS_DEBUG}") STRING(REGEX REPLACE "/INCREMENTAL$" "/INCREMENTAL:NO" CMAKE_${type}_LINKER_FLAGS_DEBUG "${CMAKE_${type}_LINKER_FLAGS_DEBUG}") SET(CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_${type}_LINKER_FLAGS_RELWITHDEBINFO} /OPT:REF /release") + IF(DYNAMIC_UCRT_LINK AND (MSVC_CRT_TYPE STREQUAL "/MT")) + FOREACH(config RELEASE RELWITHDEBINFO DEBUG MINSIZEREL) + STRING(APPEND CMAKE_${type}_LINKER_FLAGS_${config} ${DYNAMIC_UCRT_LINKER_OPTION}) + ENDFOREACH() + ENDIF() ENDFOREACH() @@ -288,5 +298,6 @@ MACRO(FORCE_STATIC_CRT) CMAKE_C_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_MINSIZEREL ) STRING(REGEX REPLACE "/MD[d]?" "/MT" "${flag}" "${${flag}}" ) + STRING(REPLACE ${DYNAMIC_UCRT_LINKER_OPTION} "" "${flag}" "${${flag}}") ENDFOREACH() ENDMACRO() |