diff options
author | Karen Arutyunov <karen@codesynthesis.com> | 2020-06-03 16:38:23 +0300 |
---|---|---|
committer | Karen Arutyunov <karen@codesynthesis.com> | 2020-06-04 14:20:33 +0300 |
commit | d280946474568925016359be742b59fd6c000c52 (patch) | |
tree | 5b48a599c33f442867dfa32690e141883af0322d /libbuild2/build/script/parser.test.cxx | |
parent | f50d0d58c8eb659e803282e19cf15398e3a8e373 (diff) |
Properly handle diag directive in build script parser
Diffstat (limited to 'libbuild2/build/script/parser.test.cxx')
-rw-r--r-- | libbuild2/build/script/parser.test.cxx | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/libbuild2/build/script/parser.test.cxx b/libbuild2/build/script/parser.test.cxx index de3e839..7f2840d 100644 --- a/libbuild2/build/script/parser.test.cxx +++ b/libbuild2/build/script/parser.test.cxx @@ -73,6 +73,7 @@ namespace build2 // argv[0] [-l] // argv[0] -d // argv[0] -p + // argv[0] -g [<diag-name>] // // In the first form read the script from stdin and trace the script // execution to stdout using the custom print runner. @@ -83,6 +84,11 @@ namespace build2 // In the third form read the script from stdin, parse it and print // line tokens quoting information to stdout. // + // In the forth form read the script from stdin, parse it and print the + // low-verbosity script diagnostics name or custom low-verbosity + // diagnostics to stdout. If the script doesn't deduce any of them, then + // print the diagnostics and exit with non-zero code. + // // -l // Print the script line number for each executed expression. // @@ -97,6 +103,10 @@ namespace build2 // <quoting> := 'S' | 'D' | 'M' // <completeness> := 'C' | 'P' // + // -g + // Dump the low-verbosity script diagnostics name or custom + // low-verbosity diagnostics to stdout. + // int main (int argc, char* argv[]) { @@ -106,10 +116,12 @@ namespace build2 { run, dump, - print + print, + diag } m (mode::run); bool print_line (false); + optional<string> diag_name; for (int i (1); i != argc; ++i) { @@ -121,11 +133,22 @@ namespace build2 m = mode::dump; else if (a == "-p") m = mode::print; + else if (a == "-g") + m = mode::diag; else + { + if (m == mode::diag) + { + diag_name = move (a); + break; + } + assert (false); + } } - assert (m == mode::run || !print_line); + assert (!print_line || m == mode::run); + assert (!diag_name || m == mode::diag); // Fake build system driver, default verbosity. // @@ -164,7 +187,9 @@ namespace build2 script s (p.pre_parse (tt, cin, nm, 11 /* line */, - string ("test"), + (m != mode::diag + ? optional<string> ("test") + : move (diag_name)), location (nm, 10))); switch (m) @@ -176,6 +201,26 @@ namespace build2 p.execute (ctx.global_scope, ctx.global_scope, e, s, r); break; } + case mode::diag: + { + if (s.diag_name) + { + cout << "name: " << *s.diag_name << endl; + } + else + { + assert (s.diag_line); + + environment e (perform_update_id, tt, false /* temp_dir */); + + cout << "diag: " << p.execute_special (ctx.global_scope, + ctx.global_scope, + e, + *s.diag_line) << endl; + } + + break; + } case mode::dump: { dump (cout, "", s.lines); |