From 6362c4e4eda8340eedc73dfdbf6b92b281ccbadd Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 10 Mar 2017 11:51:24 +0200 Subject: Implement support for wildcard patterns --- build2/test/script/parser.cxx | 45 ++++++++++++++++++++++++++++++++++++++----- build2/test/target.cxx | 23 ++++++++++++++++++++++ 2 files changed, 63 insertions(+), 5 deletions(-) (limited to 'build2/test') diff --git a/build2/test/script/parser.cxx b/build2/test/script/parser.cxx index 4e6759f..fd21a58 100644 --- a/build2/test/script/parser.cxx +++ b/build2/test/script/parser.cxx @@ -73,6 +73,8 @@ namespace build2 include_set_ = &ins; scope_ = nullptr; + //@@ PAT TODO: set pbase_? + // Start location of the implied script group is the beginning of // the file. End location -- end of the file. // @@ -968,7 +970,11 @@ namespace build2 if (tt != type::newline) { pre_parse_ = false; - args = parse_names (t, tt, false, "directive argument", nullptr); + args = parse_names (t, tt, + pattern_mode::expand, + false, + "directive argument", + nullptr); pre_parse_ = true; } @@ -1275,8 +1281,15 @@ namespace build2 // attributes_push (t, tt, true); + // @@ PAT: Should we expand patterns? Note that it will only be + // simple ones since we have disabled {}. Also, what would be the + // pattern base directory? + // return tt != type::newline && tt != type::semi - ? parse_value (t, tt, "variable value", nullptr) + ? parse_value (t, tt, + pattern_mode::ignore, + "variable value", + nullptr) : value (names ()); } @@ -2165,8 +2178,17 @@ namespace build2 // Note that we do it in the chunking mode to detect whether // anything in each chunk is quoted. // + // @@ PAT: should we support pattern expansion? This is even + // fuzzier than the variable case above. Though this is the + // shell semantics. Think what happens when we do rm *.txt? + // reset_quoted (t); - parse_names (t, tt, ns, true, "command line", nullptr); + parse_names (t, tt, + ns, + pattern_mode::ignore, + true, + "command line", + nullptr); if (pre_parse_) // Nothing else to do if we are pre-parsing. break; @@ -2404,7 +2426,11 @@ namespace build2 // next (t, tt); location l (get_location (t)); - names ns (parse_names (t, tt, true, "exit status", nullptr)); + names ns (parse_names (t, tt, + pattern_mode::ignore, + true, + "exit status", + nullptr)); unsigned long es (256); if (!pre_parse_) @@ -2570,8 +2596,15 @@ namespace build2 // Expand the line (can be blank). // + // @@ PAT: one could argue that if we do it in variables, then we + // should do it here as well. Though feels bizarre. + // names ns (tt != type::newline - ? parse_names (t, tt, false, "here-document line", nullptr) + ? parse_names (t, tt, + pattern_mode::ignore, + false, + "here-document line", + nullptr) : names ()); if (!pre_parse_) @@ -2819,6 +2852,8 @@ namespace build2 include_set_ = nullptr; scope_ = ≻ + //@@ PAT TODO: set pbase_? + exec_scope_body (); } diff --git a/build2/test/target.cxx b/build2/test/target.cxx index 3bf00c1..b6f9854 100644 --- a/build2/test/target.cxx +++ b/build2/test/target.cxx @@ -34,12 +34,35 @@ namespace build2 return *tk.name == "testscript" ? string () : "test"; } + static bool + testscript_target_pattern (const target_type&, + const scope&, + string& v, + bool r) + { + size_t p (path::traits::find_extension (v)); + + if (r) + { + assert (p != string::npos); + v.resize (p); + } + else if (p == string::npos && v != "testscript") + { + v += ".test"; + return true; + } + + return false; + } + const target_type testscript::static_type { "test", &file::static_type, &testscript_factory, &testscript_target_extension, + &testscript_target_pattern, nullptr, &search_file, false -- cgit v1.1