diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2017-12-17 08:53:02 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2017-12-17 08:53:02 +0200 |
commit | 8065636673e85704f5aab3ce3674dea729cd2a86 (patch) | |
tree | 12ac57f7186a13eb0ce99a4e92ac9b3a8c645d86 | |
parent | 733aa97b5c0024a7856df7a571b542742f0f3e65 (diff) |
Trace non-zero process exit code
Also convert to using operator<<(ostream,process_exit).
-rw-r--r-- | build2/cli/init.cxx | 4 | ||||
-rw-r--r-- | build2/test/rule.cxx | 11 | ||||
-rw-r--r-- | build2/test/script/runner.cxx | 19 | ||||
-rw-r--r-- | build2/utility.cxx | 12 |
4 files changed, 15 insertions, 31 deletions
diff --git a/build2/cli/init.cxx b/build2/cli/init.cxx index c698fd2..a4403a9 100644 --- a/build2/cli/init.cxx +++ b/build2/cli/init.cxx @@ -107,7 +107,9 @@ namespace build2 { const char* args[] = {cli.string ().c_str (), "--version", nullptr}; - // @@ TODO: redo using run_start()/run_finish(). + // @@ TODO: redo using run_start()/run_finish() or even + // run<string>(). We have the ability to ignore exit code and + // redirect STDERR to STDOUT. try { diff --git a/build2/test/rule.cxx b/build2/test/rule.cxx index 869c23b..96941e6 100644 --- a/build2/test/rule.cxx +++ b/build2/test/rule.cxx @@ -639,16 +639,7 @@ namespace build2 dr << error; print_process (dr, args); - - if (!pe.normal ()) - { - dr << " terminated abnormally: " << pe.description (); - - if (pe.core ()) - dr << " (core dumped)"; - } - else - dr << " exited with code " << static_cast<uint16_t> (pe.code ()); + dr << " " << pe; } return pr && wr; diff --git a/build2/test/script/runner.cxx b/build2/test/script/runner.cxx index 2377774..cddd3a7 100644 --- a/build2/test/script/runner.cxx +++ b/build2/test/script/runner.cxx @@ -344,17 +344,7 @@ namespace build2 { diag_record d (fail (ll)); print_process (d, args); - - if (!pe.normal ()) - { - d << " terminated abnormally: " << pe.description (); - - if (pe.core ()) - d << " (core dumped)"; - } - else - d << " exited with code " - << static_cast<uint16_t> (pe.code ()); + d << " " << pe; } // Output doesn't match the expected result. @@ -1683,12 +1673,7 @@ namespace build2 diag_record d (valid ? error (ll) : fail (ll)); if (!exit->normal ()) - { - d << pr << " terminated abnormally: " << exit->description (); - - if (exit->core ()) - d << " (core dumped)"; - } + d << pr << " " << *exit; else { uint16_t ec (exit->code ()); // Make sure is printed as integer. diff --git a/build2/utility.cxx b/build2/utility.cxx index e8e5fe9..8d63059 100644 --- a/build2/utility.cxx +++ b/build2/utility.cxx @@ -240,21 +240,27 @@ namespace build2 run_finish (const char* args[], process& pr, bool err, const string& l) try { + tracer trace ("run_finish"); + if (pr.wait ()) return true; const process_exit& e (*pr.exit); if (!e.normal ()) - fail << "process " << args[0] << " terminated abnormally: " - << e.description () << (e.core () ? " (core dumped)" : ""); + fail << "process " << args[0] << " " << e; // Normall but non-zero exit status. // if (err) - // Assuming diagnostics has already been issued (to STDERR). + { + // While we assuming diagnostics has already been issued (to STDERR), if + // that's not the case, it's a real pain to debug. So trace it. // + l4 ([&]{trace << "process " << args[0] << " " << e;}); + throw failed (); + } // Even if the user asked to suppress diagnostiscs, one error that we // want to let through is the inability to execute the program itself. |