]> git.tdb.fi Git - builder.git/blobdiff - source/target.h
Remove all files in a side effect group when starting a task
[builder.git] / source / target.h
index ccc616bb464a50a950888040bf41e058d92a1790..6b9cc90a0842de77c845982a1f6462d7c107caf6 100644 (file)
@@ -30,7 +30,8 @@ protected:
                PREPARING,
                REBUILD,
                BUILDING,
-               UPTODATE
+               UPTODATE,
+               BROKEN
        };
 
 public:
@@ -42,11 +43,14 @@ protected:
        const Component *component;
        std::string name;
 
-       const Tool *tool;
+       Tool *tool;
        State state;
        std::string rebuild_reason;
+       std::list<std::string> problems;
 
        Dependencies depends;
+       Dependencies side_effects;
+       Target *primary_target;
 
        Target(Builder &, const std::string &);
 public:
@@ -60,17 +64,27 @@ public:
        /** Adds a dependency for the target.  Order is preseved and is important
        for some target types.  It is an error to create dependency cycles, although
        this won't be detected until the targets are prepared. */
-       void add_depend(Target &);
+       void add_dependency(Target &);
+
+       /** Adds a side effect for the target.  Side effects are not built on their
+       own, but together with their primary target. */
+       void add_side_effect(Target &);
 
 protected:
        /** Finds dependencies for the target.  Called during preparation.  If the
        target needs to recursively inspect its dependencies, it should prepare its
        direct dependencies first. */
-       virtual void find_depends() { }
+       virtual void find_dependencies() { }
 
 public:
        /// Returns the dependencies of the target, in the order they were added.
-       const Dependencies &get_depends() const { return depends; }
+       const Dependencies &get_dependencies() const { return depends; }
+
+       /// Returns the side effects of the target.
+       const Dependencies &get_side_effects() const { return side_effects; }
+
+       /// Returns the primary target associated with a side effect target.
+       Target *get_primary_target() const { return primary_target; }
 
        /** Tries to locate a target that will help getting this target built.  If
        all dependencies are up-to-date, returns this target.  If there are no
@@ -83,7 +97,7 @@ public:
        the function recursively to find the final target. */
        virtual Target *get_real_target() { return this; }
 
-       void set_tool(const Tool &);
+       void set_tool(Tool &);
 
        /** Returns the tool used to build the target.  To actually build it, call
        the build() function. */
@@ -111,17 +125,31 @@ protected:
        virtual void check_rebuild() = 0;
 
 public:
+       bool is_broken() const { return state==BROKEN; }
+
+       const std::list<std::string> &get_problems() const { return problems; }
+
        /** Prepares the target by finding dependencies, recursively preparing them
        and then checking whether rebuilding is needed. */
-       virtual void prepare();
+       void prepare();
 
        /** Invokes the associated Tool to build the target and returns the
        resulting Task.  The task must be started by the caller. */
-       Task *build();
+       virtual Task *build();
 
 protected:
+       /** Targets can override this to do additional setup on the Task.  This is
+       also called on side effects, which normally do not get built by themselves. */
+       virtual void build(Task &) { }
+
        /** Handler for Task::signal_finished. */
        virtual void build_finished(bool);
+
+       virtual void modified() { }
+
+public:
+       /** Removes any results of building the target. */
+       virtual void clean() { }
 };
 
 #endif