summaryrefslogtreecommitdiff
path: root/cmake/os/Windows.cmake
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2019-06-27 19:25:33 +0200
committerVladislav Vaintroub <wlad@mariadb.com>2019-06-27 19:25:33 +0200
commitb60aee58c7fda4c062f1c595ece7a076abd60e03 (patch)
tree045b882380365d27c0a804372a46951953050521 /cmake/os/Windows.cmake
parent93942dfe8f3f69c43ef435cf5aacc632090729e8 (diff)
downloadmariadb-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.cmake25
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()