Browse Source

ExternalProject: option LOG_MERGED_STDOUTERR to combine stdout and stderr

In some circumstances the user of ExternalProject may not desire the
split log files for stdout and stderr. In particular with a project has
many errors it can be difficult to correlate the output error with the
command that it resulted from.

This commit adds the LOG_MERGED_STDOUTERR option that when enabled
outputs into a unified <name>-<step>.log for each step. If disabled it
will default to the previous behaviour of <name>-<step>-out.log and
<name>-<step>-err.log.
Wouter Klouwen 7 years ago
parent
commit
7ddc9e353b

+ 1 - 0
Auxiliary/vim/syntax/cmake.vim

@@ -876,6 +876,7 @@ syn keyword cmakeKWExternalProject contained
             \ LOG_DIR
             \ LOG_DOWNLOAD
             \ LOG_INSTALL
+            \ LOG_MERGED_STDOUTERR
             \ LOG_TEST
             \ LOG_UPDATE
             \ MAKE_EXE

+ 5 - 0
Help/release/dev/ExternalProject-log-options.rst

@@ -0,0 +1,5 @@
+ExternalProject-log-options
+---------------------------
+
+* The :module:`ExternalProject` module :command:`ExternalProject_Add` command
+  gained ``LOG_DIR`` and ``LOG_MERGED_STDOUTERR`` options to control logging.

+ 14 - 3
Modules/ExternalProject.cmake

@@ -544,6 +544,9 @@ External Project Definition
     ``LOG_TEST <bool>``
       When enabled, the output of the test step is logged to files.
 
+    ``LOG_MERGED_STDOUTERR <bool>``
+      When enabled, the output the step is not split by stdout and stderr.
+
   **Terminal Access Options:**
     Steps can be given direct access to the terminal in some cases. Giving a
     step access to the terminal may allow it to receive terminal input if
@@ -1946,21 +1949,29 @@ endif()
   # Wrap the command in a script to log output to files.
   set(script ${stamp_dir}/${name}-${step}-$<CONFIG>.cmake)
   set(logbase ${log_dir}/${name}-${step})
+  get_property(log_merged TARGET ${name} PROPERTY _EP_LOG_MERGED_STDOUTERR)
+  if (log_merged)
+    set(stdout_log "${logbase}.log")
+    set(stderr_log "${logbase}.log")
+  else()
+    set(stdout_log "${logbase}-out.log")
+    set(stderr_log "${logbase}-err.log")
+  endif()
   set(code "
 ${code_cygpath_make}
 set(command \"${command}\")
 execute_process(
   COMMAND \${command}
   RESULT_VARIABLE result
-  OUTPUT_FILE \"${logbase}-out.log\"
-  ERROR_FILE \"${logbase}-err.log\"
+  OUTPUT_FILE \"${stdout_log}\"
+  ERROR_FILE \"${stderr_log}\"
   )
 if(result)
   set(msg \"Command failed: \${result}\\n\")
   foreach(arg IN LISTS command)
     set(msg \"\${msg} '\${arg}'\")
   endforeach()
-  set(msg \"\${msg}\\nSee also\\n  ${logbase}-*.log\")
+  set(msg \"\${msg}\\nSee also\\n  ${stderr_log}\")
   message(FATAL_ERROR \"\${msg}\")
 else()
   set(msg \"${name} ${step} command succeeded.  See also ${logbase}-*.log\")

+ 1 - 0
Tests/ExternalProject/CMakeLists.txt

@@ -640,6 +640,7 @@ ExternalProject_Add(${proj}
   CONFIGURE_COMMAND "${configure_cmd}" COMMAND "${CMAKE_COMMAND}" -E echo "configure"
   BUILD_COMMAND "${build_cmd}" COMMAND "${CMAKE_COMMAND}" -E echo "build"
   INSTALL_COMMAND "${install_cmd}" COMMAND "${CMAKE_COMMAND}" -E echo "install"
+  LOG_MERGED_STDOUTERR 1
   LOG_DIR ${CMAKE_CURRENT_BINARY_DIR}/different_log
   LOG_DOWNLOAD 1
   LOG_PATCH 1