MINIFICPP-1099 - Fix Windows MSI build

Signed-off-by: Arpad Boda <aboda@apache.org>

This closes #692
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9a04e55..6daf31b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -661,27 +661,57 @@
 # Generate source assembly
 set(ASSEMBLY_BASE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
 if(WIN32)
-set(CPACK_ALL_INSTALL_TYPES Full Developer)
-set(CPACK_COMPONENT_LIBRARIES_INSTALL_TYPES Developer Full)
-set(CPACK_COMPONENT_HEADERS_INSTALL_TYPES Developer Full)
-set(CPACK_COMPONENT_APPLICATIONS_INSTALL_TYPES Full)
-set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/msi/minifi-logo-png-banner.png")
-set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/msi/bgr.png")
+	set(CPACK_ALL_INSTALL_TYPES Full Developer)
+	set(CPACK_COMPONENT_LIBRARIES_INSTALL_TYPES Developer Full)
+	set(CPACK_COMPONENT_HEADERS_INSTALL_TYPES Developer Full)
+	set(CPACK_COMPONENT_APPLICATIONS_INSTALL_TYPES Full)
+	set(CPACK_WIX_UI_BANNER "${CMAKE_CURRENT_SOURCE_DIR}/msi/minifi-logo-png-banner.png")
+	set(CPACK_WIX_UI_DIALOG "${CMAKE_CURRENT_SOURCE_DIR}/msi/bgr.png")
 
-file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/conf/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/conf/")
-file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
-file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/README.md" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
-file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/NOTICE" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
+	file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/conf/" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}/conf/")
+	file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
+	file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/README.md" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
+	file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/NOTICE" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
 
-if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-    set(CPACK_WIX_EXTRA_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/msi/x64.wsi")
-elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
-set(CPACK_WIX_EXTRA_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/msi/x86.wsi")
-endif()
-    set(CPACK_WIX_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/msi/WixWin.wsi")
+	# Determine the path of the VC Redistributable Merge Modules
+	if (DEFINED ENV{VCToolsRedistDir})
+		# Just get the redist dir that has been set by the build environment
+		set(VCRUNTIME_REDIST_DIR $ENV{VCToolsRedistDir})
+	else()
+		# Try to fall back to a redist dir relative to the MSVC compiler
+		string(REGEX REPLACE "/VC/Tools/.*" "/VC/Redist/MSVC/" VCRUNTIME_REDIST_BASE_DIR ${CMAKE_C_COMPILER})
+		file(GLOB VCRUNTIME_REDIST_VERSIONS "${VCRUNTIME_REDIST_BASE_DIR}/*")
+		if (NOT VCRUNTIME_REDIST_VERSIONS)
+			message(FATAL_ERROR "Could not find the VC Redistributable Merge Modules. Please set VCRUNTIME_X86_MERGEMODULE_PATH and VCRUNTIME_X64_MERGEMODULE_PATH manually!")
+		endif()
+		# Sort the directories in descending order and take the first one - it should be the latest version
+		list(SORT VCRUNTIME_REDIST_VERSIONS)
+		list(REVERSE VCRUNTIME_REDIST_VERSIONS)
+		list(GET VCRUNTIME_REDIST_VERSIONS 0 VCRUNTIME_REDIST_DIR)
+	endif()
+	file(GLOB VCRUNTIME_X86_MERGEMODULES "${VCRUNTIME_REDIST_DIR}/MergeModules/Microsoft_VC*_CRT_x86.msm")
+	file(GLOB VCRUNTIME_X64_MERGEMODULES "${VCRUNTIME_REDIST_DIR}/MergeModules/Microsoft_VC*_CRT_x64.msm")
+	if (NOT VCRUNTIME_X86_MERGEMODULES OR NOT VCRUNTIME_X64_MERGEMODULES)
+		message(FATAL_ERROR "Could not find the VC Redistributable Merge Modules. Please set VCRUNTIME_X86_MERGEMODULE_PATH and VCRUNTIME_X64_MERGEMODULE_PATH manually!")
+	else()
+		list(GET VCRUNTIME_X86_MERGEMODULES 0 VCRUNTIME_X86_MERGEMODULE_PATH)
+		list(GET VCRUNTIME_X64_MERGEMODULES 0 VCRUNTIME_X64_MERGEMODULE_PATH)
+	endif()
 
+	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+		message("Using ${VCRUNTIME_X64_MERGEMODULE_PATH} VC Redistributable Merge Module")
+		configure_file("msi/x64.wsi" "msi/x64.wsi" @ONLY)
+		set(CPACK_WIX_EXTRA_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/msi/x64.wsi")
+	elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+		message("Using ${VCRUNTIME_X86_MERGEMODULE_PATH} VC Redistributable Merge Module")
+		configure_file("msi/x86.wsi" "msi/x86.wsi" @ONLY)
+		set(CPACK_WIX_EXTRA_SOURCES "${CMAKE_CURRENT_BINARY_DIR}/msi/x86.wsi")
+	else()
+		message(FATAL_ERROR "Could not determine architecture, CMAKE_SIZEOF_VOID_P is unexpected: ${CMAKE_SIZEOF_VOID_P}")
+	endif()
+	set(CPACK_WIX_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/msi/WixWin.wsi")
 else()
-set(CPACK_SOURCE_GENERATOR "TGZ")
+	set(CPACK_SOURCE_GENERATOR "TGZ")
 endif(WIN32)
 set(CPACK_SOURCE_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}-source")
 set(CPACK_SOURCE_IGNORE_FILES "/docs/generated/;${CMAKE_SOURCE_DIR}/build/;~$;${CPACK_SOURCE_IGNORE_FILES};${CMAKE_SOURCE_DIR}/.git/;${CMAKE_SOURCE_DIR}/.idea/;${CMAKE_SOURCE_DIR}/cmake-build-debug/;${CMAKE_SOURCE_DIR}/extensions/expression-language/Scanner.h;${CMAKE_SOURCE_DIR}/extensions/expression-language/Scanner.cpp;${CMAKE_SOURCE_DIR}/extensions/expression-language/Parser.cpp;${CMAKE_SOURCE_DIR}/extensions/expression-language/Parser.hpp;${CMAKE_SOURCE_DIR}/extensions/expression-language/scanner.hh;${CMAKE_SOURCE_DIR}/extensions/expression-language/position.hh;${CMAKE_SOURCE_DIR}/extensions/expression-language/location.hh;${CMAKE_SOURCE_DIR}/extensions/expression-language/stack.hh")
@@ -722,11 +752,11 @@
         
 			
 if (WIN32)
-set(CPACK_GENERATOR "WIX")
-set(CPACK_WIX_UPGRADE_GUID "FE29F801-3486-4E9E-AFF9-838C1A5C8D59")
-set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/msi/minifi-logo-ico.ico")
+	set(CPACK_GENERATOR "WIX")
+	set(CPACK_WIX_UPGRADE_GUID "FE29F801-3486-4E9E-AFF9-838C1A5C8D59")
+	set(CPACK_WIX_PRODUCT_ICON "${CMAKE_CURRENT_SOURCE_DIR}/msi/minifi-logo-ico.ico")
 else()
-set(CPACK_GENERATOR "TGZ")
+	set(CPACK_GENERATOR "TGZ")
 endif()
 set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 1)
 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache NiFi MiNiFi C++ version ${VERSION}")
@@ -738,11 +768,11 @@
 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/msi/LICENSE.txt")
 if(NOT WIN32)
-set(CPACK_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}")
-set(CPACK_GENERATOR "TGZ")
-set(CPACK_BINARY_TGZ, "ON")
+	set(CPACK_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}")
+	set(CPACK_GENERATOR "TGZ")
+	set(CPACK_BINARY_TGZ, "ON")
 else()
-set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}")
+	set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}")
 endif()
 set(CPACK_PACKAGE_INSTALL_DIRECTORY "ApacheNiFiMiNiFi")
 set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
diff --git a/CMakeSettings.json b/CMakeSettings.json
index ea513ae..89ce4d7 100644
--- a/CMakeSettings.json
+++ b/CMakeSettings.json
@@ -3,7 +3,7 @@
   "configurations": [
     {
       "name": "x64-Release",
-      "generator": "Visual Studio 15 2017",
+      "generator": "Visual Studio 15 2017 Win64",
       "configurationType": "RelWithDebInfo",
       "inheritEnvironments": [ "msvc_x64_x64" ],
       "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
diff --git a/msi/x64.wsi b/msi/x64.wsi
index 56c3209..591713d 100644
--- a/msi/x64.wsi
+++ b/msi/x64.wsi
@@ -18,7 +18,7 @@
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
     <Fragment>
 	 <DirectoryRef Id="TARGETDIR">
-      <Merge Id="VCRedist"  SourceFile="C:\Program Files (x86)\Common Files\Merge Modules\Microsoft_VC140_CRT_x64.msm" 	   DiskId="1" 	   Language="0" />
+      <Merge Id="VCRedist"  SourceFile="@VCRUNTIME_X64_MERGEMODULE_PATH@" 	   DiskId="1" 	   Language="0" />
     </DirectoryRef>
     </Fragment>
 </Wix>
\ No newline at end of file
diff --git a/msi/x86.wsi b/msi/x86.wsi
index 8136aac..27a75cf 100644
--- a/msi/x86.wsi
+++ b/msi/x86.wsi
@@ -18,8 +18,7 @@
 <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
     <Fragment>
 	 <DirectoryRef Id="TARGETDIR">
-      <Merge Id="VCRedist"  SourceFile="C:\Program Files (x86)\Common Files\Merge Modules\Microsoft_VC140_CRT_x86.msm" 	   DiskId="1" 	   Language="0" />
+      <Merge Id="VCRedist"  SourceFile="@VCRUNTIME_X86_MERGEMODULE_PATH@"	   DiskId="1" 	   Language="0" />
     </DirectoryRef>
     </Fragment>
-
 </Wix>
\ No newline at end of file
diff --git a/win_build_vs.bat b/win_build_vs.bat
index 963510c..fcb69dc 100644
--- a/win_build_vs.bat
+++ b/win_build_vs.bat
@@ -23,6 +23,7 @@
 set skiptests=OFF
 set cmake_build_type=Release
 set build_type=Release
+set build_platform=Win32
 set build_kafka=off
 set build_coap=off
 set build_jni=off
@@ -48,7 +49,8 @@
 	rem if [%%~x] EQU [/C] ( 
 	rem set build_coap=ON
     rem )
-	if [%%~x] EQU [/64] ( 
+	if [%%~x] EQU [/64] (
+	set build_platform=x64
 	set generator="Visual Studio 15 2017 Win64"
     )
     if [%%~x] EQU [/D] ( 
@@ -63,7 +65,7 @@
 
 
 
-cmake -G %generator% -DCMAKE_BUILD_TYPE_INIT=%cmake_build_type% -DCMAKE_BUILD_TYPE=%cmake_build_type% -DWIN32=WIN32 -DENABLE_LIBRDKAFKA=%build_kafka% -DENABLE_JNI=%build_jni% -DOPENSSL_OFF=OFF -DENABLE_COAP=%build_coap% -DUSE_SHARED_LIBS=OFF -DDISABLE_CONTROLLER=ON  -DBUILD_ROCKSDB=ON -DFORCE_WINDOWS=ON -DUSE_SYSTEM_UUID=OFF -DDISABLE_LIBARCHIVE=ON -DDISABLE_SCRIPTING=ON -DEXCLUDE_BOOST=ON -DENABLE_WEL=TRUE -DFAIL_ON_WARNINGS=OFF -DSKIP_TESTS=%skiptests% .. && msbuild /m nifi-minifi-cpp.sln /property:Configuration=%build_type% && copy main\release\minifi.exe main\
+cmake -G %generator% -DCMAKE_BUILD_TYPE_INIT=%cmake_build_type% -DCMAKE_BUILD_TYPE=%cmake_build_type% -DWIN32=WIN32 -DENABLE_LIBRDKAFKA=%build_kafka% -DENABLE_JNI=%build_jni% -DOPENSSL_OFF=OFF -DENABLE_COAP=%build_coap% -DUSE_SHARED_LIBS=OFF -DDISABLE_CONTROLLER=ON  -DBUILD_ROCKSDB=ON -DFORCE_WINDOWS=ON -DUSE_SYSTEM_UUID=OFF -DDISABLE_LIBARCHIVE=ON -DDISABLE_SCRIPTING=ON -DEXCLUDE_BOOST=ON -DENABLE_WEL=TRUE -DFAIL_ON_WARNINGS=OFF -DSKIP_TESTS=%skiptests% .. && msbuild /m nifi-minifi-cpp.sln /property:Configuration=%build_type% /property:Platform=%build_platform% && copy main\%build_type%\minifi.exe main\
 if [%cpack%] EQU [ON] ( 
 	cpack
     )