From 9ae3478930517e0a479fcea3fc5676d67b864d72 Mon Sep 17 00:00:00 2001
From: Franck Zibi <franck.zibi@gmail.com>
Date: Mon, 10 Feb 2020 12:26:17 +0100
Subject: [PATCH] Add support for Visual Studio 2017 (MSVC_VERSION=15) and
 Visual Studio 2019 (MSVC_VERSION=16)

---
 cmake/WindowsCreateLinkHeader.cmake             |  7 +++++--
 cmake/WindowsDownloadPrebuiltDependencies.cmake | 17 +++++++++++++++++
 scripts/build_win.cmd                           | 14 ++++++++++++++
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/cmake/WindowsCreateLinkHeader.cmake b/cmake/WindowsCreateLinkHeader.cmake
index 29e77b08953..9aa91f6aab5 100644
--- a/cmake/WindowsCreateLinkHeader.cmake
+++ b/cmake/WindowsCreateLinkHeader.cmake
@@ -36,9 +36,12 @@ function(find_dumpbin var)
     set(MSVC_PRODUCT_VERSION_1600 10.0)
     set(MSVC_PRODUCT_VERSION_1700 11.0)
     set(MSVC_PRODUCT_VERSION_1800 12.0)
-    set(MSVC_PRODUCT_VERSION_1900 14.0)
-    get_filename_component(MSVC_VC_DIR [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\${MSVC_PRODUCT_VERSION_${MSVC_VERSION}}\\Setup\\VC;ProductDir] REALPATH CACHE)
+	#Visual Studio 2015, 2017 and 2019 all use the same '14.0' key in the registry
+	if(${MSVC_VERSION} MATCHES "19[0-2][0-9]")
+		set(MSVC_PRODUCT_VERSION_${MSVC_VERSION} 14.0)
+	endif()
 
+    get_filename_component(MSVC_VC_DIR [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\${MSVC_PRODUCT_VERSION_${MSVC_VERSION}}\\Setup\\VC;ProductDir] REALPATH CACHE)
     find_program(DUMPBIN_EXECUTABLE dumpbin ${MSVC_VC_DIR}/bin)
     if(NOT DUMPBIN_EXECUTABLE)
         message(FATAL_ERROR "Could not find DUMPBIN_EXECUTABLE please define this variable")
diff --git a/cmake/WindowsDownloadPrebuiltDependencies.cmake b/cmake/WindowsDownloadPrebuiltDependencies.cmake
index 168cf319115..1eec73f6a82 100644
--- a/cmake/WindowsDownloadPrebuiltDependencies.cmake
+++ b/cmake/WindowsDownloadPrebuiltDependencies.cmake
@@ -12,6 +12,15 @@ set(DEPENDENCIES_SHA_1900_27 "17eecb095bd3b0774a87a38624a77ce35e497cd2")
 set(DEPENDENCIES_URL_1900_35 "${DEPENDENCIES_URL_BASE}/v${DEPENDENCIES_VERSION}/${DEPENDENCIES_NAME_1900_35}${DEPENDENCIES_FILE_EXT}")
 set(DEPENDENCIES_SHA_1900_35 "f060403fd1a7448d866d27c0e5b7dced39c0a607")
 
+# Dependencies for Visual Studio 2017 (same as Visual Studio 2015)
+set(DEPENDENCIES_NAME_1910_35 ${DEPENDENCIES_NAME_1900_35})
+set(DEPENDENCIES_URL_1910_35 ${DEPENDENCIES_URL_1900_35})
+set(DEPENDENCIES_SHA_1910_35 ${DEPENDENCIES_SHA_1900_35})
+# Dependencies for Visual Studio 2019 (same as Visual Studio 2015)
+set(DEPENDENCIES_NAME_1920_35 ${DEPENDENCIES_NAME_1900_35})
+set(DEPENDENCIES_URL_1920_35 ${DEPENDENCIES_URL_1900_35})
+set(DEPENDENCIES_SHA_1920_35 ${DEPENDENCIES_SHA_1900_35})
+
 caffe_option(USE_PREBUILT_DEPENDENCIES "Download and use the prebuilt dependencies" ON IF MSVC)
 if(MSVC)
   file(TO_CMAKE_PATH $ENV{USERPROFILE} USERPROFILE_DIR)
@@ -36,6 +45,14 @@ if(USE_PREBUILT_DEPENDENCIES)
         message(STATUS "Building without python. Prebuilt dependencies will default to Python 2.7")
         set(_pyver 27)
     endif()
+    # Visual Studio 2017 has CMake MSVC_VERSION between 1910 and 1919 (see https://cmake.org/cmake/help/v3.12/variable/MSVC_VERSION.html)
+    if(${MSVC_VERSION} MATCHES "191[0-9]")
+        set(MSVC_VERSION 1910)
+    endif()
+    # Visual Studio 2019 has CMake MSVC_VERSION between 1920 and 1929
+    if(${MSVC_VERSION} MATCHES "192[0-9]")
+        set(MSVC_VERSION 1920)
+    endif()
     if(NOT DEFINED DEPENDENCIES_URL_${MSVC_VERSION}_${_pyver})
         message(FATAL_ERROR "Could not find url for MSVC version = ${MSVC_VERSION} and Python version = ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.")
     endif()
diff --git a/scripts/build_win.cmd b/scripts/build_win.cmd
index 06f06fababf..62a32f056ce 100644
--- a/scripts/build_win.cmd
+++ b/scripts/build_win.cmd
@@ -103,6 +103,12 @@ if DEFINED APPVEYOR (
 :: Use the exclamation mark ! below to delay the
 :: expansion of CMAKE_GENERATOR
 if %WITH_NINJA% EQU 0 (
+    if "%MSVC_VERSION%"=="16" (
+        set CMAKE_GENERATOR=Visual Studio 16 2019
+    )
+    if "%MSVC_VERSION%"=="15" (
+        set CMAKE_GENERATOR=Visual Studio 15 2017 Win64
+    )
     if "%MSVC_VERSION%"=="14" (
         set CMAKE_GENERATOR=Visual Studio 14 2015 Win64
     )
@@ -152,6 +158,14 @@ pushd build
 
 :: Setup the environement for VS x64
 set batch_file=!VS%MSVC_VERSION%0COMNTOOLS!..\..\VC\vcvarsall.bat
+if "%MSVC_VERSION%"=="15" (
+	:: 'vcvarsall.bat' path for Visual Studio 2017
+	set batch_file=!VS%MSVC_VERSION%0COMNTOOLS!..\..\VC\Auxiliary\Build\vcvarsall.bat
+)
+if "%MSVC_VERSION%"=="16" (
+	:: 'vcvarsall.bat' path for Visual Studio 2019
+	set batch_file=!VS%MSVC_VERSION%0COMNTOOLS!..\..\VC\Auxiliary\Build\vcvarsall.bat
+)
 call "%batch_file%" amd64
 
 :: Configure using cmake and using the caffe-builder dependencies