diff --git a/CMakeLists.txt b/CMakeLists.txt index 23331b18..89ba5904 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,17 +65,16 @@ function(disable_warnings ARG_TARGET) set_target_properties(${ARG_TARGET} PROPERTIES COMPILE_FLAGS ${NEW_FLAGS}) endfunction() -# Look for dynamic runtime DLLs. +# Find vcvarsall.bat and look for dynamic runtime DLLs. if(MSVC) - if((MSVC_VERSION GREATER 1909) AND (MSVC_VERSION LESS 1920)) + if(NOT(MSVC_TOOLSET_VERSION STREQUAL "")) + set(VSVERSION "${MSVC_TOOLSET_VERSION}") + elseif((MSVC_VERSION GREATER 1909) AND (MSVC_VERSION LESS 1920)) set(VSVERSION "141") - set(VCRUNTIMEVERSION "140") elseif(MSVC_VERSION EQUAL 1900) set(VSVERSION "140") - set(VCRUNTIMEVERSION "140") elseif(MSVC_VERSION EQUAL 1800) set(VSVERSION "120") - set(VCRUNTIMEVERSION "120") elseif(MSVC_VERSION LESS 1800) message(WARNING "Visual Studio 2013 (VS12) or newer is required!") else() @@ -96,43 +95,17 @@ if(MSVC) if(NOT(VS_INSTALL_DIR STREQUAL "")) set(VSCOMNTOOLS "${VS_INSTALL_DIR}\\Common7\\Tools") endif() - message(WARNING ${VSCOMNTOOLS}) endif() if(VSCOMNTOOLS STREQUAL "") message(WARNING "Environment variable VSCOMNTOOLS not defined and vswhere.exe could not be found. Is Visual Studio properly installed?") else() - get_filename_component(VS_REDIST_DIR ${VSCOMNTOOLS}/../../VC/redist/${MEGA_ARCH}/Microsoft.VC${VSVERSION}.CRT ABSOLUTE) - set(MSVCP_DLL ${VS_REDIST_DIR}/msvcp${VCRUNTIMEVERSION}.dll) - if(MSVC_VERSION EQUAL 1800) - set(MSVCR_DLL ${VS_REDIST_DIR}/msvcr${VCRUNTIMEVERSION}.dll) - else() - set(MSVCR_DLL ${VS_REDIST_DIR}/vcruntime${VCRUNTIMEVERSION}.dll) - endif() - - if (EXISTS ${MSVCP_DLL} AND EXISTS ${MSVCR_DLL}) - message(STATUS "Found Visual C and C++ runtime .dll files") - set(MEGA_MSVC_DLLS ${MSVCP_DLL} ${MSVCR_DLL}) - else() - message(WARNING "Could not find Visual C and C++ runtime .dll files") - endif() - - if(NOT(MSVC_VERSION LESS 1900)) - get_filename_component(UCRT_DIR "${PROGRAMFILES_X86}/Windows Kits/10/Redist/ucrt/DLLs/${MEGA_ARCH}" ABSOLUTE) - if(EXISTS ${UCRT_DIR}) - message(STATUS "Found universal C runtime system component directory") - file(GLOB UCRT_FILES "${UCRT_DIR}/*.dll") - set(MEGA_MSVC_DLLS ${MEGA_MSVC_DLLS} ${UCRT_FILES}) - else() - message(STATUS "Could not find universal C runtime system component directory") - endif() - endif() - # Find vcvarsall.bat. - get_filename_component(VS_VCVARSALL_BAT ${VSCOMNTOOLS}/../../VC/vcvarsall.bat ABSOLUTE) + get_filename_component(VS_VCVARSALL_BAT ${VSCOMNTOOLS}/../../VC/Auxiliary/Build/vcvarsall.bat ABSOLUTE) if(NOT(EXISTS ${VS_VCVARSALL_BAT})) - get_filename_component(VS_VCVARSALL_BAT ${VSCOMNTOOLS}/../../VC/Auxiliary/Build/vcvarsall.bat ABSOLUTE) + # older VS versions have it here + get_filename_component(VS_VCVARSALL_BAT ${VSCOMNTOOLS}/../../VC/vcvarsall.bat ABSOLUTE) endif() if(EXISTS ${VS_VCVARSALL_BAT}) @@ -148,6 +121,47 @@ if(MSVC) message(WARNING "Could not find vsvarsall.bat") endif() endif() + + # We currently ship on platforms which might not have the Universal C Runtime installed. + set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) + + # TODO: The code for InstallRequiredSystemLibraries needs the UCRTVersion and WindowsSDKVersion + # environment variables set by vcvarsall in order to detect the correct version of the UCRT, in + # newer Windows SDK versions. We don't gurantee that vcvarsall has been loaded before running... + include(InstallRequiredSystemLibraries) + + foreach(RUNTIME_LIB ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}) + if(RUNTIME_LIB MATCHES "concrt") + set(MSVC_RUNTIME_CONCRT_PATH ${RUNTIME_LIB}) + elseif(RUNTIME_LIB MATCHES "msvcp") + set(MSVC_RUNTIME_MSVCP_PATH ${RUNTIME_LIB}) + endif() + endforeach() + + # InstallRequiredSystemLibraries adds the concrt dll to its list, but we don't need it. + if (EXISTS ${MSVC_RUNTIME_CONCRT_PATH}) + list(REMOVE_ITEM CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS "${MSVC_RUNTIME_CONCRT_PATH}") + endif() + + # InstallRequiredSystemLibraries (as of CMake 3.14.5) doesn't include msvcp140_1.dll or msvcp140_2.dll in its list. + if(EXISTS ${MSVC_RUNTIME_MSVCP_PATH}) + get_filename_component(MSVC_RUNTIME_MSVCP_DIR ${MSVC_RUNTIME_MSVCP_PATH} DIRECTORY) + message(STATUS "Found MSVC Redist directory: ${MSVC_RUNTIME_MSVCP_DIR}") + + file(GLOB MSVC_RUNTIME_MSVCP_FILES "${MSVC_RUNTIME_MSVCP_DIR}/msvcp*.dll") + + set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} ${MSVC_RUNTIME_MSVCP_FILES}) + + list(REMOVE_DUPLICATES CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS) + else() + message(WARNING "InstallRequiredSystemLibraries did not find any msvcp runtime dll") + endif() + + list(LENGTH CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS MSVC_RUNTIME_COUNT) + message(STATUS "Found ${MSVC_RUNTIME_COUNT} Visual C/C++ Runtime files") + + set(MEGA_MSVC_DLLS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}) endif()