-# For MSVC, at least do a version sanity check
-elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC")
- if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "18.0")
- message(WARNING "Your compiler is too old; we expect at least Visual Studio Nov 2013 CTP (MSVC 18). Your build will likely fail.")
- endif()
+ # Increase warning level on MSVC
+ # CMake puts /W3 in CMAKE_CXX_FLAGS which will be appended later, so we need to replace
+ string(REPLACE "/W3" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+
+ # Silence annoying/useless warnings
+ # C4127: conditional expression is constant
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4127")
+ # C4244: 'identifier': conversion from 't1' to 't2', possible loss of data
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244")
+ # C4456: declaration of 'identifier' hides previous local declaration
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4456")
+ # C4458: declaration of 'identifier' hides class member
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4458")
+ # C4996: deprecation warnings
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4996")
+
+ # Link against the correct version of the C runtime
+ set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt ${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+ set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}")
+ set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "/NODEFAULTLIB:libcmt /DEFAULTLIB:msvcrt ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL}")
+ set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/NODEFAULTLIB:libcmtd /DEFAULTLIB:msvcrtd ${CMAKE_EXE_LINKER_FLAGS_DEBUG}")