From 11ad487f816a0c2b330bf14563fa69115c01f97c Mon Sep 17 00:00:00 2001
From: Robin De Schepper <robin.deschepper93@gmail.com>
Date: Thu, 7 Oct 2021 13:51:37 +0200
Subject: [PATCH] Write build-catalogue (c)make errors to `stdout` and `stderr`
 (#1679)

---
 scripts/build-catalogue.in | 31 +++++++++++++++++++++++++++----
 1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/scripts/build-catalogue.in b/scripts/build-catalogue.in
index 5c7ed2ba..da5e058c 100755
--- a/scripts/build-catalogue.in
+++ b/scripts/build-catalogue.in
@@ -145,9 +145,32 @@ with TemporaryDirectory() as tmp:
     if verbose:
         out, err = (None, None)
     else:
-        out, err = (sp.DEVNULL, sp.DEVNULL)
-    sp.run('cmake ..', shell=True, check=True, stdout=out, stderr=err)
-    sp.run('make', shell=True, check=True, stdout=out, stderr=err)
-    shutil.copy2(f'{name}-catalogue.so', pwd)
+        out, err = (sp.PIPE, sp.PIPE)
+    try:
+        sp.run('cmake ..', shell=True, check=True, stdout=out, stderr=err)
+        sp.run('make',     shell=True, check=True, stdout=out, stderr=err)
+        shutil.copy2(f'{name}-catalogue.so', pwd)
+    except sp.CalledProcessError as e:
+        import sys, traceback as tb
+
+        if not verbose:
+            # Not in verbose mode, so we have captured the
+            # `stdout` and `stderr` and can print it to the user.
+            sys.stdout.write("Build log:\n")
+            sys.stdout.write(e.stdout.decode())
+            sys.stderr.write(tb.format_exc() + " Error:\n\n")
+            sys.stderr.write(e.stderr.decode())
+        else:
+            # In verbose mode the outputs weren't captured and
+            # have been streamed to `stdout` and `stderr` already.
+            sys.stderr.write(
+                "Catalogue building error occurred."
+                + " Check stdout log for underlying error,"
+                + " or omit verbose flag to capture it."
+            )
+        sys.stdout.flush()
+        sys.stderr.flush()
+        exit(e.returncode)
+    
     if not quiet:
         print(f'Catalogue has been built and copied to {pwd}/{name}-catalogue.so')
-- 
GitLab