# ============================================================================
# Copyright (c) 2011-2012 University of Pennsylvania
# Copyright (c) 2013-2014 Andreas Schuh
# All rights reserved.
#
# See COPYING file for license information or visit
# http://opensource.andreasschuh.com/cmake-basis/download.html#license
# ============================================================================
##############################################################################
# @file FindMATLAB.cmake
# @brief Find MATLAB installation.
#
# @par Input variables:
#
#
# @tp @b MATLAB_DIR @endtp
# The installation directory of MATLAB.
# Can also be set as environment variable. |
#
#
# @tp @b MATLABDIR @endtp
# Alternative environment variable for @p MATLAB_DIR. |
#
#
# @tp @b MATLAB_FIND_COMPONENTS @endtp
# The @c COMPONENTS argument(s) of the find_package() command can
# be used to only look for specific MATLAB executables and libraries.
# Valid component values are "matlab", "mcc", "mexext", "mex",
# "libmex", "mx" or "libmx", "eng" or "libeng",
# "libmwmclmcr" or "mwmclmcr", and "libmwmclmcrrt" or "mwmclmcrrt". |
#
#
# @tp @b MATLAB_FIND_OPTIONAL_COMPONENTS @endtp
# The @c OPTIONAL_COMPONENTS argument(s) of the find_package() command.
# See @c MATLAB_FIND_COMPONENTS. |
#
#
# @tp @b MATLAB_PATH_SUFFIXES @endtp
# Path suffixes which are used to find the proper MATLAB libraries.
# By default, this find module tries to determine the path suffix
# from the CMake variables which describe the system. For example,
# on 64-bit Unix-based systems, the libraries are searched in
# @p MATLAB_DIR/bin/glnxa64. Set this variable before the
# find_package() command if this find module fails to
# determine the correct location of the MATLAB libraries within
# the root directory. |
#
#
#
# @par Output variables:
#
#
# @tp @b MATLAB_FOUND @endtp
# Whether the package was found and the following CMake
# variables are valid. |
#
#
# @tp @b MATLAB_EXECUTABLE @endtp
# The absolute path of the found matlab executable. |
#
#
# @tp @b MATLAB_VERSION_STRING @endtp
# Version of the found matlab executable (e.g., 7.14.0). |
#
#
# @tp @b MATLAB_VERSION_MAJOR @endtp
# Major version of the found matlab executable (e.g., 7). |
#
#
# @tp @b MATLAB_VERSION_MINOR @endtp
# Minor version of the found matlab executable (e.g., 14). |
#
#
# @tp @b MATLAB_VERSION_PATCH @endtp
# Patch of the found matlab executable (e.g., 0). |
#
#
# @tp @b MATLAB_RELEASE @endtp
# Release version of the found matlab executable (e.g., R2012a). |
#
#
# @tp @b MATLAB_MCC_EXECUTABLE @endtp
# The absolute path of the found MATLAB Compiler (mcc) executable. |
#
#
# @tp @b MATLAB_MEX_EXECUTABLE @endtp
# The absolute path of the found MEX script (mex) executable. |
#
#
# @tp @b MATLAB_MEXEXT_EXECUTABLE @endtp
# The absolute path of the found mexext script executable. |
#
#
# @tp @b MATLAB_INCLUDE_DIR @endtp
# Package include directories. |
#
#
# @tp @b MATLAB_INCLUDES @endtp
# Include directories including prerequisite libraries. |
#
#
# @tp @b MATLAB_LIBRARY_DIR @endtp
# Directory containing the MATLAB libraries. |
#
#
# @tp @b MATLAB_mex_LIBRARY @endtp
# The MEX library of MATLAB. |
#
#
# @tp @b MATLAB_mx_LIBRARY @endtp
# The @c mx library of MATLAB. |
#
#
# @tp @b MATLAB_eng_LIBRARY @endtp
# The MATLAB engine library. |
#
#
# @tp @b MATLAB_mwmclmcr_LIBRARY @endtp
# The MATLAB Compiler library. |
#
#
# @tp @b MATLAB_mwmclmcrrt_LIBRARY @endtp
# The MATLAB Compiler runtime library. |
#
#
# @tp @b MATLAB_LIBRARY @endtp
# All MATLAB libraries excluding @c mwmclmcrrt. |
#
#
# @tp @b MATLAB_LIBRARIES @endtp
# Package libraries and prerequisite libraries. |
#
#
#
# @ingroup CMakeFindModules
##############################################################################
# ----------------------------------------------------------------------------
# initialize search
if (NOT MATLAB_DIR)
if (NOT $ENV{MATLABDIR} STREQUAL "")
set (MATLAB_DIR "$ENV{MATLABDIR}" CACHE PATH "Installation prefix for MATLAB." FORCE)
else ()
set (MATLAB_DIR "$ENV{MATLAB_DIR}" CACHE PATH "Installation prefix for MATLAB." FORCE)
endif ()
endif ()
if (NOT MATLAB_PATH_SUFFIXES)
if (WIN32)
if (CMAKE_GENERATOR MATCHES "Visual Studio 6")
set (MATLAB_PATH_SUFFIXES "extern/lib/win32/microsoft/msvc60")
elseif (CMAKE_GENERATOR MATCHES "Visual Studio 7")
# assume people are generally using 7.1,
# if using 7.0 need to link to: extern/lib/win32/microsoft/msvc70
set (MATLAB_PATH_SUFFIXES "extern/lib/win32/microsoft/msvc71")
elseif (CMAKE_GENERATOR MATCHES "Visual Studio 8")
set (MATLAB_PATH_SUFFIXES "extern/lib/win32/microsoft/msvc80")
elseif (CMAKE_GENERATOR MATCHES "Visual Studio 9")
set (MATLAB_PATH_SUFFIXES "extern/lib/win32/microsoft/msvc90")
elseif (CMAKE_GENERATOR MATCHES "Borland")
# assume people are generally using 5.4
# if using 5.0 need to link to: ../extern/lib/win32/microsoft/bcc50
# if using 5.1 need to link to: ../extern/lib/win32/microsoft/bcc51
set (MATLAB_PATH_SUFFIXES "extern/lib/win32/microsoft/bcc54")
endif ()
elseif (APPLE)
if (CMAKE_SIZE_OF_VOID_P EQUAL 4)
set (MATLAB_PATH_SUFFIXES "bin/maci" "runtime/maci")
else ()
set (MATLAB_PATH_SUFFIXES "bin/maci64" "runtime/maci64")
endif ()
else ()
if (CMAKE_SIZE_OF_VOID_P EQUAL 4)
set (MATLAB_PATH_SUFFIXES "bin/glnx86" "runtime/glnx86")
else ()
set (MATLAB_PATH_SUFFIXES "bin/glnxa64" "runtime/glnxa64")
endif ()
endif ()
endif ()
set (_MATLAB_EXECUTABLE_NAMES)
set (_MATLAB_LIBRARY_NAMES)
set (_MATLAB_OPTIONAL_EXECUTABLE_NAMES)
set (_MATLAB_OPTIONAL_LIBRARY_NAMES)
if (MATLAB_FIND_COMPONENTS OR MATLAB_FIND_OPTIONAL_COMPONENTS)
foreach (_MATLAB_COMPONENT IN LISTS MATLAB_FIND_COMPONENTS)
string (TOLOWER "${_MATLAB_COMPONENT}" _MATLAB_COMPONENT)
if (_MATLAB_COMPONENT MATCHES "^(matlab|mcc|mexext|mex)$")
list (APPEND _MATLAB_EXECUTABLE_NAMES ${_MATLAB_COMPONENT})
elseif (_MATLAB_COMPONENT MATCHES "^(lib)?(mex|mx|eng|mwmclmcr|mwmclmcrrt)$")
list (APPEND _MATLAB_LIBRARY_NAMES ${CMAKE_MATCH_2})
else ()
message (FATAL_ERROR "Unknown MATLAB component: ${_MATLAB_COMPONENT}")
endif ()
endforeach ()
foreach (_MATLAB_COMPONENT IN LISTS MATLAB_FIND_OPTIONAL_COMPONENTS)
string (TOLOWER "${_MATLAB_COMPONENT}" _MATLAB_COMPONENT)
if (_MATLAB_COMPONENT MATCHES "^(matlab|mcc|mexext|mex)$")
list (APPEND _MATLAB_OPTIONAL_EXECUTABLE_NAMES ${_MATLAB_COMPONENT})
elseif (_MATLAB_COMPONENT MATCHES "^(lib)?(mex|mx|eng|mwmclmcrrt)$")
list (APPEND _MATLAB_OPTIONAL_LIBRARY_NAMES ${CMAKE_MATCH_2})
else ()
message (FATAL_ERROR "Unknown MATLAB component: ${_MATLAB_COMPONENT}")
endif ()
endforeach ()
else ()
set (_MATLAB_EXECUTABLE_NAMES matlab)
set (_MATLAB_OPTIONAL_EXECUTABLE_NAMES mcc mex mexext)
set (_MATLAB_LIBRARY_NAMES mwmclmcrrt)
set (_MATLAB_OPTIONAL_LIBRARY_NAMES mex mx eng)
endif ()
# ----------------------------------------------------------------------------
# find MATLAB executables
if (_MATLAB_EXECUTABLE_NAMES OR _MATLAB_OPTIONAL_EXECUTABLE_NAMES)
if (MATLAB_DIR)
foreach (_MATLAB_EXE IN LISTS _MATLAB_EXECUTABLE_NAMES _MATLAB_OPTIONAL_EXECUTABLE_NAMES)
if (_MATLAB_EXE MATCHES "matlab")
find_program (
MATLAB_EXECUTABLE
NAMES matlab
HINTS "${MATLAB_DIR}/bin"
DOC "The MATLAB application (matlab)."
)
mark_as_advanced (MATLAB_EXECUTABLE)
else ()
string (TOUPPER "${_MATLAB_EXE}" _MATLAB_EXE_U)
if (WIN32 AND _MATLAB_EXE MATCHES "mex")
list (APPEND _MATLAB_EXE "${_MATLAB_EXE}.bat")
endif ()
find_program (
MATLAB_${_MATLAB_EXE_U}_EXECUTABLE
NAMES ${_MATLAB_EXE}
HINTS "${MATLAB_DIR}/bin"
DOC "The MATLAB application ${_MATLAB_EXE}."
)
mark_as_advanced (MATLAB_${_MATLAB_EXE_U}_EXECUTABLE)
endif ()
endforeach ()
else ()
foreach (_MATLAB_EXE IN LISTS _MATLAB_EXECUTABLE_NAMES _MATLAB_OPTIONAL_EXECUTABLE_NAMES)
if (_MATLAB_EXE MATCHES "matlab")
find_program (
MATLAB_EXECUTABLE
NAMES matlab
DOC "The MATLAB application (matlab)."
)
mark_as_advanced (MATLAB_EXECUTABLE)
else ()
string (TOUPPER "${_MATLAB_EXE}" _MATLAB_EXE_U)
find_program (
MATLAB_${_MATLAB_EXE_U}_EXECUTABLE
NAMES "${_MATLAB_EXE}"
DOC "The MATLAB application ${_MATLAB_EXE}."
)
mark_as_advanced (MATLAB_${_MATLAB_EXE_U}_EXECUTABLE)
endif ()
endforeach ()
endif ()
endif ()
# ----------------------------------------------------------------------------
# set MATLAB_DIR
if (NOT MATLAB_DIR AND MATLAB_EXECUTABLE)
string (REGEX REPLACE "/bin(/[a-z0-9]+)?/(matlab|MATLAB)(\\.exe|\\.EXE)?$|/[^/]+\\.app/.*$" "" _MATLAB_PREFIX "${MATLAB_EXECUTABLE}")
if (APPLE)
string (REGEX REPLACE "^(.+\\.app)/.*$" "\\1" _MATLAB_PREFIX "${MATLAB_EXECUTABLE}")
endif ()
set (MATLAB_DIR "${_MATLAB_PREFIX}" CACHE PATH "Installation prefix for MATLAB." FORCE)
endif ()
# ----------------------------------------------------------------------------
# determine MATLAB version
if (COMMAND basis_get_matlab_version)
basis_get_matlab_version ()
endif ()
# ----------------------------------------------------------------------------
# find paths/files
if (_MATLAB_LIBRARY_NAMES OR _MATLAB_OPTIONAL_LIBRARY_NAMES)
if (MATLAB_DIR)
find_path (
MATLAB_INCLUDE_DIR
NAMES mex.h
HINTS "${MATLAB_DIR}/extern/include"
DOC "Include directory for MATLAB libraries."
NO_DEFAULT_PATH
)
foreach (_MATLAB_LIB IN LISTS _MATLAB_LIBRARY_NAMES _MATLAB_OPTIONAL_LIBRARY_NAMES)
find_library (
MATLAB_${_MATLAB_LIB}_LIBRARY
NAMES "${_MATLAB_LIB}" "lib${_MATLAB_LIB}"
HINTS "${MATLAB_DIR}"
PATH_SUFFIXES ${MATLAB_PATH_SUFFIXES}
DOC "MATLAB ${_MATLAB_LIB} link library."
NO_DEFAULT_PATH
)
endforeach ()
else ()
find_path (
MATLAB_INCLUDE_DIR
NAMES mex.h
HINTS ENV C_INCLUDE_PATH ENV CXX_INCLUDE_PATH
DOC "Include directory for MATLAB libraries."
)
foreach (_MATLAB_LIB IN LISTS _MATLAB_LIBRARY_NAMES _MATLAB_OPTIONAL_LIBRARY_NAMES)
find_library (
MATLAB_${_MATLAB_LIB}_LIBRARY
NAMES "${_MATLAB_LIB}"
HINTS ENV LD_LIBRARY_PATH
DOC "MATLAB ${_MATLAB_LIB} link library."
)
endforeach ()
endif ()
# mark variables as advanced
mark_as_advanced (MATLAB_INCLUDE_DIR)
foreach (_MATLAB_LIB IN LISTS _MATLAB_LIBRARY_NAMES _MATLAB_OPTIONAL_LIBRARY_NAMES)
mark_as_advanced (MATLAB_${_MATLAB_LIB}_LIBRARY)
endforeach ()
# list of all libraries
set (MATLAB_LIBRARY)
foreach (_MATLAB_LIB IN LISTS _MATLAB_LIBRARY_NAMES _MATLAB_OPTIONAL_LIBRARY_NAMES)
if (MATLAB_${_MATLAB_LIB}_LIBRARY)
list (APPEND MATLAB_LIBRARY "${MATLAB_${_MATLAB_LIB}_LIBRARY}")
endif ()
endforeach ()
# prerequisite libraries
set (MATLAB_INCLUDES "${MATLAB_INCLUDE_DIR}")
set (MATLAB_LIBRARIES "${MATLAB_LIBRARY}")
# aliases / backwards compatibility
set (MATLAB_INCLUDE_DIRS "${MATLAB_INCLUDES}")
endif ()
# ----------------------------------------------------------------------------
# set MATLAB_DIR
if (NOT MATLAB_DIR AND MATLAB_INCLUDE_DIR)
string (REGEX REPLACE "/extern/include/?" "" _MATLAB_PREFIX "${MATLAB_INCLUDE_DIR}")
set (MATLAB_DIR "${_MATLAB_PREFIX}" CACHE PATH "Installation prefix for MATLAB." FORCE)
endif ()
# ----------------------------------------------------------------------------
# set MATLAB_LIBRARY_DIR
set (MATLAB_LIBRARY_DIR)
foreach (_MATLAB_LIB IN LISTS MATLAB_LIBRARY)
get_filename_component (MATLAB_LIBRARY_DIR "${_MATLAB_LIB}" PATH)
if (MATLAB_LIBRARY_DIR)
break ()
endif ()
endforeach ()
# ----------------------------------------------------------------------------
# handle the QUIETLY and REQUIRED arguments and set *_FOUND to TRUE
# if all listed variables are found or TRUE
include (FindPackageHandleStandardArgs)
set (_MATLAB_REQUIRED_VARS)
foreach (_MATLAB_EXE IN LISTS _MATLAB_EXECUTABLE_NAMES)
if (_MATLAB_EXE MATCHES "matlab")
list (APPEND _MATLAB_REQUIRED_VARS MATLAB_EXECUTABLE)
else ()
string (TOUPPER "${_MATLAB_EXE}" _MATLAB_EXECUTABLE)
list (APPEND _MATLAB_REQUIRED_VARS MATLAB_${_MATLAB_EXECUTABLE}_EXECUTABLE)
endif ()
endforeach ()
if (_MATLAB_LIBRARY_NAMES)
list (APPEND _MATLAB_REQUIRED_VARS MATLAB_INCLUDE_DIR)
foreach (_MATLAB_LIB IN LISTS _MATLAB_LIBRARY_NAMES)
list (APPEND _MATLAB_REQUIRED_VARS MATLAB_${_MATLAB_LIB}_LIBRARY)
endforeach ()
endif ()
if (_MATLAB_REQUIRED_VARS)
find_package_handle_standard_args (
MATLAB
# MESSAGE
DEFAULT_MSG
# VARIABLES
MATLAB_DIR # for status message "Found MATLAB: ..."
${_MATLAB_REQUIRED_VARS}
)
else ()
set (MATLAB_FOUND TRUE)
endif ()
# ----------------------------------------------------------------------------
# unset private variables
unset (_MATLAB_REQUIRED_VARS)
unset (_MATLAB_EXECUTABLE_NAMES)
unset (_MATLAB_LIBRARY_NAMES)
unset (_MATLAB_PREFIX)
unset (_MATLAB_LIB)
unset (_MATLAB_EXE)