Modules: Tolerate CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL

Capture the `execute_process` command's `RESULT_VARIABLE`.

Issue: #27782
diff --git a/Modules/CMakeDetermineRustCompiler.cmake b/Modules/CMakeDetermineRustCompiler.cmake
index 43441b0..971354f 100644
--- a/Modules/CMakeDetermineRustCompiler.cmake
+++ b/Modules/CMakeDetermineRustCompiler.cmake
@@ -30,9 +30,10 @@
     COMMAND ${RUSTUP_PATH} which rustc
     OUTPUT_VARIABLE REAL_RUSTC
     OUTPUT_STRIP_TRAILING_WHITESPACE
-  )
+    RESULT_VARIABLE _rust_result
+    )
 
-  if("${REAL_RUSTC}" STREQUAL "")
+  if(NOT _rust_result EQUAL 0 OR "${REAL_RUSTC}" STREQUAL "")
     message(FATAL_ERROR "Failed to find path to real rustc")
   endif()
 
diff --git a/Modules/CMakeDetermineSystem.cmake b/Modules/CMakeDetermineSystem.cmake
index dc26258..c70fea1 100644
--- a/Modules/CMakeDetermineSystem.cmake
+++ b/Modules/CMakeDetermineSystem.cmake
@@ -15,19 +15,24 @@
       execute_process(COMMAND ${CMAKE_UNAME} -v
         OUTPUT_VARIABLE _CMAKE_HOST_SYSTEM_MAJOR_VERSION
         OUTPUT_STRIP_TRAILING_WHITESPACE
-        ERROR_QUIET)
+        ERROR_QUIET
+        RESULT_VARIABLE _uname_result)
       execute_process(COMMAND ${CMAKE_UNAME} -r
         OUTPUT_VARIABLE _CMAKE_HOST_SYSTEM_MINOR_VERSION
         OUTPUT_STRIP_TRAILING_WHITESPACE
-        ERROR_QUIET)
-      set(CMAKE_HOST_SYSTEM_VERSION "${_CMAKE_HOST_SYSTEM_MAJOR_VERSION}.${_CMAKE_HOST_SYSTEM_MINOR_VERSION}")
+        ERROR_QUIET
+        RESULT_VARIABLE _uname_result2)
+      if(_uname_result EQUAL 0 AND _uname_result2 EQUAL 0)
+        set(CMAKE_HOST_SYSTEM_VERSION "${_CMAKE_HOST_SYSTEM_MAJOR_VERSION}.${_CMAKE_HOST_SYSTEM_MINOR_VERSION}")
+      endif()
       unset(_CMAKE_HOST_SYSTEM_MAJOR_VERSION)
       unset(_CMAKE_HOST_SYSTEM_MINOR_VERSION)
     elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL "Android")
       execute_process(COMMAND getprop ro.build.version.sdk
         OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION
         OUTPUT_STRIP_TRAILING_WHITESPACE
-        ERROR_QUIET)
+        ERROR_QUIET
+        RESULT_VARIABLE _uname_result)
 
       if(NOT DEFINED CMAKE_SYSTEM_VERSION)
         set(_ANDROID_API_LEVEL_H $ENV{PREFIX}/include/android/api-level.h)
@@ -49,7 +54,8 @@
       execute_process(COMMAND ${CMAKE_UNAME} -r
         OUTPUT_VARIABLE CMAKE_HOST_SYSTEM_VERSION
         OUTPUT_STRIP_TRAILING_WHITESPACE
-        ERROR_QUIET)
+        ERROR_QUIET
+        RESULT_VARIABLE _uname_result)
     endif()
     if(CMAKE_HOST_SYSTEM_NAME MATCHES "Linux|CYGWIN.*|MSYS.*|^GNU$|Android")
       execute_process(COMMAND ${CMAKE_UNAME} -m
diff --git a/Modules/Compiler/ARMClang.cmake b/Modules/Compiler/ARMClang.cmake
index 2f0ee91..ae78b3b 100644
--- a/Modules/Compiler/ARMClang.cmake
+++ b/Modules/Compiler/ARMClang.cmake
@@ -25,9 +25,14 @@
 function(__armclang_set_processor_list lang out_var)
   execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -mcpu=list
     OUTPUT_VARIABLE processor_list
-    ERROR_VARIABLE processor_list)
-  string(REGEX MATCHALL "-mcpu=([^ \n]*)" processor_list "${processor_list}")
-  string(REGEX REPLACE "-mcpu=" "" processor_list "${processor_list}")
+    ERROR_VARIABLE processor_list
+    RESULT_VARIABLE _res
+    )
+  set(processor_list)
+  if(_res EQUAL 0)
+    string(REGEX MATCHALL "-mcpu=([^ \n]*)" processor_list "${processor_list}")
+    string(REGEX REPLACE "-mcpu=" "" processor_list "${processor_list}")
+  endif()
   set(${out_var} "${processor_list}" PARENT_SCOPE)
 endfunction()
 
@@ -45,9 +50,14 @@
 function(__armclang_set_arch_list lang out_var)
   execute_process(COMMAND "${CMAKE_${lang}_COMPILER}" --target=${CMAKE_${lang}_COMPILER_TARGET} -march=list
     OUTPUT_VARIABLE arch_list
-    ERROR_VARIABLE arch_list)
-  string(REGEX MATCHALL "-march=([^ \n]*)" arch_list "${arch_list}")
-  string(REGEX REPLACE "-march=" "" arch_list "${arch_list}")
+    ERROR_VARIABLE arch_list
+    RESULT_VARIABLE _res
+    )
+  set(arch_list)
+  if(_res EQUAL 0)
+    string(REGEX MATCHALL "-march=([^ \n]*)" arch_list "${arch_list}")
+    string(REGEX REPLACE "-march=" "" arch_list "${arch_list}")
+  endif()
   set(${out_var} "${arch_list}" PARENT_SCOPE)
 endfunction()
 
@@ -61,9 +71,14 @@
 
   execute_process(COMMAND "${CMAKE_LINKER}" ${__linker_wrapper_flags} --cpu=list
     OUTPUT_VARIABLE cpu_list
-    ERROR_VARIABLE cpu_list)
-  string(REGEX MATCHALL "--cpu=([^ \n]*)" cpu_list "${cpu_list}")
-  string(REGEX REPLACE "--cpu=" "" cpu_list "${cpu_list}")
+    ERROR_VARIABLE cpu_list
+    RESULT_VARIABLE _res
+    )
+  set(cpu_list)
+  if(_res EQUAL 0)
+    string(REGEX MATCHALL "--cpu=([^ \n]*)" cpu_list "${cpu_list}")
+    string(REGEX REPLACE "--cpu=" "" cpu_list "${cpu_list}")
+  endif()
   set(${out_var} "${cpu_list}" PARENT_SCOPE)
 endfunction()
 
diff --git a/Modules/Compiler/NAG-Fortran.cmake b/Modules/Compiler/NAG-Fortran.cmake
index 50b2991..0be24c7 100644
--- a/Modules/Compiler/NAG-Fortran.cmake
+++ b/Modules/Compiler/NAG-Fortran.cmake
@@ -6,10 +6,11 @@
     COMMAND ${CMAKE_Fortran_COMPILER} dummy.o -dryrun
     OUTPUT_VARIABLE _dryrun
     ERROR_VARIABLE _dryrun
+    RESULT_VARIABLE _dryrun_result
     )
   # Match an object file.
   string(REGEX MATCH "/[^ ]*/[^ /][^ /]*\\.o" _nag_obj "${_dryrun}")
-  if(_nag_obj)
+  if(_nag_obj AND _dryrun_result EQUAL 0)
     # Parse object directory and convert to a regex.
     string(REGEX REPLACE "/[^/]*$" "" _nag_dir "${_nag_obj}")
     string(REGEX REPLACE "([][+.*()^])" "\\\\\\1" _nag_regex "${_nag_dir}")
diff --git a/Modules/Internal/CMakeDetermineLinkerId.cmake b/Modules/Internal/CMakeDetermineLinkerId.cmake
index 9b2283e..478123d 100644
--- a/Modules/Internal/CMakeDetermineLinkerId.cmake
+++ b/Modules/Internal/CMakeDetermineLinkerId.cmake
@@ -31,7 +31,10 @@
                     OUTPUT_STRIP_TRAILING_WHITESPACE
                     ERROR_STRIP_TRAILING_WHITESPACE
                     COMMAND_ERROR_IS_FATAL NONE
+                    RESULT_VARIABLE _res
     )
+    # We capture "_res" but don't check it because it's expected that
+    # linkers will exit with non-zero on flags they do not have.
 
     string(JOIN "\" \"" flags_string ${flags})
     string(REGEX REPLACE "\n\n.*" "" linker_desc_head "${linker_desc}")
diff --git a/Modules/Linker/GNU.cmake b/Modules/Linker/GNU.cmake
index b56608e..de8f8e2 100644
--- a/Modules/Linker/GNU.cmake
+++ b/Modules/Linker/GNU.cmake
@@ -24,11 +24,13 @@
       # Ninja 1.10 or upper is required
       execute_process(COMMAND "${CMAKE_MAKE_PROGRAM}" --version
         OUTPUT_VARIABLE _ninja_version
-        ERROR_VARIABLE _ninja_version)
+        ERROR_VARIABLE _ninja_version
+        RESULT_VARIABLE _res
+        )
       if (_ninja_version MATCHES "[0-9]+(\\.[0-9]+)*")
         set (_ninja_version "${CMAKE_MATCH_0}")
       endif()
-      if (_ninja_version VERSION_LESS "1.10")
+      if (NOT _res EQUAL 0 OR _ninja_version VERSION_LESS "1.10")
         set(CMAKE_${lang}_LINKER_DEPFILE_SUPPORTED FALSE)
       endif()
     endif()
@@ -38,8 +40,9 @@
       if (CMAKE_${lang}_COMPILER_LINKER AND CMAKE_${lang}_COMPILER_LINKER_ID MATCHES "GNU|LLD|MOLD")
         execute_process(COMMAND "${CMAKE_${lang}_COMPILER_LINKER}" --help
                         OUTPUT_VARIABLE _linker_capabilities
-                        ERROR_VARIABLE _linker_capabilities)
-        if(_linker_capabilities MATCHES "--dependency-file")
+                        ERROR_VARIABLE _linker_capabilities
+                        RESULT_VARIABLE _res)
+        if(_res EQUAL 0 AND _linker_capabilities MATCHES "--dependency-file")
           set(CMAKE_${lang}_LINKER_DEPFILE_SUPPORTED TRUE)
         else()
           set(CMAKE_${lang}_LINKER_DEPFILE_SUPPORTED FALSE)
diff --git a/Modules/Platform/Android/Determine-Compiler-Standalone.cmake b/Modules/Platform/Android/Determine-Compiler-Standalone.cmake
index 2da1ad3..30a0125 100644
--- a/Modules/Platform/Android/Determine-Compiler-Standalone.cmake
+++ b/Modules/Platform/Android/Determine-Compiler-Standalone.cmake
@@ -30,8 +30,9 @@
   OUTPUT_VARIABLE _gcc_version
   ERROR_VARIABLE _gcc_error
   OUTPUT_STRIP_TRAILING_WHITESPACE
+  RESULT_VARIABLE _gcc_result
   )
-if(_gcc_version MATCHES "^([0-9]+\\.[0-9]+)")
+if(_gcc_result EQUAL 0 AND _gcc_version MATCHES "^([0-9]+\\.[0-9]+)")
   set(_ANDROID_TOOL_C_TOOLCHAIN_VERSION "${CMAKE_MATCH_1}")
 else()
   message(FATAL_ERROR
diff --git a/Modules/Platform/Apple-GNU.cmake b/Modules/Platform/Apple-GNU.cmake
index 69ccb40..1852c6e 100644
--- a/Modules/Platform/Apple-GNU.cmake
+++ b/Modules/Platform/Apple-GNU.cmake
@@ -31,8 +31,9 @@
       COMMAND ${CMAKE_${lang}_COMPILER} "-v" "--help"
       OUTPUT_VARIABLE _gcc_help
       ERROR_VARIABLE _gcc_help
+      RESULT_VARIABLE _gcc_result
       )
-    if("${_gcc_help}" MATCHES "isysroot")
+    if(_gcc_result EQUAL 0 AND "${_gcc_help}" MATCHES "isysroot")
       message(CHECK_PASS "yes")
       set(CMAKE_${lang}_SYSROOT_FLAG "-isysroot")
     else()
@@ -51,8 +52,9 @@
       COMMAND ${CMAKE_${lang}_COMPILER} "-v" "--help"
       OUTPUT_VARIABLE _gcc_help
       ERROR_VARIABLE _gcc_help
+      RESULT_VARIABLE _gcc_result
       )
-    if("${_gcc_help}" MATCHES "macosx-version-min")
+    if(_gcc_result EQUAL 0 AND "${_gcc_help}" MATCHES "macosx-version-min")
       message(CHECK_PASS "yes")
       set(CMAKE_${lang}_OSX_DEPLOYMENT_TARGET_FLAG "-mmacosx-version-min=")
     else()
diff --git a/Modules/Platform/Darwin-Initialize.cmake b/Modules/Platform/Darwin-Initialize.cmake
index fe42de1..c9c88b3 100644
--- a/Modules/Platform/Darwin-Initialize.cmake
+++ b/Modules/Platform/Darwin-Initialize.cmake
@@ -292,10 +292,11 @@
 if(NOT CMAKE_CROSSCOMPILING)
   execute_process(COMMAND sw_vers -productVersion
     OUTPUT_VARIABLE _CMAKE_HOST_OSX_VERSION
-    OUTPUT_STRIP_TRAILING_WHITESPACE)
+    OUTPUT_STRIP_TRAILING_WHITESPACE
+    RESULT_VARIABLE _result)
 endif()
 
-if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
+if(_result EQUAL 0 AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT DEFINED CMAKE_OSX_DEPLOYMENT_TARGET)
   set(_CMAKE_OSX_DEPLOYMENT_TARGET_DEFAULT "$ENV{MACOSX_DEPLOYMENT_TARGET}")
 
   # Xcode chooses a default macOS deployment target based on the macOS SDK
diff --git a/Modules/Platform/Linker/BSD-Linker-Initialize.cmake b/Modules/Platform/Linker/BSD-Linker-Initialize.cmake
index b28dc06..2b5d598 100644
--- a/Modules/Platform/Linker/BSD-Linker-Initialize.cmake
+++ b/Modules/Platform/Linker/BSD-Linker-Initialize.cmake
@@ -7,7 +7,7 @@
                     RESULT_VARIABLE result
                     OUTPUT_VARIABLE output
                     ERROR_VARIABLE output)
-    if(result OR NOT output MATCHES "LLD")
+    if(NOT result EQUAL 0 OR NOT output MATCHES "LLD")
       # assume GNU as default linker
       set(_CMAKE_SYSTEM_LINKER_TYPE GNU CACHE INTERNAL "System linker type")
     else()
diff --git a/Modules/Platform/Linker/GNU.cmake b/Modules/Platform/Linker/GNU.cmake
index 3e665fa..f6b2137 100644
--- a/Modules/Platform/Linker/GNU.cmake
+++ b/Modules/Platform/Linker/GNU.cmake
@@ -23,8 +23,8 @@
                     OUTPUT_VARIABLE __linker_log
                     ERROR_VARIABLE __linker_log
                     COMMAND_ERROR_IS_FATAL NONE
-    )
-    if(__linker_log MATCHES "--push-state" OR __linker_log MATCHES "--pop-state")
+                    RESULT_VARIABLE __linker_result)
+    if(__linker_result EQUAL 0 AND (__linker_log MATCHES "--push-state" OR __linker_log MATCHES "--pop-state"))
       set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED FALSE)
     else()
       set(CMAKE_${__lang}LINKER_PUSHPOP_STATE_SUPPORTED TRUE)
diff --git a/Modules/Platform/Linux-SunPro-CXX.cmake b/Modules/Platform/Linux-SunPro-CXX.cmake
index a07f1ec..fe25deb 100644
--- a/Modules/Platform/Linux-SunPro-CXX.cmake
+++ b/Modules/Platform/Linux-SunPro-CXX.cmake
@@ -1,7 +1,10 @@
 # Sun C++ 5.9 does not support -Wl, but Sun C++ 5.11 does not work without it.
 # Query the compiler flags to detect whether to use -Wl.
-execute_process(COMMAND ${CMAKE_CXX_COMPILER} -flags OUTPUT_VARIABLE _cxx_flags ERROR_VARIABLE _cxx_error)
-if("${_cxx_flags}" MATCHES "\n-W[^\n]*component")
+execute_process(COMMAND ${CMAKE_CXX_COMPILER} -flags
+OUTPUT_VARIABLE _cxx_flags
+ERROR_VARIABLE _cxx_error
+RESULT_VARIABLE _cxx_result)
+if(_cxx_result EQUAL 0 AND "${_cxx_flags}" MATCHES "\n-W[^\n]*component")
   set(CMAKE_SHARED_LIBRARY_RPATH_LINK_CXX_FLAG "-Wl,-rpath-link,")
 else()
   set(CMAKE_SHARED_LIBRARY_RPATH_LINK_CXX_FLAG "-rpath-link ")
diff --git a/Modules/Platform/OpenBSD.cmake b/Modules/Platform/OpenBSD.cmake
index 97e2a6a..71bb99e 100644
--- a/Modules/Platform/OpenBSD.cmake
+++ b/Modules/Platform/OpenBSD.cmake
@@ -7,12 +7,15 @@
 if(NOT CMAKE_PLATFORM_RUNTIME_PATH)
   execute_process(COMMAND /sbin/ldconfig -r
                   OUTPUT_VARIABLE LDCONFIG_HINTS
-                  ERROR_QUIET)
-  string(REGEX REPLACE ".*search\\ directories:\\ ([^\n]*).*" "\\1"
-         LDCONFIG_HINTS "${LDCONFIG_HINTS}")
-  string(REPLACE ":" ";"
-         CMAKE_PLATFORM_RUNTIME_PATH
-         "${LDCONFIG_HINTS}")
+                  ERROR_QUIET
+                  RESULT_VARIABLE _res)
+  if(_res EQUAL 0)
+    string(REGEX REPLACE ".*search\\ directories:\\ ([^\n]*).*" "\\1"
+           LDCONFIG_HINTS "${LDCONFIG_HINTS}")
+    string(REPLACE ":" ";"
+           CMAKE_PLATFORM_RUNTIME_PATH
+           "${LDCONFIG_HINTS}")
+  endif()
 endif()
 
 # OpenBSD requires -z origin to enable $ORIGIN expansion in RPATH.
diff --git a/Modules/Platform/Windows-GNU.cmake b/Modules/Platform/Windows-GNU.cmake
index 962b57a..c50b13c 100644
--- a/Modules/Platform/Windows-GNU.cmake
+++ b/Modules/Platform/Windows-GNU.cmake
@@ -58,8 +58,8 @@
 
 # Check if GNU ld is too old to support @FILE syntax.
 set(__WINDOWS_GNU_LD_RESPONSE 1)
-execute_process(COMMAND ld -v OUTPUT_VARIABLE _help ERROR_VARIABLE _help)
-if("${_help}" MATCHES "GNU ld .* 2\\.1[1-6]")
+execute_process(COMMAND ld -v OUTPUT_VARIABLE _help ERROR_VARIABLE _help RESULT_VARIABLE _res)
+if(_res EQUAL 0 AND "${_help}" MATCHES "GNU ld .* 2\\.1[1-6]")
   set(__WINDOWS_GNU_LD_RESPONSE 0)
 endif()
 
@@ -107,8 +107,8 @@
   set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_INCLUDES 1)
 
   # We prefer "@" for response files but it is not supported by gcc 3.
-  execute_process(COMMAND ${CMAKE_${lang}_COMPILER} --version OUTPUT_VARIABLE _ver ERROR_VARIABLE _ver)
-  if("${_ver}" MATCHES "\\(GCC\\) 3\\.")
+  execute_process(COMMAND ${CMAKE_${lang}_COMPILER} --version OUTPUT_VARIABLE _ver ERROR_VARIABLE _ver RESULT_VARIABLE _res)
+  if(_res EQUAL 0 AND "${_ver}" MATCHES "\\(GCC\\) 3\\.")
     if("${lang}" STREQUAL "Fortran")
       # The GNU Fortran compiler reports an error:
       #   no input files; unwilling to write output files
diff --git a/Modules/Platform/Windows-Intel.cmake b/Modules/Platform/Windows-Intel.cmake
index 12598a0..46a934d 100644
--- a/Modules/Platform/Windows-Intel.cmake
+++ b/Modules/Platform/Windows-Intel.cmake
@@ -16,7 +16,7 @@
     RESULT_VARIABLE _CMAKE_NINJA_RESULT
     OUTPUT_VARIABLE _CMAKE_NINJA_VERSION
     ERROR_VARIABLE _CMAKE_NINJA_VERSION)
-  if (NOT _CMAKE_NINJA_RESULT AND _CMAKE_NINJA_VERSION MATCHES "[0-9]+(\\.[0-9]+)*")
+  if (_CMAKE_NINJA_RESULT EQUAL 0 AND _CMAKE_NINJA_VERSION MATCHES "[0-9]+(\\.[0-9]+)*")
     set (_CMAKE_NINJA_VERSION "${CMAKE_MATCH_0}")
   endif()
   unset(_CMAKE_NINJA_RESULT)