From 2b1272f1c94ab1dbaf806af9c02ef866267ffed7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 9 May 2019 14:12:45 +0200 Subject: Generalize target/prerequisite var block, initial ad hoc target work Target/prerequisite-specific variable blocks can now be present even if there are prerequisites. For example, now instead of: exe{foo}: cxx{foo} exe{foo}: cc.loptions += ... Or: exe{foo}: cxx{foo} exe{foo}: { cc.loptions += ... cc.libs += ... } We can write: exe{foo}: cxx{foo} { cc.loptions += ... cc.libs += ... } This also works with dependency chains in which case the block applies to the set of prerequisites (note: not targets) before the last ':'. For example: ./: exe{foo}: libue{foo}: cxx{foo} { bin.whole = false # Applies to the libue{foo} prerequisite. } --- build2/lexer.cxx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'build2/lexer.cxx') diff --git a/build2/lexer.cxx b/build2/lexer.cxx index 66f50b0..8287640 100644 --- a/build2/lexer.cxx +++ b/build2/lexer.cxx @@ -39,8 +39,8 @@ namespace build2 { case lexer_mode::normal: { - s1 = ":=+ $(){}[]#\t\n"; - s2 = " = "; + s1 = ":<>=+ $(){}[]#\t\n"; + s2 = " = "; break; } case lexer_mode::value: @@ -205,10 +205,25 @@ namespace build2 } } + // The following characters are special in the normal mode. + // + if (m == lexer_mode::normal) + { + // NOTE: remember to update mode() if adding new special characters. + // + switch (c) + { + case '<': return make_token (type::labrace); + case '>': return make_token (type::rabrace); + } + } + // The following characters are special in the buildspec mode. // if (m == lexer_mode::buildspec) { + // NOTE: remember to update mode() if adding new special characters. + // switch (c) { case ',': return make_token (type::comma); -- cgit v1.1