From c608adc2366e1f3a9b44cb9346222852acc8de70 Mon Sep 17 00:00:00 2001 From: scivision Date: Thu, 11 Jan 2024 10:47:38 -0500 Subject: FindMatlab: Fix major.minor version lookups in Windows Registry The registry key names use only the first two version components. Previously we were using the full versions. Fixes: #25582 --- Modules/FindMatlab.cmake | 92 +++++++++++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/Modules/FindMatlab.cmake b/Modules/FindMatlab.cmake index c5379d5..54a6d4c 100644 --- a/Modules/FindMatlab.cmake +++ b/Modules/FindMatlab.cmake @@ -381,8 +381,7 @@ endmacro() macro(matlab_get_release_name_from_version version release_name) # only the major.minor version is used - string(REGEX MATCH "([0-9]+\\.[0-9]+)" _match ${version}) - if(CMAKE_MATCH_1) + if(version MATCHES "([0-9]+\\.[0-9]+)") set(short_version ${CMAKE_MATCH_1}) else() set(short_version ${version}) @@ -485,26 +484,21 @@ function(matlab_extract_all_installed_versions_from_registry win64 matlab_versio ) if(_reg) - string(REGEX MATCHALL "([0-9]+\\.[0-9]+)" _versions_regex "${_reg}") - foreach(match IN LISTS _versions_regex) - string(REGEX MATCH "([0-9]+\\.[0-9]+)" current_match "${match}") - - if(NOT CMAKE_MATCH_1) - continue() - endif() - - cmake_host_system_information(RESULT _reg - QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Mathworks/${_installation_type}/${CMAKE_MATCH_1}" - VALUE "MATLABROOT" - ) - - _Matlab_VersionInfoXML("${_reg}" _matlab_version_tmp) - if(NOT "${_matlab_version_tmp}" STREQUAL "unknown") - list(APPEND matlabs_from_registry ${_matlab_version_tmp}) - else() - list(APPEND matlabs_from_registry ${match}) + foreach(_match IN LISTS _versions_regex) + if(_match MATCHES "([0-9]+\\.[0-9]+)") + cmake_host_system_information(RESULT _reg + QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Mathworks/${_installation_type}/${CMAKE_MATCH_1}" + VALUE "MATLABROOT" + ) + + _Matlab_VersionInfoXML("${_reg}" _matlab_version_tmp) + if("${_matlab_version_tmp}" STREQUAL "unknown") + list(APPEND matlabs_from_registry ${_match}) + else() + list(APPEND matlabs_from_registry ${_matlab_version_tmp}) + endif() endif() endforeach() @@ -560,42 +554,58 @@ function(matlab_get_all_valid_matlab_roots_from_registry matlab_versions matlab_ # extract_matlab_versions_from_registry_brute_force or # matlab_extract_all_installed_versions_from_registry. + # only the major.minor version is used in Mathworks Windows Registry keys + list(TRANSFORM matlab_versions REPLACE "^([0-9]+\\.[0-9]+).*" "\\1") + set(_matlab_roots_list ) # check for Matlab installations foreach(_matlab_current_version IN LISTS matlab_versions) - get_filename_component( - current_MATLAB_ROOT - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\MathWorks\\MATLAB\\${_matlab_current_version};MATLABROOT]" - ABSOLUTE) + cmake_host_system_information(RESULT current_MATLAB_ROOT + QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Mathworks/MATLAB/${_matlab_current_version}" + VALUE "MATLABROOT" + ) + cmake_path(CONVERT "${current_MATLAB_ROOT}" TO_CMAKE_PATH_LIST current_MATLAB_ROOT) if(IS_DIRECTORY "${current_MATLAB_ROOT}") - list(APPEND _matlab_roots_list "MATLAB" ${_matlab_current_version} ${current_MATLAB_ROOT}) + _Matlab_VersionInfoXML("${current_MATLAB_ROOT}" _matlab_version_tmp) + if("${_matlab_version_tmp}" STREQUAL "unknown") + list(APPEND _matlab_roots_list "MATLAB" ${_matlab_current_version} ${current_MATLAB_ROOT}) + else() + list(APPEND _matlab_roots_list "MATLAB" ${_matlab_version_tmp} ${current_MATLAB_ROOT}) + endif() endif() endforeach() # Check for MCR installations 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]" - ABSOLUTE) + cmake_host_system_information(RESULT current_MATLAB_ROOT + QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Mathworks/MATLAB Runtime/${_matlab_current_version}" + VALUE "MATLABROOT" + ) + cmake_path(CONVERT "${current_MATLAB_ROOT}" TO_CMAKE_PATH_LIST current_MATLAB_ROOT) # remove the dot string(REPLACE "." "" _matlab_current_version_without_dot "${_matlab_current_version}") if(IS_DIRECTORY "${current_MATLAB_ROOT}") - list(APPEND _matlab_roots_list "MCR" ${_matlab_current_version} "${current_MATLAB_ROOT}/v${_matlab_current_version_without_dot}") + _Matlab_VersionInfoXML("${current_MATLAB_ROOT}" _matlab_version_tmp) + if("${_matlab_version_tmp}" STREQUAL "unknown") + list(APPEND _matlab_roots_list "MCR" ${_matlab_current_version} "${current_MATLAB_ROOT}/v${_matlab_current_version_without_dot}") + else() + list(APPEND _matlab_roots_list "MCR" ${_matlab_version_tmp} "${current_MATLAB_ROOT}/v${_matlab_current_version_without_dot}") + endif() endif() endforeach() # Check for old MCR installations 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]" - ABSOLUTE) + cmake_host_system_information(RESULT current_MATLAB_ROOT + QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Mathworks/MATLAB Compiler Runtime/${_matlab_current_version}" + VALUE "MATLABROOT" + ) + cmake_path(CONVERT "${current_MATLAB_ROOT}" TO_CMAKE_PATH_LIST current_MATLAB_ROOT) # remove the dot string(REPLACE "." "" _matlab_current_version_without_dot "${_matlab_current_version}") @@ -1412,19 +1422,11 @@ function(_Matlab_VersionInfoXML matlab_root _version) set(_XMLfile ${matlab_root}/VersionInfo.xml) if(EXISTS ${_XMLfile}) - file(READ ${_XMLfile} versioninfo_string) - if(versioninfo_string) - # parses "23.2.0.2365128" - string(REGEX MATCH "([0-9]+(\\.[0-9]+)+)" - version_reg_match - ${versioninfo_string} - ) - - if(CMAKE_MATCH_1) - set(_ver "${CMAKE_MATCH_1}") - endif() + # parses "23.2.0.2365128" + if(versioninfo_string MATCHES "([0-9]+(\\.[0-9]+)+)") + set(_ver "${CMAKE_MATCH_1}") endif() endif() -- cgit v0.12