Merge topic 'findmatlab'

103dbb2fd2 FindMatlab: Windows -wait is only for -r, not -batch
1932ae0284 FindMatlab: refactor: use string(APPEND
c4cacdc7eb FindMatlab: use modern foreach()
af05544c49 FindMatlab: document function input/output
257a3e870e FindMatlab: add Matlab_VERSION and document.

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !8286
This commit is contained in:
Brad King
2023-03-08 14:01:37 +00:00
committed by Kitware Robot
2 changed files with 68 additions and 85 deletions

View File

@@ -137,6 +137,12 @@ Result variables
``Matlab_FOUND``
``TRUE`` if the Matlab installation is found, ``FALSE``
otherwise. All variable below are defined if Matlab is found.
``Matlab_VERSION``
.. versionadded:: 3.27
the numerical version (e.g. 9.13) of Matlab found. Not to be confused with
Matlab release name (e.g. R2022b) that can be obtained with
:command:`matlab_get_release_name_from_version`.
``Matlab_ROOT_DIR``
the final root of the Matlab installation determined by the FindMatlab
module.
@@ -336,7 +342,14 @@ endif()
#[=======================================================================[.rst:
.. command:: matlab_get_version_from_release_name
Returns the version of Matlab (17.58) from a release name (R2017k)
.. code-block:: cmake
matlab_get_version_from_release_name(release version)
* Input: ``release`` is the release name (R2022b)
* Output: ``version`` is the version of Matlab (9.13)
Returns the version of Matlab from a release name
#]=======================================================================]
macro(matlab_get_version_from_release_name release_name version_name)
@@ -353,13 +366,17 @@ macro(matlab_get_version_from_release_name release_name version_name)
endmacro()
#[=======================================================================[.rst:
.. command:: matlab_get_release_name_from_version
Returns the release name (R2017k) from the version of Matlab (17.58)
.. code-block:: cmake
matlab_get_release_name_from_version(version release_name)
* Input: ``version`` is the version of Matlab (9.13)
* Output: ``release_name`` is the release name (R2022b)
Returns the release name from the version of Matlab
#]=======================================================================]
macro(matlab_get_release_name_from_version version release_name)
@@ -370,7 +387,7 @@ macro(matlab_get_release_name_from_version version release_name)
set(${release_name} ${CMAKE_MATCH_1})
break()
endif()
endforeach(_var)
endforeach()
unset(_var)
unset(_matched)
@@ -381,10 +398,7 @@ macro(matlab_get_release_name_from_version version release_name)
endmacro()
# extracts all the supported release names (R2017k...) of Matlab
# extracts all the supported release names (R2022b...) of Matlab
# internal use
macro(matlab_get_supported_releases list_releases)
set(${list_releases})
@@ -395,7 +409,7 @@ macro(matlab_get_supported_releases list_releases)
endif()
unset(_matched)
unset(CMAKE_MATCH_1)
endforeach(_var)
endforeach()
unset(_var)
endmacro()
@@ -412,7 +426,7 @@ macro(matlab_get_supported_versions list_versions)
endif()
unset(_matched)
unset(CMAKE_MATCH_1)
endforeach(_var)
endforeach()
unset(_var)
endmacro()
@@ -420,8 +434,15 @@ endmacro()
#[=======================================================================[.rst:
.. command:: matlab_extract_all_installed_versions_from_registry
This function parses the registry and founds the Matlab versions that are
installed. The found versions are returned in `matlab_versions`.
.. code-block:: cmake
matlab_extract_all_installed_versions_from_registry(win64 matlab_versions)
* Input: ``win64`` is a boolean to search for the 64 bit version of Matlab
* Output: ``matlab_versions`` is a list of all the versions of Matlab found
This function parses the Windows registry and founds the Matlab versions that
are installed. The found versions are returned in `matlab_versions`.
Set `win64` to `TRUE` if the 64 bit version of Matlab should be looked for
The returned list contains all versions under
``HKLM\\SOFTWARE\\Mathworks\\MATLAB`` and
@@ -504,31 +525,6 @@ macro(extract_matlab_versions_from_registry_brute_force matlab_versions)
set(matlab_supported_versions)
matlab_get_supported_versions(matlab_supported_versions)
# this is a manual population of the versions we want to look for
# this can be done as is, but preferably with the call to
# matlab_get_supported_versions and variable
# populating the versions we want to look for
# set(matlab_supported_versions)
# # Matlab 7
# set(matlab_major 7)
# foreach(current_matlab_minor RANGE 4 20)
# list(APPEND matlab_supported_versions "${matlab_major}.${current_matlab_minor}")
# endforeach(current_matlab_minor)
# # Matlab 8
# set(matlab_major 8)
# foreach(current_matlab_minor RANGE 0 5)
# list(APPEND matlab_supported_versions "${matlab_major}.${current_matlab_minor}")
# endforeach(current_matlab_minor)
# # taking into account the possible additional versions provided by the user
# if(DEFINED MATLAB_ADDITIONAL_VERSIONS)
# list(APPEND matlab_supported_versions MATLAB_ADDITIONAL_VERSIONS)
# endif()
# we order from more recent to older
if(matlab_supported_versions)
list(REMOVE_DUPLICATES matlab_supported_versions)
@@ -540,8 +536,6 @@ macro(extract_matlab_versions_from_registry_brute_force matlab_versions)
endmacro()
#[=======================================================================[.rst:
.. command:: matlab_get_all_valid_matlab_roots_from_registry
@@ -551,16 +545,12 @@ endmacro()
``(type,version_number,matlab_root_path)``, where ``type``
indicates either ``MATLAB`` or ``MCR``.
::
.. code-block:: cmake
matlab_get_all_valid_matlab_roots_from_registry(
matlab_versions
matlab_roots)
matlab_get_all_valid_matlab_roots_from_registry(matlab_versions matlab_roots)
``matlab_versions``
the versions of each of the Matlab or MCR installations
``matlab_roots``
the location of each of the Matlab or MCR installations
* Input: ``matlab_versions`` of each of the Matlab or MCR installations
* Output: ``matlab_roots`` location of each of the Matlab or MCR installations
#]=======================================================================]
function(matlab_get_all_valid_matlab_roots_from_registry matlab_versions matlab_roots)
@@ -570,7 +560,7 @@ function(matlab_get_all_valid_matlab_roots_from_registry matlab_versions matlab_
set(_matlab_roots_list )
# check for Matlab installations
foreach(_matlab_current_version ${matlab_versions})
foreach(_matlab_current_version IN LISTS matlab_versions)
get_filename_component(
current_MATLAB_ROOT
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB\\${_matlab_current_version};MATLABROOT]"
@@ -583,7 +573,7 @@ function(matlab_get_all_valid_matlab_roots_from_registry matlab_versions matlab_
endforeach()
# Check for MCR installations
foreach(_matlab_current_version ${matlab_versions})
foreach(_matlab_current_version IN LISTS matlab_versions)
get_filename_component(
current_MATLAB_ROOT
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB Runtime\\${_matlab_current_version};MATLABROOT]"
@@ -599,7 +589,7 @@ function(matlab_get_all_valid_matlab_roots_from_registry matlab_versions matlab_
endforeach()
# Check for old MCR installations
foreach(_matlab_current_version ${matlab_versions})
foreach(_matlab_current_version IN LISTS matlab_versions)
get_filename_component(
current_MATLAB_ROOT
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB Compiler Runtime\\${_matlab_current_version};MATLABROOT]"
@@ -623,16 +613,12 @@ endfunction()
This function should not be called before the appropriate Matlab root has
been found.
::
.. code-block:: cmake
matlab_get_mex_suffix(
matlab_root
mex_suffix)
matlab_get_mex_suffix(matlab_root mex_suffix)
``matlab_root``
the root of the Matlab/MCR installation
``mex_suffix``
the variable name in which the suffix will be returned.
* Input: ``matlab_root`` root of Matlab/MCR install e.g. ``Matlab_ROOT_DIR``
* Output: ``mex_suffix`` variable name in which the suffix will be returned.
#]=======================================================================]
function(matlab_get_mex_suffix matlab_root mex_suffix)
@@ -710,8 +696,6 @@ function(matlab_get_mex_suffix matlab_root mex_suffix)
endfunction()
#[=======================================================================[.rst:
.. command:: matlab_get_version_from_matlab_run
@@ -719,16 +703,12 @@ endfunction()
version. If the path provided for the Matlab installation points to an MCR
installation, the version is extracted from the installed files.
::
.. code-block:: cmake
matlab_get_version_from_matlab_run(
matlab_binary_path
matlab_list_versions)
matlab_get_version_from_matlab_run(matlab_binary_path matlab_list_versions)
``matlab_binary_path``
the location of the `matlab` binary executable
``matlab_list_versions``
the version extracted from Matlab
* Input: ``matlab_binary_path`` path of the `matlab` binary executable
* Output: ``matlab_list_versions`` the version extracted from Matlab
#]=======================================================================]
function(matlab_get_version_from_matlab_run matlab_binary_program matlab_list_versions)
@@ -898,7 +878,7 @@ endfunction()
non 0 failure). Additional arguments accepted by :command:`add_test` can be
passed through ``TEST_ARGS`` (eg. ``CONFIGURATION <config> ...``).
::
.. code-block:: cmake
matlab_add_unit_test(
NAME <name>
@@ -912,7 +892,7 @@ endfunction()
[NO_UNITTEST_FRAMEWORK]
)
The function arguments are:
Function Parameters:
``NAME``
name of the unittest in ctest.
@@ -1010,7 +990,7 @@ endfunction()
for the MEX file. Remaining arguments of the call are passed to the
:command:`add_library` or :command:`add_executable` command.
::
.. code-block:: cmake
matlab_add_mex(
NAME <name>
@@ -1025,6 +1005,8 @@ endfunction()
[...]
)
Function Parameters:
``NAME``
name of the target.
``SRC``
@@ -1209,18 +1191,17 @@ function(matlab_add_mex)
if (MSVC)
set(_link_flags "${_link_flags} /EXPORT:mexFunction")
string(APPEND _link_flags " /EXPORT:mexFunction")
if(NOT Matlab_VERSION_STRING VERSION_LESS "9.1") # For 9.1 (R2016b) and newer, export version
set(_link_flags "${_link_flags} /EXPORT:mexfilerequiredapiversion")
string(APPEND _link_flags " /EXPORT:mexfilerequiredapiversion")
endif()
set_property(TARGET ${${prefix}_NAME} APPEND PROPERTY LINK_FLAGS ${_link_flags})
endif() # No other compiler currently supported on Windows.
set_target_properties(${${prefix}_NAME}
PROPERTIES
DEFINE_SYMBOL "DLL_EXPORT_SYM=__declspec(dllexport)")
set_property(TARGET ${${prefix}_NAME} PROPERTY
DEFINE_SYMBOL "DLL_EXPORT_SYM=__declspec(dllexport)")
else()
@@ -1246,7 +1227,7 @@ function(matlab_add_mex)
if(Matlab_HAS_CPP_API)
list(APPEND _ver_map_files ${Matlab_EXTERN_LIBRARY_DIR}/cppMexFunction.map) # This one doesn't exist on Linux
set(_link_flags "${_link_flags} -Wl,-U,_mexCreateMexFunction -Wl,-U,_mexDestroyMexFunction -Wl,-U,_mexFunctionAdapter")
string(APPEND _link_flags " -Wl,-U,_mexCreateMexFunction -Wl,-U,_mexDestroyMexFunction -Wl,-U,_mexFunctionAdapter")
# On MacOS, the MEX command adds the above, without it the link breaks
# because we indiscriminately use "cppMexFunction.map" even for C API MEX-files.
endif()
@@ -1261,14 +1242,14 @@ function(matlab_add_mex)
target_compile_options(${${prefix}_NAME} PRIVATE "-pthread")
endif()
set(_link_flags "${_link_flags} -Wl,--as-needed")
string(APPEND _link_flags " -Wl,--as-needed")
set(_export_flag_name --version-script)
endif()
foreach(_file ${_ver_map_files})
set(_link_flags "${_link_flags} -Wl,${_export_flag_name},${_file}")
foreach(_file IN LISTS _ver_map_files)
string(APPEND _link_flags " -Wl,${_export_flag_name},${_file}")
endforeach()
# The `mex` command doesn't add this define. It is specified here in order
@@ -2020,11 +2001,13 @@ _Matlab_add_imported_target(MAT mat)
_Matlab_add_imported_target(ENGINE MatlabEngine)
_Matlab_add_imported_target(DATAARRAY MatlabDataArray)
set(Matlab_VERSION ${Matlab_VERSION_STRING})
find_package_handle_standard_args(
Matlab
FOUND_VAR Matlab_FOUND
REQUIRED_VARS ${_matlab_required_variables}
VERSION_VAR Matlab_VERSION_STRING
VERSION_VAR Matlab_VERSION
HANDLE_COMPONENTS)
unset(_matlab_required_variables)

View File

@@ -19,8 +19,8 @@
# -P FindMatlab_TestsRedirect.cmake
set(Matlab_UNIT_TESTS_CMD -nosplash -nodesktop -nodisplay ${Matlab_ADDITIONAL_STARTUP_OPTIONS})
if(WIN32)
set(Matlab_UNIT_TESTS_CMD ${Matlab_UNIT_TESTS_CMD} -wait)
if(WIN32 AND maut_BATCH_OPTION STREQUAL "-r")
list(APPEND Matlab_UNIT_TESTS_CMD -wait)
endif()
if(NOT test_timeout)