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