111 lines
4.7 KiB
Plaintext
111 lines
4.7 KiB
Plaintext
# This file figures out where MATLAB is and then defines a macro, add_mex_function(name)
|
|
# which when called instructs CMake to build a mex file from a file called name.cpp. Note
|
|
# that additional library dependencies can be added like this: add_mex_function(name lib1 dlib libetc).
|
|
# That is, just add more libraries after the name and they will be build into the mex file.
|
|
|
|
cmake_minimum_required(VERSION 2.8.12)
|
|
|
|
set(BUILDING_MATLAB_MEX_FILE true)
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE True)
|
|
|
|
# Trying to use cuda with matlab hasn't worked well, so just disable it.
|
|
SET(DLIB_USE_CUDA OFF CACHE BOOL "" FORCE)
|
|
|
|
# Find MATLAB's include directory and needed libraries
|
|
find_program(MATLAB_EXECUTABLE matlab PATHS
|
|
"C:/Program Files/MATLAB/*/bin"
|
|
"C:/Program Files (x86)/MATLAB/*/bin"
|
|
)
|
|
# Resolve symbolic links to try and get the real path to the MATLAB executable
|
|
get_filename_component(MATLAB_EXECUTABLE ${MATLAB_EXECUTABLE} REALPATH)
|
|
# Now get MATLAB root directory
|
|
get_filename_component(MATLAB_HOME ${MATLAB_EXECUTABLE} PATH)
|
|
get_filename_component(MATLAB_HOME ${MATLAB_HOME} PATH)
|
|
set(MATLAB_LIB_FOLDERS
|
|
"${MATLAB_HOME}/extern/lib/win64/microsoft"
|
|
"${MATLAB_HOME}/bin/glnxa64"
|
|
)
|
|
# If there is a MATLAB_HOME environment variable then look there as well.
|
|
if (DEFINED ENV{MATLAB_HOME})
|
|
set(MATLAB_LIB_FOLDERS
|
|
"$ENV{MATLAB_HOME}/extern/lib/win64/microsoft"
|
|
"$ENV{MATLAB_HOME}/bin/glnxa64"
|
|
${MATLAB_LIB_FOLDERS}
|
|
)
|
|
endif()
|
|
# Find the MATLAB libraries that need to get linked into the mex file
|
|
if (WIN32)
|
|
find_library(MATLAB_MEX_LIBRARY libmex PATHS ${MATLAB_LIB_FOLDERS} )
|
|
find_library(MATLAB_MX_LIBRARY libmx PATHS ${MATLAB_LIB_FOLDERS} )
|
|
find_library(MATLAB_ENG_LIBRARY libeng PATHS ${MATLAB_LIB_FOLDERS} )
|
|
else()
|
|
find_library(MATLAB_MEX_LIBRARY mex PATHS ${MATLAB_LIB_FOLDERS} )
|
|
find_library(MATLAB_MX_LIBRARY mx PATHS ${MATLAB_LIB_FOLDERS} )
|
|
find_library(MATLAB_ENG_LIBRARY eng PATHS ${MATLAB_LIB_FOLDERS} )
|
|
endif()
|
|
set(MATLAB_LIBRARIES ${MATLAB_MEX_LIBRARY} ${MATLAB_MX_LIBRARY} ${MATLAB_ENG_LIBRARY})
|
|
# Figure out the path to MATLAB's mex.h so we can add it to the include search path.
|
|
find_path(mex_header_path mex.h
|
|
PATHS "$ENV{MATLAB_HOME}/extern/include"
|
|
"${MATLAB_HOME}/extern/include"
|
|
)
|
|
INCLUDE_DIRECTORIES(${mex_header_path})
|
|
|
|
# Determine the path to cmake_mex_wrapper file so we can add it to the include search path..
|
|
string(REGEX REPLACE "cmake_mex_wrapper$" "" dlib_matlab_binding_path ${CMAKE_CURRENT_LIST_FILE})
|
|
INCLUDE_DIRECTORIES("${dlib_matlab_binding_path}")
|
|
# Also add dlib to the include search path
|
|
INCLUDE_DIRECTORIES(${dlib_matlab_binding_path}/../..)
|
|
|
|
add_definitions(-DMATLAB_MEX_FILE)
|
|
|
|
# Determine the path to our CMakeLists.txt file. This is the file that
|
|
# includeded the one you are reading right now. So here we make it so that
|
|
# when you run the install target it will copy the compiled mex files into the
|
|
# same folder as the parent CMakeLists.txt file.
|
|
string(REGEX REPLACE "CMakeLists.txt$" "" install_dir ${CMAKE_PARENT_LIST_FILE})
|
|
set(CMAKE_INSTALL_PREFIX "${install_dir}")
|
|
set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION "${install_dir}")
|
|
INCLUDE(InstallRequiredSystemLibraries)
|
|
|
|
|
|
MACRO(add_mex_function name )
|
|
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.C")
|
|
ADD_LIBRARY(${name} MODULE ${name}.C)
|
|
elseif(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${name}.c")
|
|
ADD_LIBRARY(${name} MODULE ${name}.c)
|
|
else()
|
|
ADD_LIBRARY(${name} MODULE ${name}.cpp )
|
|
endif()
|
|
|
|
target_compile_definitions(${name} PRIVATE -DMEX_FILENAME=${name})
|
|
if (UNIX)
|
|
# Doing this prevents our mex function from exporting any symbols
|
|
# other than mexFunction(). This sometimes doesn't matter but sometimes
|
|
# avoids causing errors or otherwise bad behavior in MATLAB.
|
|
if (DEFINED ENV{MATLAB_HOME})
|
|
set_target_properties(${name} PROPERTIES LINK_FLAGS "-Wl,--version-script,$ENV{MATLAB_HOME}/extern/lib/glnxa64/mexFunction.map")
|
|
else()
|
|
set_target_properties(${name} PROPERTIES LINK_FLAGS "-Wl,--version-script,${MATLAB_HOME}/extern/lib/glnxa64/mexFunction.map")
|
|
endif()
|
|
endif()
|
|
|
|
# Change the output file extension to a mex extension.
|
|
if (WIN32)
|
|
set_target_properties(${name} PROPERTIES SUFFIX ".mexw64")
|
|
elseif(APPLE)
|
|
set_target_properties(${name} PROPERTIES SUFFIX ".mexmaci64")
|
|
else()
|
|
set_target_properties(${name} PROPERTIES SUFFIX ".mexa64")
|
|
endif()
|
|
set_target_properties(${name} PROPERTIES PREFIX "")
|
|
TARGET_LINK_LIBRARIES(${name} ${MATLAB_LIBRARIES} ${ARGN})
|
|
if (install_target_output_folder)
|
|
install(TARGETS ${name} DESTINATION "${install_target_output_folder}")
|
|
else()
|
|
install(TARGETS ${name} DESTINATION "${install_dir}")
|
|
endif()
|
|
ENDMACRO()
|
|
|
|
|