return false;
// Do @ -> builddir substitution.
- size_t ofs;
- while ((ofs = value->find('@')) != string::npos) {
+ // XXX hack: we don't want to eat @ in arguments, so only do the
+ // substitution after a space.
+ size_t ofs = 0;
+ while ((ofs = value->find('@', ofs)) != string::npos) {
+ if (ofs > 0 && (*value)[ofs - 1] != ' ') {
+ ++ofs;
+ continue;
+ }
value->replace(ofs, 1, builddir_);
ofs += builddir_.size();
}
"rule cat\n"
" command = cat @otherfile $in > $out\n"
"build @bin: cat @a.o\n"
-"build @a.o: cat a.cc\n"));
+"build @a.o: cat a.cc\n"
+"multiple_ats = @foo bar@@baz\n"));
EXPECT_EQ("foo", state.bindings_.LookupVariable("default_test"));
ASSERT_TRUE(state.LookupNode("out/a.o"));
const Rule* rule = state.LookupRule("cat");
ASSERT_TRUE(rule);
EXPECT_EQ("cat out/otherfile $in > $out", rule->command_.unparsed());
+ EXPECT_EQ("out/foo bar@@baz", state.bindings_.LookupVariable("multiple_ats"));
}
TEST_F(ParserTest, BuildDirRoot) {