Lines Matching +full:build +full:- +full:pristine
7 // http://www.apache.org/licenses/LICENSE-2.0
15 #include "build.h"
29 return a->outputs_[0]->path() < b->outputs_[0]->path(); in cmp()
47 ret->push_back(edge); in FindWorkSorted()
50 sort(ret->begin(), ret->end(), CompareEdgesByOutput::cmp); in FindWorkSorted()
58 "build out: cat mid\n" in TEST_F()
59 "build mid: cat in\n")); in TEST_F()
60 GetNode("mid")->MarkDirty(); in TEST_F()
61 GetNode("out")->MarkDirty(); in TEST_F()
69 ASSERT_EQ("in", edge->inputs_[0]->path()); in TEST_F()
70 ASSERT_EQ("mid", edge->outputs_[0]->path()); in TEST_F()
79 ASSERT_EQ("mid", edge->inputs_[0]->path()); in TEST_F()
80 ASSERT_EQ("out", edge->outputs_[0]->path()); in TEST_F()
93 "build out: cat mid1 mid2\n" in TEST_F()
94 "build mid1 mid2: cat in\n")); in TEST_F()
95 GetNode("mid1")->MarkDirty(); in TEST_F()
96 GetNode("mid2")->MarkDirty(); in TEST_F()
97 GetNode("out")->MarkDirty(); in TEST_F()
122 "build out: cat b1 b2\n" in TEST_F()
123 "build b1: cat a1\n" in TEST_F()
124 "build b2: cat a2\n" in TEST_F()
125 "build a1 a2: cat in\n")); in TEST_F()
126 GetNode("a1")->MarkDirty(); in TEST_F()
127 GetNode("a2")->MarkDirty(); in TEST_F()
128 GetNode("b1")->MarkDirty(); in TEST_F()
129 GetNode("b2")->MarkDirty(); in TEST_F()
130 GetNode("out")->MarkDirty(); in TEST_F()
164 "build out: cat a1 a2\n" in TEST_F()
165 "build a1: cat mid\n" in TEST_F()
166 "build a2: cat mid\n" in TEST_F()
167 "build mid: cat in\n")); in TEST_F()
168 GetNode("mid")->MarkDirty(); in TEST_F()
169 GetNode("a1")->MarkDirty(); in TEST_F()
170 GetNode("a2")->MarkDirty(); in TEST_F()
171 GetNode("out")->MarkDirty(); in TEST_F()
205 GetNode("out1")->MarkDirty(); in TestPoolWithDepthOne()
206 GetNode("out2")->MarkDirty(); in TestPoolWithDepthOne()
216 ASSERT_EQ("in", edge->inputs_[0]->path()); in TestPoolWithDepthOne()
217 ASSERT_EQ("out1", edge->outputs_[0]->path()); in TestPoolWithDepthOne()
227 ASSERT_EQ("in", edge->inputs_[0]->path()); in TestPoolWithDepthOne()
228 ASSERT_EQ("out2", edge->outputs_[0]->path()); in TestPoolWithDepthOne()
247 "build out1: poolcat in\n" in TEST_F()
248 "build out2: poolcat in\n"); in TEST_F()
256 "build out1: poolcat in\n" in TEST_F()
257 "build out2: poolcat in\n"); in TEST_F()
272 "build out1: foocat in\n" in TEST_F()
273 "build out2: foocat in\n" in TEST_F()
274 "build out3: foocat in\n" in TEST_F()
275 "build outb1: bazcat in\n" in TEST_F()
276 "build outb2: bazcat in\n" in TEST_F()
277 "build outb3: bazcat in\n" in TEST_F()
279 "build allTheThings: cat out1 out2 out3 outb1 outb2 outb3\n" in TEST_F()
283 GetNode("out" + string(1, '1' + static_cast<char>(i)))->MarkDirty(); in TEST_F()
284 GetNode("outb" + string(1, '1' + static_cast<char>(i)))->MarkDirty(); in TEST_F()
286 GetNode("allTheThings")->MarkDirty(); in TEST_F()
297 ASSERT_EQ("in", edge->inputs_[0]->path()); in TEST_F()
299 ASSERT_EQ(base_name + string(1, '1' + (i % 2)), edge->outputs_[0]->path()); in TEST_F()
305 ASSERT_EQ("in", edge->inputs_[0]->path()); in TEST_F()
306 ASSERT_EQ("outb3", edge->outputs_[0]->path()); in TEST_F()
316 ASSERT_EQ("in", out3->inputs_[0]->path()); in TEST_F()
317 ASSERT_EQ("out3", out3->outputs_[0]->path()); in TEST_F()
333 ASSERT_EQ("allTheThings", last->outputs_[0]->path()); in TEST_F()
352 "build foo.cpp.obj: echo foo.cpp || foo.cpp\n" in TEST_F()
354 "build bar.cpp.obj: echo bar.cpp || bar.cpp\n" in TEST_F()
356 "build libfoo.a: echo foo.cpp.obj bar.cpp.obj\n" in TEST_F()
357 "build foo.cpp: gen_foo\n" in TEST_F()
358 "build bar.cpp: gen_bar\n" in TEST_F()
359 "build all: phony libfoo.a\n")); in TEST_F()
360 GetNode("foo.cpp")->MarkDirty(); in TEST_F()
361 GetNode("foo.cpp.obj")->MarkDirty(); in TEST_F()
362 GetNode("bar.cpp")->MarkDirty(); in TEST_F()
363 GetNode("bar.cpp.obj")->MarkDirty(); in TEST_F()
364 GetNode("libfoo.a")->MarkDirty(); in TEST_F()
365 GetNode("all")->MarkDirty(); in TEST_F()
377 ASSERT_EQ("foo.cpp", edge->outputs_[0]->path()); in TEST_F()
384 ASSERT_EQ("foo.cpp", edge->inputs_[0]->path()); in TEST_F()
385 ASSERT_EQ("foo.cpp", edge->inputs_[1]->path()); in TEST_F()
386 ASSERT_EQ("foo.cpp.obj", edge->outputs_[0]->path()); in TEST_F()
391 ASSERT_EQ("bar.cpp", edge->outputs_[0]->path()); in TEST_F()
398 ASSERT_EQ("bar.cpp", edge->inputs_[0]->path()); in TEST_F()
399 ASSERT_EQ("bar.cpp", edge->inputs_[1]->path()); in TEST_F()
400 ASSERT_EQ("bar.cpp.obj", edge->outputs_[0]->path()); in TEST_F()
407 ASSERT_EQ("foo.cpp.obj", edge->inputs_[0]->path()); in TEST_F()
408 ASSERT_EQ("bar.cpp.obj", edge->inputs_[1]->path()); in TEST_F()
409 ASSERT_EQ("libfoo.a", edge->outputs_[0]->path()); in TEST_F()
416 ASSERT_EQ("libfoo.a", edge->inputs_[0]->path()); in TEST_F()
417 ASSERT_EQ("all", edge->outputs_[0]->path()); in TEST_F()
433 "build out1: poolcat in\n" in TEST_F()
434 "build out2: poolcat in\n")); in TEST_F()
435 GetNode("out1")->MarkDirty(); in TEST_F()
436 GetNode("out2")->MarkDirty(); in TEST_F()
446 ASSERT_EQ("in", edge->inputs_[0]->path()); in TEST_F()
447 ASSERT_EQ("out1", edge->outputs_[0]->path()); in TEST_F()
457 ASSERT_EQ("in", edge->inputs_[0]->path()); in TEST_F()
458 ASSERT_EQ("out2", edge->outputs_[0]->path()); in TEST_F()
502 "build cat1: cat in1\n" in SetUp()
503 "build cat2: cat in1 in2\n" in SetUp()
504 "build cat12: cat cat1 cat2\n"); in SetUp()
518 /// Handy to check for NOOP builds, and higher-level rebuild tests.
571 bool build_res = builder.Build(&err); in RebuildTarget()
585 commands_ran_.push_back(edge->EvaluateCommand()); in StartCommand()
586 if (edge->rule().name() == "cat" || in StartCommand()
587 edge->rule().name() == "cat_rsp" || in StartCommand()
588 edge->rule().name() == "cat_rsp_out" || in StartCommand()
589 edge->rule().name() == "cc" || in StartCommand()
590 edge->rule().name() == "cp_multi_msvc" || in StartCommand()
591 edge->rule().name() == "cp_multi_gcc" || in StartCommand()
592 edge->rule().name() == "touch" || in StartCommand()
593 edge->rule().name() == "touch-interrupt" || in StartCommand()
594 edge->rule().name() == "touch-fail-tick2") { in StartCommand()
595 for (vector<Node*>::iterator out = edge->outputs_.begin(); in StartCommand()
596 out != edge->outputs_.end(); ++out) { in StartCommand()
597 fs_->Create((*out)->path(), ""); in StartCommand()
599 } else if (edge->rule().name() == "true" || in StartCommand()
600 edge->rule().name() == "fail" || in StartCommand()
601 edge->rule().name() == "interrupt" || in StartCommand()
602 edge->rule().name() == "console") { in StartCommand()
604 } else if (edge->rule().name() == "cp") { in StartCommand()
605 assert(!edge->inputs_.empty()); in StartCommand()
606 assert(edge->outputs_.size() == 1); in StartCommand()
609 if (fs_->ReadFile(edge->inputs_[0]->path(), &content, &err) == in StartCommand()
611 fs_->WriteFile(edge->outputs_[0]->path(), content); in StartCommand()
612 } else if (edge->rule().name() == "touch-implicit-dep-out") { in StartCommand()
613 string dep = edge->GetBinding("test_dependency"); in StartCommand()
614 fs_->Create(dep, ""); in StartCommand()
615 fs_->Tick(); in StartCommand()
616 for (vector<Node*>::iterator out = edge->outputs_.begin(); in StartCommand()
617 out != edge->outputs_.end(); ++out) { in StartCommand()
618 fs_->Create((*out)->path(), ""); in StartCommand()
620 } else if (edge->rule().name() == "touch-out-implicit-dep") { in StartCommand()
621 string dep = edge->GetBinding("test_dependency"); in StartCommand()
622 for (vector<Node*>::iterator out = edge->outputs_.begin(); in StartCommand()
623 out != edge->outputs_.end(); ++out) { in StartCommand()
624 fs_->Create((*out)->path(), ""); in StartCommand()
626 fs_->Tick(); in StartCommand()
627 fs_->Create(dep, ""); in StartCommand()
628 } else if (edge->rule().name() == "generate-depfile") { in StartCommand()
629 string dep = edge->GetBinding("test_dependency"); in StartCommand()
630 string depfile = edge->GetUnescapedDepfile(); in StartCommand()
632 for (vector<Node*>::iterator out = edge->outputs_.begin(); in StartCommand()
633 out != edge->outputs_.end(); ++out) { in StartCommand()
634 contents += (*out)->path() + ": " + dep + "\n"; in StartCommand()
635 fs_->Create((*out)->path(), ""); in StartCommand()
637 fs_->Create(depfile, contents); in StartCommand()
659 vector<Edge*>::iterator edge_iter = active_edges_.end() - 1; in WaitForCommand()
662 result->edge = edge; in WaitForCommand()
664 if (edge->rule().name() == "interrupt" || in WaitForCommand()
665 edge->rule().name() == "touch-interrupt") { in WaitForCommand()
666 result->status = ExitInterrupted; in WaitForCommand()
670 if (edge->rule().name() == "console") { in WaitForCommand()
671 if (edge->use_console()) in WaitForCommand()
672 result->status = ExitSuccess; in WaitForCommand()
674 result->status = ExitFailure; in WaitForCommand()
679 if (edge->rule().name() == "cp_multi_msvc") { in WaitForCommand()
680 const std::string prefix = edge->GetBinding("msvc_deps_prefix"); in WaitForCommand()
681 for (std::vector<Node*>::iterator in = edge->inputs_.begin(); in WaitForCommand()
682 in != edge->inputs_.end(); ++in) { in WaitForCommand()
683 result->output += prefix + (*in)->path() + '\n'; in WaitForCommand()
687 if (edge->rule().name() == "fail" || in WaitForCommand()
688 (edge->rule().name() == "touch-fail-tick2" && fs_->now_ == 2)) in WaitForCommand()
689 result->status = ExitFailure; in WaitForCommand()
691 result->status = ExitSuccess; in WaitForCommand()
696 const string& verify_active_edge = edge->GetBinding("verify_active_edge"); in WaitForCommand()
701 if (!(*i)->outputs_.empty() && in WaitForCommand()
702 (*i)->outputs_[0]->path() == verify_active_edge) { in WaitForCommand()
723 node->MarkDirty(); in Dirty()
727 if (!node->in_edge()) in Dirty()
728 node->MarkMissing(); in Dirty()
743 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
757 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
768 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
788 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
799 "build out1 out2: touch in.txt\n")); in TEST_F()
806 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
816 "build out | out.imp: touch in.txt\n")); in TEST_F()
822 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
829 // https://github.com/ninja-build/ninja/issues/148
834 "build in1 otherfile: touch in\n" in TEST_F()
835 "build out: touch in | in1\n")); in TEST_F()
844 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
850 "build c2: cat c1\n" in TEST_F()
851 "build c3: cat c2\n" in TEST_F()
852 "build c4: cat c3\n" in TEST_F()
853 "build c5: cat c4\n")); in TEST_F()
860 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
880 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
881 ASSERT_EQ(2u, command_runner_.commands_ran_.size()); // 3->4, 4->5 in TEST_F()
885 // Input is referenced by build file, but no rule for it. in TEST_F()
894 // Target is not referenced by build file. in TEST_F()
913 "build subdir\\dir2\\file: cat in1\n")); in TEST_F()
916 "build subdir/dir2/file: cat in1\n")); in TEST_F()
921 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
932 "build fo$ o.o: cc foo.c\n")); in TEST_F()
946 "build foo.o: cc foo.c\n")); in TEST_F()
950 GetNode("bar.h")->MarkDirty(); // Mark bar.h as missing. in TEST_F()
961 ASSERT_EQ(3u, edge->inputs_.size()); in TEST_F()
964 ASSERT_EQ("cc foo.c", edge->EvaluateCommand()); in TEST_F()
971 "build foo.o: cc foo.c\n")); in TEST_F()
983 "build c: touch\n" in TEST_F()
984 "build b: touch || c\n" in TEST_F()
985 "build a: touch | b || c\n")); in TEST_F()
987 vector<Edge*> c_out = GetNode("c")->out_edges(); in TEST_F()
989 EXPECT_EQ("b", c_out[0]->outputs_[0]->path()); in TEST_F()
990 EXPECT_EQ("a", c_out[1]->outputs_[0]->path()); in TEST_F()
996 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1005 "build foo.o: cc foo.c || otherfile\n")); in TEST_F()
1015 ASSERT_EQ(4u, edge->inputs_.size()); in TEST_F()
1016 EXPECT_EQ(2, edge->implicit_deps_); in TEST_F()
1017 EXPECT_EQ(1, edge->order_only_deps_); in TEST_F()
1020 EXPECT_EQ("foo.c", edge->inputs_[0]->path()); in TEST_F()
1021 EXPECT_EQ("blah.h", edge->inputs_[1]->path()); in TEST_F()
1022 EXPECT_EQ("bar.h", edge->inputs_[2]->path()); in TEST_F()
1023 EXPECT_EQ("otherfile", edge->inputs_[3]->path()); in TEST_F()
1026 ASSERT_EQ("cc foo.c", edge->EvaluateCommand()); in TEST_F()
1029 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1035 // Recreate the depfile, as it should have been deleted by the build. in TEST_F()
1044 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1050 // Recreate the depfile, as it should have been deleted by the build. in TEST_F()
1066 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1076 "build oo.h: cc oo.h.in\n" in TEST_F()
1077 "build foo.o: cc foo.c || oo.h\n")); in TEST_F()
1082 // foo.o and order-only dep dirty, build both. in TEST_F()
1084 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1095 // order-only dep missing, build it only. in TEST_F()
1100 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1107 // order-only dep dirty, build it only. in TEST_F()
1112 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1124 "build gen/stuff\\things/foo.o: cc x\\y/z\\foo.c\n")); in TEST_F()
1128 GetNode("bar.h")->MarkDirty(); // Mark bar.h as missing. in TEST_F()
1142 ASSERT_EQ(3u, edge->inputs_.size()); in TEST_F()
1146 ASSERT_EQ("cc x\\y/z\\foo.c", edge->EvaluateCommand()); in TEST_F()
1153 "build out: cat bar.cc\n" in TEST_F()
1154 "build all: phony out\n")); in TEST_F()
1162 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1170 "build out: cat bar.cc\n" in TEST_F()
1171 "build all: phony out\n")); in TEST_F()
1180 // Test a self-referencing phony. Ideally this should not work, but
1186 "build a: phony a\n")); in TEST_F()
1214 State& state_ = t->state_; in TestPhonyUseCase()
1215 Builder& builder_ = t->builder_; in TestPhonyUseCase()
1216 FakeCommandRunner& command_runner_ = t->command_runner_; in TestPhonyUseCase()
1217 VirtualFileSystem& fs_ = t->fs_; in TestPhonyUseCase()
1223 "build notreal: phony blank\n" in TestPhonyUseCase()
1224 "build phony1: phony notreal\n" in TestPhonyUseCase()
1225 "build phony2: phony\n" in TestPhonyUseCase()
1226 "build phony3: phony blank\n" in TestPhonyUseCase()
1227 "build phony4: phony notreal\n" in TestPhonyUseCase()
1228 "build phony5: phony\n" in TestPhonyUseCase()
1229 "build phony6: phony blank\n" in TestPhonyUseCase()
1231 "build test1: touch phony1\n" in TestPhonyUseCase()
1232 "build test2: touch phony2\n" in TestPhonyUseCase()
1233 "build test3: touch phony3\n" in TestPhonyUseCase()
1234 "build test4: touch phony4\n" in TestPhonyUseCase()
1235 "build test5: touch phony5\n" in TestPhonyUseCase()
1236 "build test6: touch phony6\n" in TestPhonyUseCase()
1256 EXPECT_TRUE(builder_.Build(&err)); in TestPhonyUseCase()
1264 Node* testNode = t->GetNode("test" + ci); in TestPhonyUseCase()
1265 Node* phonyNode = t->GetNode("phony" + ci); in TestPhonyUseCase()
1266 Node* inputNode = t->GetNode("blank"); in TestPhonyUseCase()
1271 // Build number 1 in TestPhonyUseCase()
1275 EXPECT_TRUE(builder_.Build(&err)); in TestPhonyUseCase()
1286 // Second build, expect testN edge to be rebuilt in TestPhonyUseCase()
1289 EXPECT_TRUE(builder_.Build(&err)); in TestPhonyUseCase()
1295 TimeStamp inputTime = inputNode->mtime(); in TestPhonyUseCase()
1297 EXPECT_FALSE(phonyNode->exists()); in TestPhonyUseCase()
1298 EXPECT_FALSE(phonyNode->dirty()); in TestPhonyUseCase()
1300 EXPECT_GT(phonyNode->mtime(), startTime); in TestPhonyUseCase()
1301 EXPECT_EQ(phonyNode->mtime(), inputTime); in TestPhonyUseCase()
1302 ASSERT_TRUE(testNode->Stat(&fs_, &err)); in TestPhonyUseCase()
1303 EXPECT_TRUE(testNode->exists()); in TestPhonyUseCase()
1304 EXPECT_GT(testNode->mtime(), startTime); in TestPhonyUseCase()
1315 EXPECT_TRUE(builder_.Build(&err)); in TestPhonyUseCase()
1325 EXPECT_TRUE(builder_.Build(&err)); in TestPhonyUseCase()
1343 "build out1: fail\n")); in TEST_F()
1349 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
1358 "build out1: fail\n" in TEST_F()
1359 "build out2: fail\n" in TEST_F()
1360 "build out3: fail\n" in TEST_F()
1361 "build all: phony out1 out2 out3\n")); in TEST_F()
1370 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
1379 "build out1: fail\n" in TEST_F()
1380 "build out2: fail\n" in TEST_F()
1381 "build out3: fail\n" in TEST_F()
1382 "build final: cat out1 out2 out3\n")); in TEST_F()
1391 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
1403 "build out1: fail\n" in TEST_F()
1404 "build out2: fail\n" in TEST_F()
1405 "build out3: fail\n" in TEST_F()
1406 "build final: cat out1 out2 out3\n")); in TEST_F()
1415 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
1432 "build B.d.stamp: cc | x\n" in TEST_F()
1433 "build C.stamp: touch B.d.stamp\n" in TEST_F()
1434 "build final.stamp: touch || C.stamp\n"; in TEST_F()
1442 EXPECT_GE(save_state.LookupPool("some_pool")->current_use(), 0); in TEST_F()
1458 "build out.imp: touch | in\n")); in TEST_F()
1468 EXPECT_TRUE(GetNode("out.imp")->dirty()); in TEST_F()
1473 "rule touch-implicit-dep-out\n" in TEST_F()
1476 "build out.imp: touch-implicit-dep-out | inimp inimp2\n" in TEST_F()
1489 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1499 EXPECT_FALSE(GetNode("out.imp")->dirty()); in TEST_F()
1506 "build out1: cc in\n")); in TEST_F()
1514 // Because it's not in the log, it should not be up-to-date until in TEST_F()
1515 // we build again. in TEST_F()
1523 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1529 "rule touch-fail-tick2\n" in TEST_F()
1530 " command = touch-fail-tick2\n" in TEST_F()
1531 "build out1: touch-fail-tick2 in\n")); in TEST_F()
1539 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1553 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
1567 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1576 "build out1: touch\n" in TEST_F()
1577 "build out2: touch in\n")); in TEST_F()
1585 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1598 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1611 "build out1: cc in\n" in TEST_F()
1612 "build out2: true out1\n" in TEST_F()
1613 "build out3: cat out2\n")); in TEST_F()
1623 // Do a pre-build so that there's commands in the log for the outputs, in TEST_F()
1624 // otherwise, the lack of an entry in the build log will cause out3 to rebuild in TEST_F()
1629 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1639 // "cc" touches out1, so we should build out2. But because "true" does not in TEST_F()
1640 // touch out2, we should cancel the build of out3. in TEST_F()
1643 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1646 // If we run again, it should be a no-op, because the build log has recorded in TEST_F()
1658 // The build log entry should not, however, prevent us from rebuilding out2 in TEST_F()
1664 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1679 "build out1: true in\n" in TEST_F()
1680 "build out2: cc out1\n")); in TEST_F()
1685 // Do a pre-build so that there's commands in the log for the outputs, in TEST_F()
1686 // otherwise, the lack of an entry in the build log will cause out2 to rebuild in TEST_F()
1691 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1700 // Run a build, expect only the first command to run. in TEST_F()
1702 // we shouldn't run the dependent build. in TEST_F()
1705 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1716 "build out1: true in\n" in TEST_F()
1717 "build out2 out3: touch out1\n" in TEST_F()
1718 "build out4: touch out2\n" in TEST_F()
1727 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1737 // Then, since out2 is rebuilt, out4 should be rebuilt -- the restat on the in TEST_F()
1744 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1750 // https://github.com/ninja-build/ninja/issues/295
1759 "build out1: true in\n" in TEST_F()
1760 "build out2: cc out1\n")); in TEST_F()
1772 // Run the build, out1 and out2 get built in TEST_F()
1776 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1783 ASSERT_EQ(restat_mtime, log_entry->mtime); in TEST_F()
1789 // Trigger the build again - only out1 gets built in TEST_F()
1794 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1800 ASSERT_EQ(restat_mtime, log_entry->mtime); in TEST_F()
1805 "rule generate-depfile\n" in TEST_F()
1807 "build out: generate-depfile\n" in TEST_F()
1818 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1844 "build out1: cc in\n" in TEST_F()
1845 "build out2: true out1\n" in TEST_F()
1846 "build out3: cat out2\n")); in TEST_F()
1856 // "cc" touches out1, so we should build out2. But because "true" does not in TEST_F()
1857 // touch out2, we should cancel the build of out3. in TEST_F()
1861 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1878 "build out1: cat in\n" in TEST_F()
1879 "build out2: cat_rsp in\n" in TEST_F()
1882 "build out$ 3: cat_rsp_out in\n" in TEST_F()
1904 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1925 "build out: fail in\n" in TEST_F()
1940 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
1964 "build out: cat_rsp in\n" in TEST_F()
1976 // 1. Build for the 1st time (-> populate log) in TEST_F()
1977 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
1980 // 2. Build again (no change) in TEST_F()
1993 log_entry->command_hash)); in TEST_F()
1994 log_entry->command_hash++; // Change the command hash to something else. in TEST_F()
2000 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2008 "rule touch-interrupt\n" in TEST_F()
2009 " command = touch-interrupt\n" in TEST_F()
2010 "build out1: interrupt in1\n" in TEST_F()
2011 "build out2: touch-interrupt in2\n")); in TEST_F()
2023 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
2032 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
2041 ("build " + kTooLongToStat + ": cat in\n").c_str())); in TEST_F()
2045 fs_.files_[kTooLongToStat].mtime = -1; in TEST_F()
2055 "build nonexistent: phony\n" in TEST_F()
2056 "build out1: cat || nonexistent\n" in TEST_F()
2057 "build out2: cat nonexistent\n")); in TEST_F()
2062 // order-only dependency has nothing to do. in TEST_F()
2074 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2084 "build out: cc\n")); in TEST_F()
2092 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
2111 "build bad_deps.o: cat in1\n" in TEST_F()
2123 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
2150 /// Test a MSVC-style deps log with multiple outputs.
2157 "build out1 out2: cp_multi_msvc in1\n")); in TEST_F()
2162 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2169 EXPECT_EQ(1, out1_deps->node_count); in TEST_F()
2170 EXPECT_EQ("in1", out1_deps->nodes[0]->path()); in TEST_F()
2174 EXPECT_EQ(1, out2_deps->node_count); in TEST_F()
2175 EXPECT_EQ("in1", out2_deps->nodes[0]->path()); in TEST_F()
2178 /// Test a GCC-style deps log with multiple outputs.
2185 "build out1 out2: cp_multi_gcc in1 in2\n")); in TEST_F()
2191 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2198 EXPECT_EQ(2, out1_deps->node_count); in TEST_F()
2199 EXPECT_EQ("in1", out1_deps->nodes[0]->path()); in TEST_F()
2200 EXPECT_EQ("in2", out1_deps->nodes[1]->path()); in TEST_F()
2204 EXPECT_EQ(2, out2_deps->node_count); in TEST_F()
2205 EXPECT_EQ("in1", out2_deps->nodes[0]->path()); in TEST_F()
2206 EXPECT_EQ("in2", out2_deps->nodes[1]->path()); in TEST_F()
2209 /// Test a GCC-style deps log with multiple outputs using a line per input.
2216 "build out1 out2: cp_multi_gcc in1 in2\n")); in TEST_F()
2222 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2229 EXPECT_EQ(2, out1_deps->node_count); in TEST_F()
2230 EXPECT_EQ("in1", out1_deps->nodes[0]->path()); in TEST_F()
2231 EXPECT_EQ("in2", out1_deps->nodes[1]->path()); in TEST_F()
2235 EXPECT_EQ(2, out2_deps->node_count); in TEST_F()
2236 EXPECT_EQ("in1", out2_deps->nodes[0]->path()); in TEST_F()
2237 EXPECT_EQ("in2", out2_deps->nodes[1]->path()); in TEST_F()
2240 /// Test a GCC-style deps log with multiple outputs using a line per output.
2247 "build out1 out2: cp_multi_gcc in1 in2\n")); in TEST_F()
2253 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2260 EXPECT_EQ(2, out1_deps->node_count); in TEST_F()
2261 EXPECT_EQ("in1", out1_deps->nodes[0]->path()); in TEST_F()
2262 EXPECT_EQ("in2", out1_deps->nodes[1]->path()); in TEST_F()
2266 EXPECT_EQ(2, out2_deps->node_count); in TEST_F()
2267 EXPECT_EQ("in1", out2_deps->nodes[0]->path()); in TEST_F()
2268 EXPECT_EQ("in2", out2_deps->nodes[1]->path()); in TEST_F()
2271 /// Test a GCC-style deps log with multiple outputs mentioning only the main output.
2278 "build out1 out2: cp_multi_gcc in1 in2\n")); in TEST_F()
2284 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2291 EXPECT_EQ(2, out1_deps->node_count); in TEST_F()
2292 EXPECT_EQ("in1", out1_deps->nodes[0]->path()); in TEST_F()
2293 EXPECT_EQ("in2", out1_deps->nodes[1]->path()); in TEST_F()
2297 EXPECT_EQ(2, out2_deps->node_count); in TEST_F()
2298 EXPECT_EQ("in1", out2_deps->nodes[0]->path()); in TEST_F()
2299 EXPECT_EQ("in2", out2_deps->nodes[1]->path()); in TEST_F()
2302 /// Test a GCC-style deps log with multiple outputs mentioning only the secondary output.
2304 // Note: This ends up short-circuiting the node creation due to the primary in TEST_F()
2311 "build out1 out2: cp_multi_gcc in1 in2\n")); in TEST_F()
2317 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2324 EXPECT_EQ(2, out1_deps->node_count); in TEST_F()
2325 EXPECT_EQ("in1", out1_deps->nodes[0]->path()); in TEST_F()
2326 EXPECT_EQ("in2", out1_deps->nodes[1]->path()); in TEST_F()
2330 EXPECT_EQ(2, out2_deps->node_count); in TEST_F()
2331 EXPECT_EQ("in1", out2_deps->nodes[0]->path()); in TEST_F()
2332 EXPECT_EQ("in2", out2_deps->nodes[1]->path()); in TEST_F()
2337 /// builder_ it sets up, because we want pristine objects for
2338 /// each build.
2358 /// Run a straightforward build where the deps log is used.
2363 "build out: cat in1\n" in TEST_F()
2371 // Run the build once, everything should be ok. in TEST_F()
2381 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2401 // Run the build again. in TEST_F()
2411 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2423 /// 1) Run a successful build where everything has time t, record deps.
2424 /// 2) Move input/output to time t+1 -- despite files in alignment,
2430 "build out: cat in1\n" in TEST_F()
2434 // Run an ordinary build that gathers dependencies. in TEST_F()
2442 // Run the build once, everything should be ok. in TEST_F()
2451 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2482 // Recreate the deps file here because the build expects them to exist. in TEST_F()
2485 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2498 "build out: cat in1\n" in TEST_F()
2519 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2529 " command = true\n" // Would be "write if out-of-date" in reality. in TEST_F()
2531 "build header.h: true header.in\n" in TEST_F()
2532 "build out: cat in1\n" in TEST_F()
2543 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2554 " command = true\n" // Would be "write if out-of-date" in reality. in TEST_F()
2556 "build header.h: true header.in\n" in TEST_F()
2557 "build out: cat in1\n" in TEST_F()
2565 // Run the build once, everything should be ok. in TEST_F()
2575 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2591 // Run the build again. in TEST_F()
2601 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2604 // Rule "true" should have run again, but the build of "out" should have in TEST_F()
2616 "build fo$ o.o: cc foo.c\n"; in TEST_F()
2624 // Run the build once, everything should be ok. in TEST_F()
2634 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2655 state.GetNode("bar.h", 0)->MarkDirty(); // Mark bar.h as missing. in TEST_F()
2663 ASSERT_EQ(3u, edge->inputs_.size()); in TEST_F()
2666 ASSERT_EQ("cc foo.c", edge->EvaluateCommand()); in TEST_F()
2676 "rule touch-out-implicit-dep\n" in TEST_F()
2678 "rule generate-depfile\n" in TEST_F()
2680 "build out1: touch-out-implicit-dep in1\n" in TEST_F()
2682 "build out2: generate-depfile in1 || out1\n" in TEST_F()
2705 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2729 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2762 "build a/b\\c\\d/e/fo$ o.o: cc x\\y/z\\foo.c\n"; in TEST_F()
2770 // Run the build once, everything should be ok. in TEST_F()
2782 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
2803 state.GetNode("bar.h", 0)->MarkDirty(); // Mark bar.h as missing. in TEST_F()
2811 ASSERT_EQ(3u, edge->inputs_.size()); in TEST_F()
2815 ASSERT_EQ("cc x\\y/z\\foo.c", edge->EvaluateCommand()); in TEST_F()
2824 /// Follows from: https://github.com/ninja-build/ninja/issues/603
2828 " command = true\n" // Would be "write if out-of-date" in reality. in TEST_F()
2830 "build header.h: true header.in\n" in TEST_F()
2831 "build out: cat header.h\n" in TEST_F()
2848 /// https://github.com/ninja-build/ninja/issues/603
2853 " command = true\n" // Would be "write if out-of-date" in reality. in TEST_F()
2855 "build header.h: true header.in\n" in TEST_F()
2856 "build out: cat header.h\n" in TEST_F()
2860 // Build once to populate ninja deps logs from out.d in TEST_F()
2882 // Sanity: this build should be NOOP in TEST_F()
2894 // And this build should be NOOP again in TEST_F()
2905 "build foo.o: cc foo.c\n"; in TEST_F()
2921 "build cons: console in.txt\n")); in TEST_F()
2928 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2935 // has no rule to build it. in TEST_F()
2939 "build out: touch || dd\n" in TEST_F()
2955 "build tmp: touch || dd\n" in TEST_F()
2957 "build out: touch || dd\n" in TEST_F()
2962 "build out | out.imp: dyndep | tmp.imp\n" in TEST_F()
2963 "build tmp | tmp.imp: dyndep\n" in TEST_F()
2969 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
2982 "build out: touch || dd\n" in TEST_F()
2986 "build out: dyndep\n" in TEST_F()
3000 "build out: r in || dd\n" in TEST_F()
3002 "build in: r circ\n" in TEST_F()
3006 "build out | circ: dyndep\n" in TEST_F()
3012 EXPECT_EQ("dependency cycle: circ -> in -> circ", err); in TEST_F()
3022 "build dd: cp dd-in\n" in TEST_F()
3023 "build out: touch || dd\n" in TEST_F()
3026 fs_.Create("dd-in", in TEST_F()
3028 "build out: dyndep\n" in TEST_F()
3036 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3040 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3043 EXPECT_EQ("dd-in", fs_.files_read_[0]); in TEST_F()
3058 "build dd: cp dd-in\n" in TEST_F()
3059 "build out: touch || dd\n" in TEST_F()
3062 fs_.Create("dd-in", in TEST_F()
3063 "build out: dyndep\n" in TEST_F()
3070 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
3082 "build dd: cp dd-in\n" in TEST_F()
3083 "build unrelated: touch || dd\n" in TEST_F()
3084 "build out: touch unrelated || dd\n" in TEST_F()
3087 fs_.Create("dd-in", in TEST_F()
3089 "build out: dyndep\n" in TEST_F()
3098 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3101 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3114 "build dd: cp dd-in\n" in TEST_F()
3115 "build out: touch in || dd\n" in TEST_F()
3119 fs_.Create("dd-in", in TEST_F()
3121 "build out | out.imp: dyndep\n" in TEST_F()
3130 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3133 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3145 "build dd: cp dd-in\n" in TEST_F()
3146 "build out1 | out-twice.imp: touch in\n" in TEST_F()
3147 "build out2: touch in || dd\n" in TEST_F()
3151 fs_.Create("dd-in", in TEST_F()
3153 "build out2 | out-twice.imp: dyndep\n" in TEST_F()
3164 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
3165 EXPECT_EQ("multiple rules generate out-twice.imp", err); in TEST_F()
3177 "build dd1: cp dd1-in\n" in TEST_F()
3178 "build out1: touch || dd1\n" in TEST_F()
3180 "build dd2: cp dd2-in || dd1\n" // make order predictable for test in TEST_F()
3181 "build out2: touch || dd2\n" in TEST_F()
3186 fs_.Create("dd1-in", in TEST_F()
3188 "build out1 | out-twice.imp: dyndep\n" in TEST_F()
3190 fs_.Create("dd2-in", ""); in TEST_F()
3193 "build out2 | out-twice.imp: dyndep\n" in TEST_F()
3204 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
3205 EXPECT_EQ("multiple rules generate out-twice.imp", err); in TEST_F()
3216 "build dd: cp dd-in\n" in TEST_F()
3217 "build in: touch\n" in TEST_F()
3218 "build out: touch || dd\n" in TEST_F()
3221 fs_.Create("dd-in", in TEST_F()
3223 "build out: dyndep | in\n" in TEST_F()
3232 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3235 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3248 "build dd: cp dd-in\n" in TEST_F()
3249 "build out: touch || dd\n" in TEST_F()
3252 fs_.Create("dd-in", in TEST_F()
3254 "build out: dyndep |@ validation\n" in TEST_F()
3261 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
3275 "build dd: cp dd-in\n" in TEST_F()
3276 "build in: touch |@ validation\n" in TEST_F()
3277 "build validation: touch in out\n" in TEST_F()
3278 "build out: touch || dd\n" in TEST_F()
3281 fs_.Create("dd-in", in TEST_F()
3283 "build out: dyndep | in\n" in TEST_F()
3292 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3295 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3310 "build dd: cp dd-in\n" in TEST_F()
3311 "build tmp: touch || dd\n" in TEST_F()
3313 "build out: touch || dd\n" in TEST_F()
3316 fs_.Create("dd-in", in TEST_F()
3318 "build out | out.imp: dyndep | tmp.imp\n" in TEST_F()
3319 "build tmp | tmp.imp: dyndep\n" in TEST_F()
3325 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3328 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3342 "build dd: cp dd-in\n" in TEST_F()
3343 "build tmp: touch || dd\n" in TEST_F()
3345 "build out: cp tmp\n" in TEST_F()
3349 fs_.Create("dd-in", in TEST_F()
3351 "build tmp | tmp.imp: dyndep\n" in TEST_F()
3359 ASSERT_TRUE(GetNode("tmp.imp")->in_edge()->is_phony()); in TEST_F()
3361 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3365 ASSERT_FALSE(GetNode("tmp.imp")->in_edge()->is_phony()); in TEST_F()
3368 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3383 "build dd: cp dd-in\n" in TEST_F()
3384 "build tmp: touch || dd\n" in TEST_F()
3386 "build out: touch tmp || dd\n" in TEST_F()
3391 fs_.Create("dd-in", in TEST_F()
3393 "build out: dyndep\n" in TEST_F()
3394 "build tmp | tmp.imp: dyndep\n" in TEST_F()
3400 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3403 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3416 "build dd: cp dd-in\n" in TEST_F()
3417 "build tmp: touch || dd\n" in TEST_F()
3419 "build out: touch tmp\n" in TEST_F()
3423 fs_.Create("dd-in", in TEST_F()
3425 "build tmp | tmp.imp: dyndep\n" in TEST_F()
3431 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3434 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3447 "build dd: cp dd-in\n" in TEST_F()
3448 "build out: r in || dd\n" in TEST_F()
3451 "build in: r || dd\n" in TEST_F()
3455 fs_.Create("dd-in", in TEST_F()
3457 "build out | circ: dyndep\n" in TEST_F()
3458 "build in: dyndep | circ\n" in TEST_F()
3466 EXPECT_FALSE(builder_.Build(&err)); in TEST_F()
3469 EXPECT_TRUE(err == "dependency cycle: circ -> in -> circ" || in TEST_F()
3470 err == "dependency cycle: in -> circ -> in"); in TEST_F()
3481 "build dd: cp dd-in\n" in TEST_F()
3482 "build out1: true in || dd\n" in TEST_F()
3484 "build out2: cat out1\n")); in TEST_F()
3488 fs_.Create("dd-in", in TEST_F()
3490 "build out1: dyndep\n" in TEST_F()
3496 // Do a pre-build so that there's commands in the log for the outputs, in TEST_F()
3497 // otherwise, the lack of an entry in the build log will cause "out2" to in TEST_F()
3502 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3505 EXPECT_EQ("cp dd-in dd", command_runner_.commands_ran_[0]); in TEST_F()
3514 // We touched "in", so we should build "out1". But because "true" does not in TEST_F()
3515 // touch "out1", we should cancel the build of "out2". in TEST_F()
3518 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3526 // been scheduled but not finished. We should not re-schedule it. in TEST_F()
3532 "build out1 | out1.imp: touch\n" in TEST_F()
3533 "build zdd: cp zdd-in\n" in TEST_F()
3535 "build out2: cp out1 || zdd\n" in TEST_F()
3538 fs_.Create("zdd-in", in TEST_F()
3540 "build out2: dyndep | out1.imp\n" in TEST_F()
3547 // During the build "out1" and "zdd" should be built concurrently. in TEST_F()
3553 // re-schedule the already-active edge. in TEST_F()
3559 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3565 command_runner_.commands_ran_[1] == "cp zdd-in zdd") || in TEST_F()
3567 command_runner_.commands_ran_[0] == "cp zdd-in zdd")); in TEST_F()
3579 "build dd1: cp dd1-in\n" in TEST_F()
3580 "build out1 | out1.imp: touch || dd1\n" in TEST_F()
3582 "build dd2: cp dd2-in || dd1\n" // direct order-only dep on dd1 in TEST_F()
3583 "build out2: touch || dd2\n" in TEST_F()
3589 fs_.Create("dd1-in", in TEST_F()
3591 "build out1: dyndep\n" in TEST_F()
3593 fs_.Create("dd2-in", ""); in TEST_F()
3596 "build out2 | out2.imp: dyndep | out1.imp\n" in TEST_F()
3599 // During the build dd1 should be built and loaded. The RecomputeDirty in TEST_F()
3601 // because the builder will never get a chance to update the build plan in TEST_F()
3603 // builder recognizes that it is now ready (as its order-only dependency in TEST_F()
3605 // file is loaded to update the build graph independently. in TEST_F()
3610 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3613 EXPECT_EQ("cp dd1-in dd1", command_runner_.commands_ran_[0]); in TEST_F()
3621 // files on which they (order-only) depend. in TEST_F()
3627 "build dd1: cp dd1-in\n" in TEST_F()
3628 "build out1: touch || dd1\n" in TEST_F()
3630 "build dd2: cp dd2-in || out1\n" // indirect order-only dep on dd1 in TEST_F()
3631 "build out2: touch || dd2\n" in TEST_F()
3637 fs_.Create("dd1-in", in TEST_F()
3639 "build out1 | out1.imp: dyndep\n" in TEST_F()
3641 fs_.Create("dd2-in", ""); in TEST_F()
3644 "build out2 | out2.imp: dyndep | out1.imp\n" in TEST_F()
3647 // During the build dd1 should be built and loaded. Then dd2 should in TEST_F()
3655 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3658 EXPECT_EQ("cp dd1-in dd1", command_runner_.commands_ran_[0]); in TEST_F()
3671 "build dd0: cp dd0-in\n" in TEST_F()
3672 "build dd1: cp dd1-in\n" in TEST_F()
3673 "build in: touch\n" in TEST_F()
3674 "build tmp: touch || dd0\n" in TEST_F()
3676 "build out: touch || dd1\n" in TEST_F()
3679 fs_.Create("dd1-in", in TEST_F()
3681 "build out: dyndep | tmp\n" in TEST_F()
3683 fs_.Create("dd0-in", ""); in TEST_F()
3686 "build tmp: dyndep | in\n" in TEST_F()
3695 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3698 EXPECT_EQ("cp dd1-in dd1", command_runner_.commands_ran_[0]); in TEST_F()
3712 "build dd0: cp dd0-in\n" in TEST_F()
3713 "build dd1: cp dd1-in\n" in TEST_F()
3714 "build in: touch\n" in TEST_F()
3715 "build tmp: touch || dd0\n" in TEST_F()
3717 "build out: touch || dd1\n" in TEST_F()
3720 fs_.Create("dd1-in", in TEST_F()
3722 "build out: dyndep | tmp\n" in TEST_F()
3724 fs_.Create("dd0-in", in TEST_F()
3726 "build tmp: dyndep | in\n" in TEST_F()
3735 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3738 EXPECT_EQ("cp dd1-in dd1", command_runner_.commands_ran_[0]); in TEST_F()
3739 EXPECT_EQ("cp dd0-in dd0", command_runner_.commands_ran_[1]); in TEST_F()
3747 "build out: cat in |@ validate\n" in TEST_F()
3748 "build validate: cat in2\n")); in TEST_F()
3757 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3773 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3790 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3799 "build out: cat in |@ validate\n" in TEST_F()
3800 "build validate: cat in2 | out\n")); in TEST_F()
3809 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3824 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3840 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3849 "build out: cat in |@ validate\n" in TEST_F()
3850 "build validate: cat in2 | out\n" in TEST_F()
3851 "build out2: cat in3\n" in TEST_F()
3877 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
3880 // On the first build, only the out2 command is run. in TEST_F()
3913 EXPECT_TRUE(builder.Build(&err)); in TEST_F()
3928 "build out: cat in |@ out2\n" in TEST_F()
3929 "build out2: cat in2 |@ out\n")); in TEST_F()
3938 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3953 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3969 EXPECT_TRUE(builder_.Build(&err)); in TEST_F()
3978 "build out: cat in |@ validate\n" in TEST_F()
3979 "build validate: cat validate_in | out\n" in TEST_F()
3980 "build validate_in: cat validate\n")); in TEST_F()
3986 EXPECT_EQ("dependency cycle: validate -> validate_in -> validate", err); in TEST_F()