]> git.tdb.fi Git - builder.git/blobdiff - source/target.cpp
Refactor transitive dependencies to work on all targets
[builder.git] / source / target.cpp
diff --git a/source/target.cpp b/source/target.cpp
deleted file mode 100644 (file)
index 297ae3f..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#include <msp/fs/stat.h>
-#include <msp/fs/utils.h>
-#include "builder.h"
-#include "filetarget.h"
-#include "package.h"
-#include "target.h"
-#include "task.h"
-#include "tool.h"
-
-using namespace std;
-using namespace Msp;
-
-Target::Target(Builder &b, const string &n):
-       builder(b),
-       package(0),
-       component(0),
-       name(n),
-       tool(0),
-       state(INIT)
-{
-       builder.add_target(this);
-}
-
-Target *Target::get_buildable_target()
-{
-       if(!needs_rebuild())
-               return 0;
-
-       bool self_ok = state!=BUILDING;
-       for(Dependencies::iterator i=depends.begin(); i!=depends.end(); ++i)
-       {
-               Target *tgt = (*i)->get_buildable_target();
-               if(tgt)
-                       return tgt;
-               else if((*i)->needs_rebuild())
-                       self_ok = false;
-       }
-
-       if(self_ok)
-               return this;
-
-       return 0;
-}
-
-void Target::set_tool(const Tool &t)
-{
-       tool = &t;
-}
-
-void Target::add_depend(Target *dep)
-{
-       if(dep==this)
-               throw invalid_argument("Target::add_depend");
-       depends.push_back(dep);
-}
-
-void Target::prepare()
-{
-       if(state>PREPARING)
-               return;
-       if(state==PREPARING)
-       {
-               builder.problem((package ? package->get_name() : string()), "Dependency cycle detected at "+name);
-               return;
-       }
-
-       state = PREPARING;
-       find_depends();
-
-       for(Dependencies::iterator i=depends.begin(); i!=depends.end(); ++i)
-               (*i)->prepare();
-
-       check_rebuild();
-       if(state==PREPARING)
-               state = UPTODATE;
-}
-
-Task *Target::build()
-{
-       if(!tool)
-       {
-               state = UPTODATE;
-               return 0;
-       }
-
-       // XXX Minor breach of OO here
-       if(FileTarget *ft = dynamic_cast<FileTarget *>(this))
-               if(!builder.get_dry_run() && FS::exists(ft->get_path()))
-                       FS::unlink(ft->get_path());
-
-       Task *task = tool->run(*this);
-       task->signal_finished.connect(sigc::mem_fun(this, &Target::build_finished));
-       state = BUILDING;
-
-       return task;
-}
-
-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;
-}
-
-void Target::build_finished(bool /*success*/)
-{
-       state = UPTODATE;
-}