|
|
|
@ -8,15 +8,15 @@ |
|
|
|
|
# MATLAB_ROOT_DIR: Root of Matlab installation |
|
|
|
|
# MATLAB_BIN: The main Matlab "executable" (shell script) |
|
|
|
|
# MATLAB_MEX_SCRIPT: The mex script used to compile mex files |
|
|
|
|
# MATLAB_BIN: The actual Matlab executable |
|
|
|
|
# MATLAB_INCLUDE_DIR: Path to "mex.h" |
|
|
|
|
# MATLAB_LIBRARY_DIR: Path to mex and matrix libraries |
|
|
|
|
# MATLAB_LIBS: The Matlab libs, usually mx, mex, mat |
|
|
|
|
# MATLAB_INCLUDE_DIRS:Path to "mex.h" |
|
|
|
|
# MATLAB_LIBRARY_DIRS:Path to mex and matrix libraries |
|
|
|
|
# MATLAB_LIBRARIES: The Matlab libs, usually mx, mex, mat |
|
|
|
|
# MATLAB_MEXEXT: The mex library extension. It will be one of: |
|
|
|
|
# mexwin32, mexwin64, mexglx, mexa64, mexmac, |
|
|
|
|
# mexmaci, mexmaci64, mexsol, mexs64 |
|
|
|
|
# MATLAB_ARCH: The installation architecture. It is simply |
|
|
|
|
# the MEXEXT with the preceding "mex" removed |
|
|
|
|
# MATLAB_ARCH: The installation architecture. It is **usually** |
|
|
|
|
# the MEXEXT with the preceding "mex" removed, |
|
|
|
|
# though it's different for linux distros. |
|
|
|
|
# |
|
|
|
|
# There doesn't appear to be an elegant way to detect all versions of Matlab |
|
|
|
|
# across different platforms. If you know the matlab path and want to avoid |
|
|
|
@ -57,23 +57,8 @@ endfunction() |
|
|
|
|
# the absolute path in the variable MATLAB_ROOT_DIR |
|
|
|
|
function(locate_matlab_root) |
|
|
|
|
|
|
|
|
|
# --- LINUX --- |
|
|
|
|
if (UNIX AND NOT APPLE) |
|
|
|
|
# possible root locations, in order of likelihood |
|
|
|
|
set(SEARCH_DIRS_ /usr/local /opt/local /usr /opt) |
|
|
|
|
foreach (DIR_ ${SEARCH_DIRS_}) |
|
|
|
|
file(GLOB MATLAB_ROOT_DIR_ ${DIR_}/*matlab*) |
|
|
|
|
if (MATLAB_ROOT_DIR_) |
|
|
|
|
# sort in order from highest to lowest |
|
|
|
|
list(SORT MATLAB_ROOT_DIR_) |
|
|
|
|
list(REVERSE MATLAB_ROOT_DIR_) |
|
|
|
|
list(GET MATLAB_ROOT_DIR_ 0 MATLAB_ROOT_DIR_) |
|
|
|
|
break() |
|
|
|
|
endif() |
|
|
|
|
endforeach() |
|
|
|
|
|
|
|
|
|
# --- APPLE --- |
|
|
|
|
elseif (APPLE) |
|
|
|
|
# --- UNIX/APPLE --- |
|
|
|
|
if (UNIX) |
|
|
|
|
# possible root locations, in order of likelihood |
|
|
|
|
set(SEARCH_DIRS_ /Applications /usr/local /opt/local /usr /opt) |
|
|
|
|
foreach (DIR_ ${SEARCH_DIRS_}) |
|
|
|
@ -84,21 +69,25 @@ function(locate_matlab_root) |
|
|
|
|
list(SORT MATLAB_ROOT_DIR_) |
|
|
|
|
list(REVERSE MATLAB_ROOT_DIR_) |
|
|
|
|
list(GET MATLAB_ROOT_DIR_ 0 MATLAB_ROOT_DIR_) |
|
|
|
|
break() |
|
|
|
|
set(MATLAB_ROOT_DIR ${MATLAB_ROOT_DIR_} PARENT_SCOPE) |
|
|
|
|
return() |
|
|
|
|
endif() |
|
|
|
|
endforeach() |
|
|
|
|
|
|
|
|
|
# --- WINDOWS --- |
|
|
|
|
elseif (WIN32) |
|
|
|
|
# search the path to see if Matlab exists there |
|
|
|
|
# Contrary to EVERY OTHER REGEX IMPLEMENTATION ON EARTH, cmake returns |
|
|
|
|
# the entire input string if no matches for the capture group are found. |
|
|
|
|
string(REGEX REPLACE ".*[;=](.*[Mm][Aa][Tt][Ll][Aa][Bb][^;]*)\\\\bin.*" "\\1" MATLAB_ROOT_DIR_ "$ENV{PATH}") |
|
|
|
|
if ("${MATLAB_ROOT_DIR_}" STREQUAL "$ENV{PATH}") |
|
|
|
|
set(MATLAB_ROOT_DIR_) |
|
|
|
|
# 1. search the path environment variable |
|
|
|
|
find_program(MATLAB_ROOT_DIR_ matlab PATHS ENV PATH) |
|
|
|
|
if (MATLAB_ROOT_DIR_) |
|
|
|
|
# get the root directory from the full path |
|
|
|
|
# /path/to/matlab/rootdir/bin/matlab.exe |
|
|
|
|
get_filename_component(MATLAB_ROOT_DIR_ ${MATLAB_ROOT_DIR_} PATH) |
|
|
|
|
get_filename_component(MATLAB_ROOT_DIR_ ${MATLAB_ROOT_DIR_} PATH) |
|
|
|
|
set(MATLAB_ROOT_DIR ${MATLAB_ROOT_DIR_} PARENT_SCOPE) |
|
|
|
|
return() |
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
|
# registry-hacking |
|
|
|
|
# 2. search the registry |
|
|
|
|
# determine the available Matlab versions |
|
|
|
|
set(REG_EXTENSION_ "SOFTWARE\\Mathworks\\MATLAB") |
|
|
|
|
set(REG_ROOTS_ "HKEY_LOCAL_MACHINE" "HKEY_CURRENT_USER") |
|
|
|
@ -119,16 +108,12 @@ function(locate_matlab_root) |
|
|
|
|
# request the MATLABROOT from the registry |
|
|
|
|
foreach(REG_ROOT_ ${REG_ROOTS_}) |
|
|
|
|
get_filename_component(QUERY_RESPONSE_ [${REG_ROOT_}\\${REG_EXTENSION_}\\${VERSION_};MATLABROOT] ABSOLUTE) |
|
|
|
|
if ("${MATLAB_ROOT_DIR_}" STREQUAL "" AND NOT ${QUERY_RESPONSE_} MATCHES "registry$") |
|
|
|
|
set(MATLAB_ROOT_DIR_ ${QUERY_RESPONSE_}) |
|
|
|
|
if (NOT ${QUERY_RESPONSE_} MATCHES "registry$") |
|
|
|
|
set(MATLAB_ROOT_DIR ${QUERY_RESPONSE_} PARENT_SCOPE) |
|
|
|
|
return() |
|
|
|
|
endif() |
|
|
|
|
endforeach() |
|
|
|
|
endif() |
|
|
|
|
|
|
|
|
|
# export the root into the parent scope |
|
|
|
|
if (MATLAB_ROOT_DIR_) |
|
|
|
|
set(MATLAB_ROOT_DIR ${MATLAB_ROOT_DIR_} PARENT_SCOPE) |
|
|
|
|
endif() |
|
|
|
|
endfunction() |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -140,11 +125,7 @@ endfunction() |
|
|
|
|
# sets the variable MATLAB_FOUND to TRUE |
|
|
|
|
function(locate_matlab_components MATLAB_ROOT_DIR) |
|
|
|
|
# get the mex extension |
|
|
|
|
if (UNIX) |
|
|
|
|
execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext OUTPUT_VARIABLE MATLAB_MEXEXT_) |
|
|
|
|
elseif (WIN32) |
|
|
|
|
execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext.bat OUTPUT_VARIABLE MATLAB_MEXEXT_) |
|
|
|
|
endif() |
|
|
|
|
execute_process(COMMAND ${MATLAB_ROOT_DIR}/bin/mexext OUTPUT_VARIABLE MATLAB_MEXEXT_) |
|
|
|
|
if (NOT MATLAB_MEXEXT_) |
|
|
|
|
return() |
|
|
|
|
endif() |
|
|
|
@ -160,35 +141,34 @@ function(locate_matlab_components MATLAB_ROOT_DIR) |
|
|
|
|
endforeach() |
|
|
|
|
|
|
|
|
|
# get the path to the libraries |
|
|
|
|
set(MATLAB_LIBRARY_DIR_ ${MATLAB_ROOT_DIR}/bin/${MATLAB_ARCH_}) |
|
|
|
|
set(MATLAB_LIBRARY_DIRS_ ${MATLAB_ROOT_DIR}/bin/${MATLAB_ARCH_}) |
|
|
|
|
|
|
|
|
|
# get the libraries |
|
|
|
|
set_libarch_prefix_suffix() |
|
|
|
|
find_library(MATLAB_LIB_MX_ mx PATHS ${MATLAB_LIBRARY_DIR_} NO_DEFAULT_PATH) |
|
|
|
|
find_library(MATLAB_LIB_MEX_ mex PATHS ${MATLAB_LIBRARY_DIR_} NO_DEFAULT_PATH) |
|
|
|
|
find_library(MATLAB_LIB_MAT_ mat PATHS ${MATLAB_LIBRARY_DIR_} NO_DEFAULT_PATH) |
|
|
|
|
set(MATLAB_LIBS_ ${MATLAB_LIB_MX_} ${MATLAB_LIB_MEX_} ${MATLAB_LIB_MAT_}) |
|
|
|
|
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_LIBRARIES_ ${MATLAB_LIB_MX_} ${MATLAB_LIB_MEX_} ${MATLAB_LIB_MAT_}) |
|
|
|
|
|
|
|
|
|
# get the include path |
|
|
|
|
find_path(MATLAB_INCLUDE_DIR_ mex.h ${MATLAB_ROOT_DIR}/extern/include) |
|
|
|
|
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) |
|
|
|
|
find_program(MATLAB_MEX_SCRIPT_ NAMES mex PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH) |
|
|
|
|
|
|
|
|
|
# get the Matlab executable |
|
|
|
|
find_file(MATLAB_BIN_ NAMES matlab matlab.exe PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH) |
|
|
|
|
find_program(MATLAB_BIN_ NAMES matlab PATHS ${MATLAB_ROOT_DIR}/bin NO_DEFAULT_PATH) |
|
|
|
|
|
|
|
|
|
# export into parent scope |
|
|
|
|
if (MATLAB_MEX_SCRIPT_ AND MATLAB_LIBS_ AND MATLAB_INCLUDE_DIR_) |
|
|
|
|
set(MATLAB_BIN ${MATLAB_BIN_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_MEX_SCRIPT ${MATLAB_MEX_SCRIPT_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_INCLUDE_DIR ${MATLAB_INCLUDE_DIR_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_LIBS ${MATLAB_LIBS_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_LIBRARY_DIR ${MATLAB_LIBRARY_DIR_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_MEXEXT ${MATLAB_MEXEXT_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_ARCH ${MATLAB_ARCH_} PARENT_SCOPE) |
|
|
|
|
if (MATLAB_MEX_SCRIPT_ AND MATLAB_LIBRARIES_ AND MATLAB_INCLUDE_DIRS_) |
|
|
|
|
set(MATLAB_BIN ${MATLAB_BIN_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_MEX_SCRIPT ${MATLAB_MEX_SCRIPT_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_INCLUDE_DIRS ${MATLAB_INCLUDE_DIRS_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_LIBRARIES ${MATLAB_LIBRARIES_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_LIBRARY_DIRS ${MATLAB_LIBRARY_DIRS_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_MEXEXT ${MATLAB_MEXEXT_} PARENT_SCOPE) |
|
|
|
|
set(MATLAB_ARCH ${MATLAB_ARCH_} PARENT_SCOPE) |
|
|
|
|
endif() |
|
|
|
|
return() |
|
|
|
|
endfunction() |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -198,9 +178,6 @@ endfunction() |
|
|
|
|
# ---------------------------------------------------------------------------- |
|
|
|
|
if (NOT MATLAB_FOUND) |
|
|
|
|
|
|
|
|
|
# guilty until proven innocent |
|
|
|
|
set(MATLAB_FOUND FALSE) |
|
|
|
|
|
|
|
|
|
# attempt to find the Matlab root folder |
|
|
|
|
if (NOT MATLAB_ROOT_DIR) |
|
|
|
|
locate_matlab_root() |
|
|
|
@ -210,7 +187,9 @@ if (NOT MATLAB_FOUND) |
|
|
|
|
if (MATLAB_ROOT_DIR) |
|
|
|
|
locate_matlab_components(${MATLAB_ROOT_DIR}) |
|
|
|
|
endif() |
|
|
|
|
find_package_handle_standard_args(Matlab DEFAULT_MSG MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIR |
|
|
|
|
MATLAB_ROOT_DIR MATLAB_LIBS MATLAB_LIBRARY_DIR |
|
|
|
|
MATLAB_MEXEXT MATLAB_ARCH MATLAB_BIN) |
|
|
|
|
find_package_handle_standard_args(Matlab DEFAULT_MSG |
|
|
|
|
MATLAB_MEX_SCRIPT MATLAB_INCLUDE_DIRS |
|
|
|
|
MATLAB_ROOT_DIR MATLAB_LIBRARIES |
|
|
|
|
MATLAB_LIBRARY_DIRS MATLAB_MEXEXT |
|
|
|
|
MATLAB_ARCH MATLAB_BIN) |
|
|
|
|
endif() |
|
|
|
|