]> git.tdb.fi Git - builder.git/blobdiff - source/target.cpp
Rewrite the find_* functions
[builder.git] / source / target.cpp
index 7c6141df7403b1978ccd32f8fdfa6ce911c10f74..1aab4b1fdef5a2f16fc04d4a674a0b5efb043a71 100644 (file)
 using namespace std;
 using namespace Msp;
 
-Target::Target(Builder &b, const Package *p, const string &n):
+Target::Target(Builder &b, const string &n):
        builder(b),
-       package(p),
+       package(0),
+       component(0),
        name(n),
        tool(0),
-       state(INIT),
-       deps_ready(false)
+       state(INIT)
 {
        builder.add_target(this);
 }
@@ -47,11 +47,19 @@ void Target::set_tool(const Tool &t)
        tool = &t;
 }
 
+void Target::force_rebuild()
+{
+       if(!is_buildable())
+               throw logic_error("Target::force_rebuild");
+       mark_rebuild("Forced rebuild");
+}
+
 void Target::add_depend(Target *dep)
 {
        if(dep==this)
                throw invalid_argument("Target::add_depend");
        depends.push_back(dep);
+       dep->signal_bubble_rebuild.connect(sigc::mem_fun(this, &Target::check_rebuild));
 }
 
 void Target::prepare()
@@ -65,6 +73,8 @@ void Target::prepare()
        }
 
        state = PREPARING;
+       find_depends();
+
        for(Dependencies::iterator i=depends.begin(); i!=depends.end(); ++i)
                (*i)->prepare();
 
@@ -95,8 +105,12 @@ Task *Target::build()
 
 void Target::mark_rebuild(const std::string &reason)
 {
+       if(reason.empty())
+               throw invalid_argument("No reason given for rebuilding "+name);
+
        state = REBUILD;
        rebuild_reason = reason;
+       signal_bubble_rebuild.emit();
 }
 
 void Target::build_finished(bool /*success*/)