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