From 257a3e870ea96a861752ff3ffff9481dfa4a4577 Mon Sep 17 00:00:00 2001 From: scivision Date: Fri, 3 Mar 2023 17:01:15 -0500 Subject: FindMatlab: add Matlab_VERSION and document. fixes #24569 --- Modules/FindMatlab.cmake | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index 0f1e451..fa8ee5a 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -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. @@ -2020,11 +2026,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) -- cgit v0.12 From af05544c494c9465f120b00b7539015b7e5bb8d9 Mon Sep 17 00:00:00 2001 From: scivision Date: Sat, 4 Mar 2023 23:33:08 -0500 Subject: FindMatlab: document function input/output --- Modules/FindMatlab.cmake | 83 ++++++++++++++++++++++++------------------------ 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index fa8ee5a..e9ec9b7 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -342,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) @@ -359,13 +366,17 @@ macro(matlab_get_version_from_release_name release_name version_name) endmacro() +#[=======================================================================[.rst: +.. command:: matlab_get_release_name_from_version + .. code-block:: cmake + matlab_get_release_name_from_version(version release_name) -#[=======================================================================[.rst: -.. command:: matlab_get_release_name_from_version + * Input: ``version`` is the version of Matlab (9.13) + * Output: ``release_name`` is the release name (R2022b) - Returns the release name (R2017k) from the version of Matlab (17.58) + Returns the release name from the version of Matlab #]=======================================================================] macro(matlab_get_release_name_from_version version release_name) @@ -387,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}) @@ -426,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 @@ -546,8 +561,6 @@ macro(extract_matlab_versions_from_registry_brute_force matlab_versions) endmacro() - - #[=======================================================================[.rst: .. command:: matlab_get_all_valid_matlab_roots_from_registry @@ -557,16 +570,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) @@ -629,16 +638,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) @@ -716,8 +721,6 @@ function(matlab_get_mex_suffix matlab_root mex_suffix) endfunction() - - #[=======================================================================[.rst: .. command:: matlab_get_version_from_matlab_run @@ -725,16 +728,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) @@ -904,7 +903,7 @@ endfunction() non 0 failure). Additional arguments accepted by :command:`add_test` can be passed through ``TEST_ARGS`` (eg. ``CONFIGURATION ...``). - :: + .. code-block:: cmake matlab_add_unit_test( NAME @@ -918,7 +917,7 @@ endfunction() [NO_UNITTEST_FRAMEWORK] ) - The function arguments are: + Function Parameters: ``NAME`` name of the unittest in ctest. @@ -1016,7 +1015,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 @@ -1031,6 +1030,8 @@ endfunction() [...] ) + Function Parameters: + ``NAME`` name of the target. ``SRC`` -- cgit v0.12 From c4cacdc7eb77592910e9327dd8d7bd905e8e285d Mon Sep 17 00:00:00 2001 From: scivision Date: Sat, 4 Mar 2023 23:36:30 -0500 Subject: FindMatlab: use modern foreach() remove unused superseded commented code --- Modules/FindMatlab.cmake | 39 +++++++-------------------------------- 1 file changed, 7 insertions(+), 32 deletions(-) diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index e9ec9b7..c2ac29b 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -387,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) @@ -409,7 +409,7 @@ macro(matlab_get_supported_releases list_releases) endif() unset(_matched) unset(CMAKE_MATCH_1) - endforeach(_var) + endforeach() unset(_var) endmacro() @@ -426,7 +426,7 @@ macro(matlab_get_supported_versions list_versions) endif() unset(_matched) unset(CMAKE_MATCH_1) - endforeach(_var) + endforeach() unset(_var) endmacro() @@ -525,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) @@ -585,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]" @@ -598,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]" @@ -614,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]" @@ -1274,7 +1249,7 @@ function(matlab_add_mex) endif() - foreach(_file ${_ver_map_files}) + foreach(_file IN LISTS _ver_map_files) set(_link_flags "${_link_flags} -Wl,${_export_flag_name},${_file}") endforeach() -- cgit v0.12 From 1932ae0284d6eac4b3237d43db772b91e052a379 Mon Sep 17 00:00:00 2001 From: scivision Date: Sat, 4 Mar 2023 23:53:12 -0500 Subject: FindMatlab: refactor: use string(APPEND --- Modules/FindMatlab.cmake | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index c2ac29b..cbf0445 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -1191,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() @@ -1228,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() @@ -1243,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 IN LISTS _ver_map_files) - set(_link_flags "${_link_flags} -Wl,${_export_flag_name},${_file}") + string(APPEND _link_flags " -Wl,${_export_flag_name},${_file}") endforeach() # The `mex` command doesn't add this define. It is specified here in order -- cgit v0.12 From 103dbb2fd205315c1b083ea95aac5bebd0800473 Mon Sep 17 00:00:00 2001 From: scivision Date: Sun, 5 Mar 2023 00:12:18 -0500 Subject: FindMatlab: Windows -wait is only for -r, not -batch --- Modules/MatlabTestsRedirect.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/MatlabTestsRedirect.cmake b/Modules/MatlabTestsRedirect.cmake index d651cdd..8973231 100644 --- a/Modules/MatlabTestsRedirect.cmake +++ b/Modules/MatlabTestsRedirect.cmake @@ -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) -- cgit v0.12