if (MSVC)
	if (CMAKE_VERSION VERSION_LESS 3.15.0)
		message(FATAL_ERROR "windows builds require CMake >= 3.15")
	endif()
	if(NOT DEFINED CMAKE_MSVC_RUNTIME_LIBRARY)
		if (MSVC_RUNTIME STREQUAL "dynamic")
			set(MSVC_DEFAULT_RUNTIME "MultiThreadedDLL")
		elseif(MSVC_RUNTIME STREQUAL "static")
			set(MSVC_DEFAULT_RUNTIME "MultiThreaded")
		else()
			message(WARNING "invalid MSVC_RUNTIME (deprecated) value '${MSVC_RUNTIME}', ignoring")
		endif()

		if(MSVC_DEFAULT_RUNTIME)
			message("Using CMAKE_MSVC_RUNTIME_LIBRARY=${MSVC_DEFAULT_RUNTIME} (derived from MSVC_RUNTIME (deprecated) value '${MSVC_RUNTIME}')" )
		else()
			set(MSVC_DEFAULT_RUNTIME "MultiThreaded")

			if (CMAKE_BUILD_TYPE STREQUAL "Debug")
				string(APPEND MSVC_DEFAULT_RUNTIME "Debug")
			endif()

			if (BUILD_SHARED_LIBS)
				string(APPEND MSVC_DEFAULT_RUNTIME "DLL")
			endif()
			message("Using CMAKE_MSVC_RUNTIME_LIBRARY=${MSVC_DEFAULT_RUNTIME}" )
		endif()

		set(CMAKE_MSVC_RUNTIME_LIBRARY ${MSVC_DEFAULT_RUNTIME} CACHE STRING "MSVC runtime")
	endif()

	message("build is using MSVC runtime ${CMAKE_MSVC_RUNTIME_LIBRARY}")

	string(FIND ${CMAKE_MSVC_RUNTIME_LIBRARY} "DLL" IS_SHARED)
	if(IS_SHARED STREQUAL "-1")
		if(BUILD_SHARED_LIBS)
			message(FATAL_ERROR "Static CRT is only supported in a fully static build")
		endif()
		message(STATUS "Use the MSVC static runtime option carefully!")
		message(STATUS "OpenSSL uses /MD by default, and is very picky")
		message(STATUS "Random freeing errors are a common sign of runtime issues")
	endif()

	if(NOT DEFINED CMAKE_SUPPRESS_REGENERATION)
		set(CMAKE_SUPPRESS_REGENERATION ON)
	endif()
endif()
