]> git.tdb.fi Git - builder.git/blob - source/target.h
Do dependency discovery in a single pass
[builder.git] / source / target.h
1 #ifndef TARGET_H_
2 #define TARGET_H_
3
4 #include <list>
5 #include <map>
6 #include <set>
7 #include <string>
8 #include <msp/time/timestamp.h>
9
10 class Builder;
11 class Component;
12 class Package;
13 class Task;
14 class Tool;
15
16 class Target;
17
18 /**
19 Targets make up the build graph.  This class is a base for all target types and
20 handles many common tasks.  See also FileTarget and VirtualTarget.
21 */
22 class Target
23 {
24 public:
25         typedef std::list<Target *> Dependencies;
26
27 protected:
28         enum State
29         {
30                 INIT,
31                 PREPARING,
32                 REBUILD,
33                 BUILDING,
34                 UPTODATE
35         };
36
37         Builder &builder;
38         const Package *package;
39         const Component *component;
40         std::string name;
41
42         const Tool *tool;
43         State state;
44         std::string rebuild_reason;
45         std::string install_location;
46
47         Dependencies depends;
48
49         Target(Builder &, const std::string &);
50 public:
51         virtual ~Target() { }
52
53         virtual const char *get_type() const = 0;
54         const std::string &get_name() const { return name; }
55         const Package *get_package() const { return package; }
56         const Component *get_component() const { return component; }
57
58         /**
59         Tries to locate a target that will help getting this target built.  If all
60         dependencies are up-to-date, returns this target.  If there are no targets
61         ready to be built (maybe because they are being built right now), returns 0.
62         */
63         virtual Target *get_buildable_target();
64
65         /**
66         If this target is a proxy for another (such as Install or Symlink), return
67         that target.  Otherwise, return the target itself.
68
69         Implementors should call the function recursively to find the final target.
70         */
71         virtual Target *get_real_target() { return this; }
72
73         void set_tool(const Tool &);
74         const Tool *get_tool() const { return tool; }
75
76         bool is_buildable() const { return tool!=0; }
77         bool needs_rebuild() const { return state>PREPARING && state<UPTODATE; }
78         const std::string &get_rebuild_reason() const { return rebuild_reason; }
79         bool is_installable() const { return !install_location.empty(); }
80         const std::string &get_install_location() const { return install_location; }
81         void add_depend(Target *);
82         const Dependencies &get_depends() const { return depends; }
83
84         /** Finds dependencies for the target. */
85         virtual void find_depends() { }
86
87         /**
88         Prepares the target by recursively preparing dependencies, then checking
89         whether rebuilding is needed.  A flag is used to prevent unnecessary
90         executions.
91         */
92         virtual void prepare();
93
94         /**
95         Starts building the target.  Returns the Action used for building.
96         */
97         Task *build();
98 protected:
99         void mark_rebuild(const std::string &);
100
101         /**
102         Checks if the target needs to be rebuilt and why.
103         */
104         virtual void check_rebuild() = 0;
105
106         /**
107         Handler for the build_finished signal of Task.
108         */
109         virtual void build_finished(bool);
110 };
111
112 #endif