8 #include <sigc++/signal.h>
9 #include <msp/time/timestamp.h>
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.
24 typedef std::list<Target *> Dependencies;
37 sigc::signal<void> signal_bubble_rebuild;
41 const SourcePackage *package;
42 const Component *component;
47 std::string rebuild_reason;
51 Target(Builder &, const std::string &);
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; }
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),
64 virtual Target *get_buildable_target();
66 /** If this target is a proxy for another (such as InstalledFile), return
67 that target. Otherwise, return the target itself. Implementors should call
68 the function recursively to find the final target. */
69 virtual Target *get_real_target() { return this; }
71 void set_tool(const Tool &);
73 /** Returns the tool used to build the target. To actually build it, call
74 the build() function. */
75 const Tool *get_tool() const { return tool; }
77 /** Indicates if it's possible to build this target. */
78 bool is_buildable() const { return tool!=0; }
80 /** Indicates if this target needs rebuilding. Only makes sense after the
81 target has been prepared. */
82 bool needs_rebuild() const { return state>PREPARING && state<UPTODATE; }
84 /** Returns the reason for rebuilding this target. Only makes sense after
85 the target has been prepared. */
86 const std::string &get_rebuild_reason() const { return rebuild_reason; }
88 /** Forces rebuild of the target. */
91 /** Adds a dependency for the target. Order is preseved and is important
92 for some target types. It is an error to create dependency cycles, although
93 this won't be detected until the targets are prepared. */
94 void add_depend(Target *);
96 /// Returns the dependencies of the target, in the order they were added.
97 const Dependencies &get_depends() const { return depends; }
99 /** Finds dependencies for the target. Called during preparation. If the
100 target needs to recursively inspect its dependencies, it should prepare its
101 direct dependencies first. */
102 virtual void find_depends() { }
104 /** Prepares the target by finding dependencies, recursively preparing them
105 and then checking whether rebuilding is needed. */
106 virtual void prepare();
108 /** Invokes the associated Tool to build the target and returns the
109 resulting Task. The task must be started by the caller. */
113 /** Marks the target to be rebuilt and specified a reason for it. */
114 void mark_rebuild(const std::string &);
116 /** Checks if the target needs to be rebuilt and why. */
117 virtual void check_rebuild() = 0;
119 /** Handler for Task::signal_finished. */
120 virtual void build_finished(bool);