117 lines
4.3 KiB
CMake
Raw Permalink Normal View History

2021-10-14 13:47:35 +02:00
# ---------------------------------
# Finds Matlab toolkit
# ---------------------------------
GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMatlab)
# Clear cached variables, otherwise repeated builds lead to trouble
SET(Matlab_EXECUTABLE "Matlab_EXECUTABLE-NOTFOUND")
SET(Matlab_INCLUDE "Matlab_INCLUDE-NOTFOUND")
SET(Matlab_ROOT "Matlab_ROOT-NOTFOUND")
# See if we can locate the matlab executable
IF (WIN32)
# Unfortunately there doesn't seem to be a neat way to discover both 32 and 64bit matlabs
IF("${CMAKE_SIZEOF_VOID_P}" EQUAL "8")
SET(MATLAB_PATHS "C:/Program Files/MATLAB/r2015b/bin")
ELSEIF("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
SET(MATLAB_PATHS "C:/Program Files (x86)/MATLAB/r2013b/bin")
ELSE()
SET(MATLAB_PATHS "")
ENDIF()
# Ignore path on the first call, if that fails, try defaults
FIND_PROGRAM(Matlab_EXECUTABLE MATLAB PATHS ${MATLAB_PATHS} NO_DEFAULT_PATH)
FIND_PROGRAM(Matlab_EXECUTABLE MATLAB)
ENDIF(WIN32)
IF (UNIX)
FIND_PROGRAM(Matlab_EXECUTABLE matlab)
IF(NOT Matlab_EXECUTABLE)
# Alternative way to try to find matlab
FILE(GLOB_RECURSE Executable_Candidates1 "/usr/local/matlab*/matlab")
FILE(GLOB_RECURSE Executable_Candidates2 "/usr/local/MATLAB*/matlab")
SET(Executable_Candidates ${Executable_Candidates1} ${Executable_Candidates2})
IF(Executable_Candidates)
LIST(GET Executable_Candidates 0 Matlab_EXECUTABLE)
ENDIF()
ENDIF()
ENDIF(UNIX)
# Figure out the paths to libs and includes
IF(Matlab_EXECUTABLE)
# OV_PRINT(OV_PRINTED "Have Matlab_EXECUTABLE ${Matlab_EXECUTABLE}")
# Try relative to the executable path
GET_FILENAME_COMPONENT(Matlab_ROOT ${Matlab_EXECUTABLE} PATH)
IF(Matlab_ROOT)
# OV_PRINT(OV_PRINTED "Have Matlab_ROOT ${Matlab_ROOT}")
SET(Matlab_ROOT ${Matlab_ROOT}/../)
# OV_PRINT(OV_PRINTED " -> ${Matlab_ROOT}")
FIND_PATH(Matlab_INCLUDE "mex.h" PATHS ${Matlab_ROOT}/extern/include ${Matlab_ROOT}/extern/include/extern)
ENDIF()
# matlab executable path might have been pointing to a symbolic link elsewhere, try something else
IF((NOT Matlab_INCLUDE) AND UNIX)
EXECUTE_PROCESS(COMMAND matlab -e COMMAND grep "^MATLAB=" COMMAND sed "s/^MATLAB=//g" COMMAND tr "\n" "/"
OUTPUT_VARIABLE Matlab_ROOT)
FIND_PATH(Matlab_INCLUDE "mex.h" PATHS ${Matlab_ROOT}/extern/include ${Matlab_ROOT}/extern/include/extern)
ENDIF()
IF(Matlab_INCLUDE)
# OV_PRINT(OV_PRINTED "Have Matlab_INCLUDE ${Matlab_INCLUDE}")
IF(UNIX)
SET(Matlab_LIBRARIES mex mx eng)
IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/bin/glnx86)
ELSE()
SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/bin/glnxa64)
ENDIF()
ENDIF(UNIX)
IF(WIN32)
SET(Matlab_LIBRARIES libmex libmx libeng) #mclmcrrt
IF(CMAKE_SIZEOF_VOID_P EQUAL 4)
SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/extern/lib/win32/microsoft)
ELSE()
SET(Matlab_LIB_DIRECTORIES ${Matlab_ROOT}/extern/lib/win64/microsoft)
ENDIF()
# for delayed importation on windows
TARGET_LINK_LIBRARIES(${PROJECT_NAME} Delayimp )
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:libeng.dll /DELAYLOAD:libmx.dll")
# /DELAYLOAD:libmex.dll /DELAYLOAD:mclmcrrt.dll --> useless, no import
ENDIF(WIN32)
SET(Matlab_FOUND TRUE)
ENDIF()
ENDIF(Matlab_EXECUTABLE)
IF(Matlab_FOUND)
OV_PRINT(OV_PRINTED " Found Matlab in [${Matlab_ROOT}]")
SET(Matlab_LIB_FOUND TRUE)
INCLUDE_DIRECTORIES(${Matlab_INCLUDE})
FOREACH(Matlab_LIB ${Matlab_LIBRARIES})
SET(Matlab_LIB1 "Matlab_LIB1-NOTFOUND")
FIND_LIBRARY(Matlab_LIB1 NAMES ${Matlab_LIB} PATHS ${Matlab_LIB_DIRECTORIES} NO_DEFAULT_PATH)
FIND_LIBRARY(Matlab_LIB1 NAMES ${Matlab_LIB})
IF(Matlab_LIB1)
OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${Matlab_LIB1}")
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Matlab_LIB1})
ELSE(Matlab_LIB1)
OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${Matlab_LIB}")
SET(Matlab_LIB_FOUND FALSE)
ENDIF(Matlab_LIB1)
ENDFOREACH(Matlab_LIB)
IF(Matlab_LIB_FOUND)
ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMatlab)
ELSE(Matlab_LIB_FOUND)
OV_PRINT(OV_PRINTED " FAILED to find Matlab Libs, the plugins won't be built. You need a valid MATLAB installation, bitness matching platform target ${PLATFORM_TARGET}.")
ENDIF(Matlab_LIB_FOUND)
ELSE()
OV_PRINT(OV_PRINTED " FAILED to find Matlab (optional) ...")
ENDIF()
SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMatlab "Yes")