28 "build out: cat in | implicit\n"));
30 fs_.Create(
"out",
"");
32 Edge* edge = GetNode(
"out")->in_edge();
34 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
40 EXPECT_TRUE(GetNode(
"out")->dirty());
45 "build out: cat in | implicit\n"));
47 fs_.Create(
"out",
"");
49 fs_.Create(
"implicit",
"");
51 Edge* edge = GetNode(
"out")->in_edge();
53 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
57 EXPECT_TRUE(GetNode(
"out")->dirty());
64 " command = cat $in > $out\n"
65 "build out.o: catdep foo.cc\n"));
66 fs_.Create(
"foo.cc",
"");
67 fs_.Create(
"out.o.d",
"out.o: ./foo/../implicit.h\n");
68 fs_.Create(
"out.o",
"");
70 fs_.Create(
"implicit.h",
"");
72 Edge* edge = GetNode(
"out.o")->in_edge();
74 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
79 EXPECT_TRUE(GetNode(
"out.o")->dirty());
86 " command = cat $in > $out\n"
87 "build implicit.h: cat data\n"
88 "build out.o: catdep foo.cc || implicit.h\n"));
89 fs_.Create(
"implicit.h",
"");
90 fs_.Create(
"foo.cc",
"");
91 fs_.Create(
"out.o.d",
"out.o: implicit.h\n");
92 fs_.Create(
"out.o",
"");
94 fs_.Create(
"data",
"");
96 Edge* edge = GetNode(
"out.o")->in_edge();
98 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
104 EXPECT_TRUE(GetNode(
"out.o")->dirty());
110 " depfile = $out.d\n"
111 " command = cat $in > $out\n"
112 "build ./out.o: catdep ./foo.cc\n"));
113 fs_.Create(
"foo.cc",
"");
114 fs_.Create(
"out.o.d",
"out.o: foo.cc\n");
115 fs_.Create(
"out.o",
"");
117 Edge* edge = GetNode(
"out.o")->in_edge();
119 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
122 EXPECT_FALSE(GetNode(
"out.o")->dirty());
127 "build out1: cat in1\n"
128 "build mid1: cat in1\n"
129 "build out2: cat mid1\n"
130 "build out3 out4: cat mid1\n"));
133 vector<Node*> root_nodes = state_.RootNodes(&err);
134 EXPECT_EQ(4u, root_nodes.size());
135 for (
size_t i = 0; i < root_nodes.size(); ++i) {
136 string name = root_nodes[i]->path();
137 EXPECT_EQ(
"out", name.substr(0, 3));
143 "build a$ b: cat nospace with$ space nospace2\n"));
145 Edge* edge = GetNode(
"a b")->in_edge();
146 EXPECT_EQ(
"cat nospace \"with space\" nospace2 > \"a b\"",
154 " depfile = $out.d\n"
155 " command = cat $in > $out\n"
156 "build ./out.o: catdep ./foo.cc\n"));
157 fs_.Create(
"foo.cc",
"");
158 fs_.Create(
"out.o.d",
"out.o: bar/../foo.cc\n");
159 fs_.Create(
"out.o",
"");
161 Edge* edge = GetNode(
"out.o")->in_edge();
163 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
166 EXPECT_FALSE(GetNode(
"out.o")->dirty());
173 " depfile = $out.d\n"
174 " command = cat $in > $out\n"
175 "build ./out.o: catdep ./foo.cc\n"));
176 fs_.Create(
"foo.h",
"");
177 fs_.Create(
"foo.cc",
"");
179 fs_.Create(
"out.o.d",
"out.o: foo.h\n");
180 fs_.Create(
"out.o",
"");
182 Edge* edge = GetNode(
"out.o")->in_edge();
184 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
186 EXPECT_FALSE(GetNode(
"out.o")->dirty());
189 fs_.RemoveFile(
"out.o.d");
190 EXPECT_TRUE(scan_.RecomputeDirty(edge, &err));
192 EXPECT_TRUE(GetNode(
"out.o")->dirty());
200 " command = depfile is $depfile\n"
201 "build out: r in\n"));
202 Edge* edge = GetNode(
"out")->in_edge();
211 " command = unused\n"
214 Edge* edge = GetNode(
"out")->in_edge();
223 " command = depfile is $depfile\n"
226 Edge* edge = GetNode(
"out")->in_edge();
227 EXPECT_EQ(
"depfile is y", edge->
GetBinding(
"command"));
An implementation of DiskInterface that uses an in-memory representation of disk state.
void AssertParse(State *state, const char *input)
An edge in the dependency graph; links between Nodes using Rules.
string EvaluateCommand(bool incl_rsp_file=false)
Expand all variables in a command and return it as a string.
A base test fixture that includes a State object with a builtin "cat" rule.
string GetBinding(const string &key)
DependencyScan manages the process of scanning the files in a graph and updating the dirty/outputs_re...
TEST_F(GraphTest, MissingImplicit)