X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftarget.cpp;h=0d8c2da0d81ecc8b5ec3621e4a3a2d2aa86eac19;hb=64661ac00a3a7eaa2295b85be642b6c96276cf97;hp=dd75e9a4a98b4d18206a8e7cf7c1512746557902;hpb=24981eb7ef702aa97b2ab90399ccd3fc23ce9ccf;p=builder.git diff --git a/source/target.cpp b/source/target.cpp index dd75e9a..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; @@ -164,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(); } }