blob: cf0e67f12a3e6c8e6398d08bad27ce691926b83d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#ifndef NINJA_BUILD_H_
#define NINJA_BUILD_H_
#include <set>
#include <string>
#include <queue>
#include <vector>
using namespace std;
struct Edge;
struct DiskInterface;
struct Node;
struct State;
// Plan stores the state of a build plan: what we intend to build,
// which steps we're ready to execute.
struct Plan {
// Add a target to our plan (including all its dependencies).
// Returns false if we don't need to build this target; may
// fill in |err| with an error message if there's a problem.
bool AddTarget(Node* node, string* err);
// Pop a ready edge off the queue of edges to build.
// Returns NULL if there's no work to do.
Edge* FindWork();
// Returns true if there's more work to be done.
bool more_to_do() const { return !want_.empty(); }
// Dumps the current state of the plan.
void Dump();
// Mark an edge as done building. Used internally and by
// tests.
void EdgeFinished(Edge* edge);
// Number of edges to run.
int edge_count() const { return want_.size() + ready_.size(); }
private:
bool AddSubTarget(Node* node, vector<Node*>* stack, string* err);
bool CheckDependencyCycle(Node* node, vector<Node*>* stack, string* err);
void NodeFinished(Node* node);
set<Edge*> want_;
set<Edge*> ready_;
};
// CommandRunner is an interface that wraps running the build
// subcommands. This allows tests to abstract out running commands.
// RealCommandRunner is an implementation that actually runs commands.
struct CommandRunner {
virtual ~CommandRunner() {}
virtual bool CanRunMore() = 0;
virtual bool StartCommand(Edge* edge) = 0;
virtual void WaitForCommands() = 0;
virtual Edge* NextFinishedCommand(bool* success) = 0;
};
struct Builder {
Builder(State* state);
Node* AddTarget(const string& name, string* err);
bool Build(string* err);
bool StartEdge(Edge* edge, string* err);
void FinishEdge(Edge* edge);
State* state_;
Plan plan_;
DiskInterface* disk_interface_;
CommandRunner* command_runner_;
};
#endif // NINJA_BUILD_H_
|