Added Windows functionality to FindMatlab. Untested
authorHilton Bristow <hilton.bristow@gmail.com>
Tue, 12 Mar 2013 02:26:49 +0000 (12:26 +1000)
committerhbristow <hilton.bristow@gmail.com>
Mon, 17 Jun 2013 06:48:06 +0000 (16:48 +1000)
cmake/OpenCVFindMatlab.cmake

index d187423..391eae7 100644 (file)
@@ -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})
+  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 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 path to the libraries
+  set(MATLAB_LIBRARY_DIRS ${MATLAB_ROOT_DIR}/bin/${MATLAB_ARCH})
 
-    # get the include path
-    find_path(MATLAB_INCLUDE_DIRS mex.h ${MATLAB_ROOT_DIR}/extern/include) 
+  # 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 mex shell script
-    find_file(MATLAB_MEX_SCRIPT NAMES mex mex.bat PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH)
-    
-  elseif (WIN32)
-  endif()
+  # 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)