From 4cc08a580ddcdc025d2ca23c336e76c11414d8e0 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 6 Sep 2012 16:30:25 +0300 Subject: [PATCH] Add a side effect system for building multiple targets at once --- source/filetarget.cpp | 10 ++++++++++ source/target.cpp | 20 +++++++++++++++++++- source/target.h | 12 ++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/source/filetarget.cpp b/source/filetarget.cpp index ec89be8..af63c23 100644 --- a/source/filetarget.cpp +++ b/source/filetarget.cpp @@ -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(*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) diff --git a/source/target.cpp b/source/target.cpp index 64e1115..352b788 100644 --- a/source/target.cpp +++ b/source/target.cpp @@ -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); + } } diff --git a/source/target.h b/source/target.h index 48b3424..0b9d230 100644 --- a/source/target.h +++ b/source/target.h @@ -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), -- 2.45.2