From 41bebbe50a66dfe7bb32365bd119e7e679d0faf1 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Tue, 11 Jan 2022 12:38:16 -0500
Subject: file: Restore error capture in undocumented READ_ELF mode

Revise the error message added by commit 115ff6a347 (cmELF: Include the
ELF parsing code unconditionally, 2021-06-17, v3.22.0-rc1~557^2) to
honor the `CAPTURE_ERROR` option.  This is needed by the call site in
`BundleUtilities` to suppress errors on non-ELF files.

Fixes: #23074
---
 Source/cmFileCommand.cxx                | 11 ++++++++---
 Tests/RunCMake/file/READ_ELF-stderr.txt | 21 +++++++++++++++++++--
 Tests/RunCMake/file/READ_ELF.cmake      |  2 ++
 3 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index fd0595d..c3ae228 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -1213,9 +1213,14 @@ bool HandleReadElfCommand(std::vector<std::string> const& args,
 
   cmELF elf(fileNameArg.c_str());
   if (!elf) {
-    status.SetError(cmStrCat("READ_ELF given FILE \"", fileNameArg,
-                             "\" that is not a valid ELF file."));
-    return false;
+    if (arguments.Error.empty()) {
+      status.SetError(cmStrCat("READ_ELF given FILE:\n  ", fileNameArg,
+                               "\nthat is not a valid ELF file."));
+      return false;
+    }
+    status.GetMakefile().AddDefinition(arguments.Error,
+                                       "not a valid ELF file");
+    return true;
   }
 
   if (!arguments.RPath.empty()) {
diff --git a/Tests/RunCMake/file/READ_ELF-stderr.txt b/Tests/RunCMake/file/READ_ELF-stderr.txt
index 7b32804..fd02ca1 100644
--- a/Tests/RunCMake/file/READ_ELF-stderr.txt
+++ b/Tests/RunCMake/file/READ_ELF-stderr.txt
@@ -1,2 +1,19 @@
-.*file READ_ELF must be called with at least three additional arguments\.
-.*file READ_ELF given FILE "XXX" that does not exist\.
+^CMake Error at READ_ELF.cmake:1 \(file\):
+  file READ_ELF must be called with at least three additional arguments\.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)
++
+CMake Error at READ_ELF.cmake:2 \(file\):
+  file READ_ELF given FILE "XXX" that does not exist\.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)
++
+CMake Error at READ_ELF.cmake:4 \(file\):
+  file READ_ELF given FILE:
+
+    [^
+]*/Tests/RunCMake/file/READ_ELF.cmake
+
+  that is not a valid ELF file\.
+Call Stack \(most recent call first\):
+  CMakeLists.txt:[0-9]+ \(include\)$
diff --git a/Tests/RunCMake/file/READ_ELF.cmake b/Tests/RunCMake/file/READ_ELF.cmake
index cd02c9b..8778fc2 100644
--- a/Tests/RunCMake/file/READ_ELF.cmake
+++ b/Tests/RunCMake/file/READ_ELF.cmake
@@ -1,2 +1,4 @@
 file(READ_ELF XXX)
 file(READ_ELF XXX RPATH YYY)
+file(READ_ELF ${CMAKE_CURRENT_LIST_FILE} RPATH YYY CAPTURE_ERROR err)
+file(READ_ELF ${CMAKE_CURRENT_LIST_FILE} RPATH YYY)
-- 
cgit v0.12