X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftarget.cpp;h=0d8c2da0d81ecc8b5ec3621e4a3a2d2aa86eac19;hb=24af1ff16ad1584ee10ef7b9798f340048c5dfff;hp=f5b93a0b3ad74b51aeab675e763f82b14bd85f9f;hpb=c194bac9d508999c046a1f56c80b9419f77a8590;p=builder.git diff --git a/source/target.cpp b/source/target.cpp index f5b93a0..0d8c2da 100644 --- a/source/target.cpp +++ b/source/target.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -32,10 +33,16 @@ void Target::add_dependency(Target &dep) dep.signal_bubble_rebuild.connect(sigc::mem_fun(this, &Target::check_rebuild)); } +void Target::add_transitive_dependency(Target &dep) +{ + if(&dep==this) + throw invalid_argument("Target::add_transitive_dependency"); + trans_depends.push_back(&dep); +} + 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; @@ -54,6 +61,10 @@ Target *Target::get_buildable_target() bool self_ok = state!=BUILDING; for(Dependencies::iterator i=depends.begin(); i!=depends.end(); ++i) { + // Avoid infinite recursion if a target repends on its own side effect + if(find(side_effects.begin(), side_effects.end(), *i)!=side_effects.end()) + continue; + Target *tgt = (*i)->get_buildable_target(); if(tgt) return tgt; @@ -149,6 +160,10 @@ Task *Target::build() task->signal_finished.connect(sigc::mem_fun(this, &Target::build_finished)); state = BUILDING; + build(*task); + for(Dependencies::const_iterator i=side_effects.begin(); i!=side_effects.end(); ++i) + (*i)->build(*task); + return task; } @@ -160,5 +175,6 @@ void Target::build_finished(bool success) modified(); for(Dependencies::const_iterator i=side_effects.begin(); i!=side_effects.end(); ++i) (*i)->build_finished(success); + signal_modified.emit(); } }