IGNITE-15678 CPP: Implement building windows installer of ODBC Driver on CMake - Fixes #9470.

Signed-off-by: Ivan Daschinsky <ivandasch@apache.org>
diff --git a/modules/platforms/cpp/CMakeLists.txt b/modules/platforms/cpp/CMakeLists.txt
index eb68cf4..286c851 100644
--- a/modules/platforms/cpp/CMakeLists.txt
+++ b/modules/platforms/cpp/CMakeLists.txt
@@ -20,9 +20,6 @@
 
 set(CMAKE_CXX_STANDARD 98)
 
-find_package(Java 1.8 REQUIRED)
-find_package(JNI REQUIRED)
-
 set(CMAKE_PROJECT_VERSION ${PROJECT_VERSION})
 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DIGNITE_IMPL -DIGNITE_FRIEND -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS")
@@ -52,11 +49,18 @@
     add_definitions(-D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS)
 endif()
 
+option (WITH_CORE ON)
 option (WITH_ODBC OFF)
+option (WITH_ODBC_MSI OFF)
 option (WITH_THIN_CLIENT OFF)
 option (WITH_TESTS OFF)
 option (WARNINGS_AS_ERRORS OFF)
 
+if (${WITH_CORE} OR ${WITH_TESTS})
+    find_package(Java 1.8 REQUIRED)
+    find_package(JNI REQUIRED)
+endif()
+
 if (${WARNINGS_AS_ERRORS})
     if (MSVC)
         add_compile_options(/WX)
@@ -67,9 +71,12 @@
 
 add_subdirectory(common)
 add_subdirectory(binary)
-add_subdirectory(jni)
-add_subdirectory(core)
-add_subdirectory(ignite)
+
+if (${WITH_CORE} OR ${WITH_TESTS})
+    add_subdirectory(jni)
+    add_subdirectory(core)
+    add_subdirectory(ignite)
+endif()
 
 if (${WITH_TESTS})
     enable_testing()
diff --git a/modules/platforms/cpp/odbc/CMakeLists.txt b/modules/platforms/cpp/odbc/CMakeLists.txt
index 742d36f..0244cf5 100644
--- a/modules/platforms/cpp/odbc/CMakeLists.txt
+++ b/modules/platforms/cpp/odbc/CMakeLists.txt
@@ -96,12 +96,68 @@
     if (MSVC_VERSION GREATER_EQUAL 1900)
         target_link_libraries(${TARGET} legacy_stdio_definitions)
     endif()
-				
-	set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME "ignite.odbc")
+                
+    set_target_properties(${TARGET} PROPERTIES OUTPUT_NAME "ignite.odbc")
 else()
     target_link_libraries(${TARGET} ignite-common ignite-binary ignite-network)
 endif()
 
+if (WIN32 AND ${WITH_ODBC_MSI})
+    find_program(WIX_CANDLE candle)
+    if(NOT WIX_CANDLE)
+        message(FATAL_ERROR "WIX candle.exe not found! Have you installed WIX Toolset or forgotten to add it to Path?")
+    endif()
+
+    find_program(WIX_LIGHT light)
+    if(NOT WIX_LIGHT)
+        message(FATAL_ERROR "WIX light.exe not found! Have you installed WIX Toolset or forgotten to add it to Path?")
+    endif()
+
+    set(WIX_ODBC_LIBRARY_PATH ".\\ignite.odbc.dll")
+
+    set(WIX_PROJECT_NAME "Apache Ignite")
+    set(WIX_MANUFACTURER "The Apache Software Foundation")
+    set(WIX_COPYRIGHT_COMMENT "Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are trademarks of The Apache Software Foundation.")
+
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+        set(WIX_BIT_SUFFIX "64-bit")
+        set(WIX_PRODUCT_ID "F3E308E4-910C-4AF5-82DE-2ACF4D64830E")
+        set(WIX_UPGRADE_CODE "1D7AEFDF-6CD2-4FB5-88F2-811A89832D6D")
+        set(WIX_COMPONENT_ID "E5F0DDF2-DD3C-4196-8A08-70921858A52F")
+        set(WIX_PROGRAM_FILES_FOLDER_ID "ProgramFiles64Folder")
+        set(WIX_COMPONENT_IS_WIN64 "yes")
+        set(WIX_PACKAGE_PLATFORM "x64")
+        set(WIX_INSTALLER_PREFIX ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/ignite-odbc-amd64)
+    elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
+        set(WIX_BIT_SUFFIX "32-bit")
+        set(WIX_PRODUCT_ID "D39CBABA-1E21-4701-AA5C-91EDA07B383B")
+        set(WIX_UPGRADE_CODE "743902A4-365C-424E-B226-5B2898A3941E")
+        set(WIX_COMPONENT_ID "4AFA26EE-C639-4EF2-A9B2-281119BB4BB5")
+        set(WIX_PROGRAM_FILES_FOLDER_ID "ProgramFilesFolder")
+        set(WIX_COMPONENT_IS_WIN64 "no")
+        set(WIX_PACKAGE_PLATFORM "x86")
+        set(WIX_INSTALLER_PREFIX ${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/ignite-odbc-x86)
+    endif()
+
+    set(WIX_PRODUCT_NAME "${WIX_PROJECT_NAME} ODBC ${WIX_BIT_SUFFIX} Driver")
+
+    configure_file(
+        "${CMAKE_CURRENT_LIST_DIR}/install/ignite-odbc.wxs.in"
+        "${WIX_INSTALLER_PREFIX}.wxs"
+        @ONLY
+    )
+
+    add_custom_command(
+        TARGET ${TARGET} POST_BUILD
+        COMMAND ${WIX_CANDLE} ${WIX_INSTALLER_PREFIX}.wxs -out ${WIX_INSTALLER_PREFIX}.wxobj
+        COMMAND ${WIX_LIGHT} -ext WixUIExtension ${WIX_INSTALLER_PREFIX}.wxobj -out ${WIX_INSTALLER_PREFIX}.msi
+    )
+endif()
+
 target_include_directories(${TARGET} INTERFACE include)
 
 install(TARGETS ${TARGET} LIBRARY DESTINATION lib)
+
+if (WIN32 AND ${WITH_ODBC_MSI})
+   install(FILES ${WIX_INSTALLER_PREFIX}.msi DESTINATION bin)
+endif()
diff --git a/modules/platforms/cpp/odbc/install/ignite-odbc.wxs.in b/modules/platforms/cpp/odbc/install/ignite-odbc.wxs.in
new file mode 100644
index 0000000..a3dc84d
--- /dev/null
+++ b/modules/platforms/cpp/odbc/install/ignite-odbc.wxs.in
@@ -0,0 +1,113 @@
+<?xml version='1.0' encoding='windows-1252'?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
+    <Product Name='@WIX_PRODUCT_NAME@' Manufacturer='@WIX_MANUFACTURER@'
+        Id='@WIX_PRODUCT_ID@'
+        UpgradeCode='@WIX_UPGRADE_CODE@'
+        Language='1033' Codepage='1252' Version='@CMAKE_PROJECT_VERSION@'>
+
+        <Package Id='*' Keywords='Installer' Description="@WIX_PRODUCT_NAME@ Installer"
+            Comments='@WIX_COPYRIGHT_COMMENT@' Platform="@WIX_PACKAGE_PLATFORM@"
+            InstallerVersion='301' Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+
+        <Media Id='1' Cabinet='package.cab' EmbedCab='yes' DiskPrompt='CD-ROM #1' />
+        <Property Id='DiskPrompt' Value="@WIX_PRODUCT_NAME@ Installation [1]" />
+
+        <Directory Id='TARGETDIR' Name='SourceDir'>
+            <Directory Id='@WIX_PROGRAM_FILES_FOLDER_ID@' Name='ProgramFiles'>
+                <Directory Id='ApacheIgnite' Name='Apache Ignite'>
+                    <Directory Id='INSTALLDIR' Name='ODBC Driver'>
+                        <Component Id='Driver' Guid='@WIX_COMPONENT_ID@' Win64='@WIX_COMPONENT_IS_WIN64@'>
+                            <File Id='IgniteOdbcDll' Name='ignite.odbc.dll' DiskId='1' Source='@WIX_ODBC_LIBRARY_PATH@' KeyPath='yes'/>
+
+                            <RegistryValue Root='HKLM' Key='Software\ODBC\ODBCINST.INI\ODBC Drivers' Name='Apache Ignite' Type='string' Value='Installed'/>
+
+                            <RegistryKey Id='OdbcDriverRegInfo' Root='HKLM' Key='Software\ODBC\ODBCINST.INI\Apache Ignite' ForceCreateOnInstall='yes' ForceDeleteOnUninstall='yes'>
+                                <RegistryValue Type='string' Name='DriverODBCVer' Value='03.00'/>
+                                <RegistryValue Type='string' Name='Driver' Value='[#IgniteOdbcDll]'/>
+                                <RegistryValue Type='string' Name='Setup' Value='[#IgniteOdbcDll]'/>
+                                <RegistryValue Type='integer' Name='UsageCount' Value='1'/>
+                            </RegistryKey>
+                        </Component>
+                    </Directory>
+                </Directory>
+            </Directory>
+        </Directory>
+
+        <Feature Id='Complete' Title='ODBC Driver' Description='@WIX_PRODUCT_NAME@.' Level='1'
+            ConfigurableDirectory='INSTALLDIR' Absent='disallow' AllowAdvertise='no' InstallDefault='local'>
+            <ComponentRef Id='Driver' />
+        </Feature>
+
+        <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
+
+        <UI Id="WixUI_InstallDir">
+            <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" />
+            <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" />
+            <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" />
+
+            <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
+            <Property Id="WixUI_Mode" Value="InstallDir" />
+
+            <DialogRef Id="BrowseDlg" />
+            <DialogRef Id="DiskCostDlg" />
+            <DialogRef Id="ErrorDlg" />
+            <DialogRef Id="FatalError" />
+            <DialogRef Id="FilesInUse" />
+            <DialogRef Id="MsiRMFilesInUse" />
+            <DialogRef Id="PrepareDlg" />
+            <DialogRef Id="ProgressDlg" />
+            <DialogRef Id="ResumeDlg" />
+            <DialogRef Id="UserExit" />
+
+            <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
+            <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
+
+            <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
+
+            <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">NOT Installed</Publish>
+            <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
+
+            <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
+            <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
+            <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
+            <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
+            <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
+            <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
+            <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish>
+
+            <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1">NOT Installed</Publish>
+            <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
+            <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish>
+
+            <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
+
+            <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+            <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
+            <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
+
+            <Property Id="ARPNOMODIFY" Value="1" />
+        </UI>
+
+        <UIRef Id="WixUI_Common" />
+        <UIRef Id="WixUI_ErrorProgressText" />
+
+    </Product>
+</Wix>