From 60d7acb4fc8d09e8996c0a675d4f6dfae3bf0a10 Mon Sep 17 00:00:00 2001
From: Hilton Bristow <hilton.bristow@gmail.com>
Date: Tue, 12 Mar 2013 12:26:49 +1000
Subject: [PATCH] Added Windows functionality to FindMatlab. Untested

---
 cmake/OpenCVFindMatlab.cmake | 60 ++++++++++++++++++++++++------------
 1 file changed, 41 insertions(+), 19 deletions(-)

diff --git a/cmake/OpenCVFindMatlab.cmake b/cmake/OpenCVFindMatlab.cmake
index d18742314..391eae718 100644
--- a/cmake/OpenCVFindMatlab.cmake
+++ b/cmake/OpenCVFindMatlab.cmake
@@ -36,6 +36,9 @@ MACRO(locate_matlab_root)
     foreach (DIR_ ${SEARCH_DIRS_})
       file(GLOB MATLAB_ROOT_DIR ${DIR_}/*matlab*)
       if (MATLAB_ROOT_DIR)
+        list(SORT MATLAB_ROOT_DIR)
+        list(REVERSE MATLAB_ROOT_DIR)
+        list(GET MATLAB_ROOT_DIR 0 MATLAB_ROOT_DIR)
         break()
       endif()
     endforeach()
@@ -47,12 +50,30 @@ MACRO(locate_matlab_root)
     foreach (DIR_ ${SEARCH_DIRS_})
       file(GLOB MATLAB_ROOT_DIR ${DIR_}/*matlab*)
       if (MATLAB_ROOT_DIR)
+        list(SORT MATLAB_ROOT_DIR)
+        list(REVERSE MATLAB_ROOT_DIR)
+        list(GET MATLAB_ROOT_DIR 0 MATLAB_ROOT_DIR)
         break()
       endif()
     endforeach()
 
   # --- WINDOWS ---
   elseif (WIN32)
+    # query the registry
+    set(REG_ROOTS_ "HKEY_LOCAL_MACHINE" "HKEY_CURRENT_USER")
+    foreach(REG_ROOT_ REG_ROOTS_)
+      execute_process(COMMAND reg query ${REG_ROOT_}\\SOFTWARE\\MathWorks\\MATLAB /f * /k OUTPUT_VARIABLE VERSIONS_)
+      if (VERSIONS_)
+        # sort in order from highest to lowest
+        list(SORT VERSIONS_)
+        list(REVERSE VERSIONS_)
+        list(GET VERSIONS_ 0 VERSION_)
+        get_filename_component(MATLAB_ROOT_DIR [${REG_ROOT_}\\SOFTWARE\\MathWorks\\MATLAB\\${VERSION_};Install_Dir] ABSOLUTE PATH)
+        if (MATLAB_ROOT_DIR)
+          break()
+        endif()
+      endif()
+    endforeach()
   endif()
   # unset local variables
   unset(SEARCH_DIRS_)
@@ -67,30 +88,31 @@ endMACRO()
 # (include directory and libraries) under the root. If everything is found,
 # sets the variable MATLAB_FOUND to TRUE
 MACRO(locate_matlab_components MATLAB_ROOT_DIR)
+  # get the mex extension
   if (UNIX)
-    # get the mex extension
     execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext OUTPUT_VARIABLE MATLAB_MEXEXT)
-    string(STRIP ${MATLAB_MEXEXT} MATLAB_MEXEXT)
-    string(REPLACE "mex" "" MATLAB_ARCH ${MATLAB_MEXEXT})
-
-    # get the path to the libraries
-    set(MATLAB_LIBRARY_DIRS ${MATLAB_ROOT_DIR}/bin/${MATLAB_ARCH})
-
-    # get the libraries
-    find_library(MATLAB_LIB_MX  mx  PATHS ${MATLAB_LIBRARY_DIRS} NO_DEFAULT_PATH)
-    find_library(MATLAB_LIB_MEX mex PATHS ${MATLAB_LIBRARY_DIRS} NO_DEFAULT_PATH)
-    find_library(MATLAB_LIB_MAT mat PATHS ${MATLAB_LIBRARY_DIRS} NO_DEFAULT_PATH)
-    set(MATLAB_LIBS ${MATLAB_LIB_MX} ${MATLAB_LIB_MEX} ${MATLAB_LIB_MAT})
-
-    # get the include path
-    find_path(MATLAB_INCLUDE_DIRS mex.h ${MATLAB_ROOT_DIR}/extern/include) 
-
-    # get the mex shell script
-    find_file(MATLAB_MEX_SCRIPT NAMES mex mex.bat PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH)
-    
   elseif (WIN32)
+    execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext.bat OUTPUT_VARIABLE MATLAB_MEXEXT)
   endif()
+    
+  string(STRIP ${MATLAB_MEXEXT} MATLAB_MEXEXT)
+  string(REPLACE "mex" "" MATLAB_ARCH ${MATLAB_MEXEXT})
 
+  # get the path to the libraries
+  set(MATLAB_LIBRARY_DIRS ${MATLAB_ROOT_DIR}/bin/${MATLAB_ARCH})
+
+  # get the libraries
+  find_library(MATLAB_LIB_MX  mx  PATHS ${MATLAB_LIBRARY_DIRS} NO_DEFAULT_PATH)
+  find_library(MATLAB_LIB_MEX mex PATHS ${MATLAB_LIBRARY_DIRS} NO_DEFAULT_PATH)
+  find_library(MATLAB_LIB_MAT mat PATHS ${MATLAB_LIBRARY_DIRS} NO_DEFAULT_PATH)
+  set(MATLAB_LIBS ${MATLAB_LIB_MX} ${MATLAB_LIB_MEX} ${MATLAB_LIB_MAT})
+
+  # get the include path
+  find_path(MATLAB_INCLUDE_DIRS mex.h ${MATLAB_ROOT_DIR}/extern/include) 
+
+  # get the mex shell script
+  find_file(MATLAB_MEX_SCRIPT NAMES mex mex.bat PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH)
+  
   # verify that everything has been found successfully
   if (MATLAB_LIB_MX AND MATLAB_LIB_MEX AND MATLAB_LIB_MAT AND MATLAB_INCLUDE_DIRS AND MATLAB_MEX_SCRIPT)
     set(MATLAB_FOUND TRUE)