]> git.tdb.fi Git - builder.git/commitdiff
Add a side effect system for building multiple targets at once
authorMikko Rasa <tdb@tdb.fi>
Thu, 6 Sep 2012 13:30:25 +0000 (16:30 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 6 Sep 2012 13:30:25 +0000 (16:30 +0300)
source/filetarget.cpp
source/target.cpp
source/target.h

index ec89be897721d063bf2fe5fa82a8498ef265f681..af63c237a2a0e849b8fe403bb0edb2ed3a772425 100644 (file)
@@ -87,6 +87,16 @@ void FileTarget::check_rebuild()
                }
        }
 
+       if(!needs_rebuild())
+       {
+               for(Dependencies::iterator i=side_effects.begin(); (i!=side_effects.end() && !needs_rebuild()); ++i)
+               {
+                       FileTarget *ft = dynamic_cast<FileTarget *>(*i);
+                       if(ft && !ft->get_mtime())
+                               mark_rebuild((*i)->get_name()+" does not exist");
+               }
+       }
+
        if(!needs_rebuild() && package)
        {
                if(package->get_config().get_mtime()>mtime)
index 64e1115adbd7bdc43134c3ef185764f944a40848..352b788823534b464ddf609833b826108723c45f 100644 (file)
@@ -17,7 +17,8 @@ Target::Target(Builder &b, const string &n):
        component(0),
        name(n),
        tool(0),
-       state(INIT)
+       state(INIT),
+       primary_target(0)
 {
        builder.add_target(this);
 }
@@ -31,8 +32,19 @@ void Target::add_dependency(Target &dep)
                dep.signal_bubble_rebuild.connect(sigc::mem_fun(this, &Target::check_rebuild));
 }
 
+void Target::add_side_effect(Target &se)
+{
+       side_effects.push_back(&se);
+       se.add_dependency(*this);
+       if(tool)
+               se.set_tool(*tool);
+       se.primary_target = this;
+}
+
 Target *Target::get_buildable_target()
 {
+       if(primary_target)
+               return primary_target->get_buildable_target();
        if(!needs_rebuild())
                return 0;
 
@@ -55,6 +67,8 @@ Target *Target::get_buildable_target()
 void Target::set_tool(const Tool &t)
 {
        tool = &t;
+       for(Dependencies::const_iterator i=side_effects.begin(); i!=side_effects.end(); ++i)
+               (*i)->set_tool(t);
 }
 
 void Target::force_rebuild()
@@ -126,5 +140,9 @@ void Target::build_finished(bool success)
 {
        state = UPTODATE;
        if(success)
+       {
                modified();
+               for(Dependencies::const_iterator i=side_effects.begin(); i!=side_effects.end(); ++i)
+                       (*i)->build_finished(success);
+       }
 }
index 48b3424d2f39d908d4792b05ba54fc0fce43c5c4..0b9d2306fde33f6b35209c5d94dcf08d3af2101b 100644 (file)
@@ -47,6 +47,8 @@ protected:
        std::string rebuild_reason;
 
        Dependencies depends;
+       Dependencies side_effects;
+       Target *primary_target;
 
        Target(Builder &, const std::string &);
 public:
@@ -62,6 +64,10 @@ public:
        this won't be detected until the targets are prepared. */
        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
@@ -72,6 +78,12 @@ public:
        /// Returns the dependencies of the target, in the order they were added.
        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
        targets ready to be built (maybe because they are being built right now),