find_package(Matlab) doesn't work with the MCR
There's this thing called the Matlab Compiler Runtime (MCR - https://www.mathworks.com/products/compiler/mcr.html). It's freely downloadable and includes the Matlab headers and libraries so that one can build Matlab mex-files, without having to have the "full" Matlab program (and a license for it).
find_package(Matlab) seems to work only with a "full" Matlab installation and not with the MCR, even though the MCR is completely sufficient to for example build mex files.
If you have this in a CMakeLists.txt:
find_package(Matlab COMPONENTS MX_LIBRARY REQUIRED)
And you do
cmake -G "Visual Studio 14 Win64" ..\myproj_source -DMatlab_ROOT_DIR=C:\MCR_2016b\v91, it gives an error:
CMake Error at C:/Program Files/CMake/share/cmake-3.7/Modules/FindMatlab.cmake:575 (string): string sub-command STRIP requires two arguments. Call Stack (most recent call first): C:/Program Files/CMake/share/cmake-3.7/Modules/FindMatlab.cmake:1353 (matlab_get_mex_suffix) matlab/CMakeLists.txt:5 (find_package) CMake Error at C:/Program Files/CMake/share/cmake-3.7/Modules/FindPackageHandleStandardArgs.cmake:138 (message): Could NOT find Matlab (missing: Matlab_MEX_EXTENSION) Call Stack (most recent call first): C:/Program Files/CMake/share/cmake-3.7/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE) C:/Program Files/CMake/share/cmake-3.7/Modules/FindMatlab.cmake:1504 (find_package_handle_standard_args) matlab/CMakeLists.txt:5 (find_package) -- Configuring incomplete, errors occurred! See also "C:/myproj/build/CMakeFiles/CMakeOutput.log".
You can make the error go away by additionally specifying
-DMatlab_MEX_EXTENSION=mexw64 but I believe this is an ugly hack because the CMake documentation itself says here that this should be determined by the installed Matlab.
I think this use case should definitely be made to work, since
FindMatlab has actually awesome mex support: For example I think CMake 3.7 added
matlab_add_mex(...), which I must say is pretty awesome for generating Matlab bindings for C++ code :-)
And I think the FindMatlab script has already some support for the MCR or something like that, since for example
MAIN_PROGRAM (which would be Matlab.exe) is only defined/returned if you explicitly request it (at least the CMake documentation says that).
Additionally, for example on travis/AppVeyor the only way to test mex bindings is with the MCR, since a full Matlab installation is not an option for licensing reasons.