From a99c82340100847e56fa712f4a60c927ce4a3500 Mon Sep 17 00:00:00 2001
From: Vojtech Kral <vojtech@kral.hk>
Date: Tue, 29 Jan 2019 15:48:30 +0100
Subject: [PATCH] Build: MSVC 2017 compat (w/o xs code - Perl unit tests)

---
 deps/deps-windows.cmake      | 23 ++++++++++++++++++-----
 src/avrdude/windows/unistd.h |  2 ++
 src/libslic3r/Int128.hpp     |  5 +++++
 3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake
index 44a1843bb..7276277e6 100644
--- a/deps/deps-windows.cmake
+++ b/deps/deps-windows.cmake
@@ -1,8 +1,21 @@
 
+if (MSVC_VERSION EQUAL 1800)
+    set(DEP_VS_VER "12")
+    set(DEP_BOOST_TOOLSET "msvc-12.0")
+elseif (MSVC_VERSION EQUAL 1900)
+    set(DEP_VS_VER "14")
+    set(DEP_BOOST_TOOLSET "msvc-14.0")
+elseif (MSVC_VERSION GREATER 1900)
+    set(DEP_VS_VER "15")
+    set(DEP_BOOST_TOOLSET "msvc-14.1")
+else ()
+    message(FATAL_ERROR "Unsupported MSVC version")
+endif ()
+
 if (${DEPS_BITS} EQUAL 32)
-    set(DEP_MSVC_GEN "Visual Studio 12")
+    set(DEP_MSVC_GEN "Visual Studio ${DEP_VS_VER}")
 else ()
-    set(DEP_MSVC_GEN "Visual Studio 12 Win64")
+    set(DEP_MSVC_GEN "Visual Studio ${DEP_VS_VER} Win64")
 endif ()
 
 
@@ -29,7 +42,7 @@ ExternalProject_Add(dep_boost
         --with-regex
         "--prefix=${DESTDIR}/usr/local"
         "address-model=${DEPS_BITS}"
-        toolset=msvc-12.0
+        "toolset=${DEP_BOOST_TOOLSET}"
         link=static
         variant=release
         threading=multi
@@ -204,7 +217,7 @@ ExternalProject_Add(dep_libcurl
     URL_HASH SHA256=cc245bf9a1a42a45df491501d97d5593392a03f7b4f07b952793518d97666115
     BUILD_IN_SOURCE 1
     CONFIGURE_COMMAND ""
-    BUILD_COMMAND cd winbuild && nmake /f Makefile.vc mode=static VC=12 GEN_PDB=yes DEBUG=no "MACHINE=${DEP_LIBCURL_TARGET}"
+    BUILD_COMMAND cd winbuild && nmake /f Makefile.vc mode=static "VC=${DEP_VS_VER}" GEN_PDB=yes DEBUG=no "MACHINE=${DEP_LIBCURL_TARGET}"
     INSTALL_COMMAND cd builds\\libcurl-*-release-*-winssl
         && "${CMAKE_COMMAND}" -E copy_directory include "${DESTDIR}\\usr\\local\\include"
         && "${CMAKE_COMMAND}" -E copy_directory lib "${DESTDIR}\\usr\\local\\lib"
@@ -214,7 +227,7 @@ if (${DEP_DEBUG})
     ExternalProject_Add_Step(dep_libcurl build_debug
         DEPENDEES build
         DEPENDERS install
-        COMMAND cd winbuild && nmake /f Makefile.vc mode=static VC=12 GEN_PDB=yes DEBUG=yes "MACHINE=${DEP_LIBCURL_TARGET}"
+        COMMAND cd winbuild && nmake /f Makefile.vc mode=static "VC=${DEP_VS_VER}" GEN_PDB=yes DEBUG=yes "MACHINE=${DEP_LIBCURL_TARGET}"
         WORKING_DIRECTORY "${SOURCE_DIR}"
     )
     ExternalProject_Add_Step(dep_libcurl install_debug
diff --git a/src/avrdude/windows/unistd.h b/src/avrdude/windows/unistd.h
index b1bc6bf7f..95ba79a34 100644
--- a/src/avrdude/windows/unistd.h
+++ b/src/avrdude/windows/unistd.h
@@ -45,7 +45,9 @@ extern "C" {
 #define chdir _chdir
 #define isatty _isatty
 #define lseek _lseek
+#if _MSC_VER < 1900
 #define snprintf _snprintf
+#endif
 #define strncasecmp _strnicmp
 #define strcasecmp _stricmp
 #define stat _stat
diff --git a/src/libslic3r/Int128.hpp b/src/libslic3r/Int128.hpp
index d54b75342..56dc5f461 100644
--- a/src/libslic3r/Int128.hpp
+++ b/src/libslic3r/Int128.hpp
@@ -53,6 +53,11 @@
 	#define HAS_INTRINSIC_128_TYPE
 #endif
 
+#if defined(_MSC_VER) && defined(_WIN64)
+	#include <intrin.h>
+	#pragma intrinsic(_mul128)
+#endif
+
 //------------------------------------------------------------------------------
 // Int128 class (enables safe math on signed 64bit integers)
 // eg Int128 val1((int64_t)9223372036854775807); //ie 2^63 -1