+bool Target::find_transitive_dependencies()
+{
+ vector<Target *> found_deps;
+ for(Target *d: depends)
+ if(!d->is_buildable())
+ find_transitive_dependencies(*d, found_deps);
+
+ bool any_added = false;
+ for(Target *d: found_deps)
+ if(!any_equals(depends, d))
+ {
+ any_added = true;
+ add_dependency(*d);
+ if(d->get_real_target()->is_buildable())
+ d->signal_modified.connect([this]{ rescan_trans_deps = true; });
+ }
+
+ return any_added;
+}
+
+void Target::find_transitive_dependencies(Target &tgt, vector<Target *> &found_deps) const
+{
+ tgt.prepare();
+
+ Target *rtgt = tgt.get_real_target();
+ Dependencies deps_to_add = rtgt->get_transitive_dependencies();
+ if(rtgt!=&tgt)
+ {
+ for(Target *&d: deps_to_add)
+ d = resolve_transitive_dependency(tgt, *d);
+ }
+
+ for(Target *d: deps_to_add)
+ if(d)
+ {
+ auto i = lower_bound(found_deps, d);
+ if(i==found_deps.end() || *i!=d)
+ {
+ found_deps.insert(i, d);
+ find_transitive_dependencies(*d, found_deps);
+ }
+ }
+}
+