]> git.tdb.fi Git - builder.git/blobdiff - source/tool.cpp
Add a utility function for setting the executable for a Tool
[builder.git] / source / tool.cpp
index 5556cb346e7c1efeeee808aa275818545f185518..65a45041286e6a054649461bd65770cccc614d69 100644 (file)
@@ -1,11 +1,26 @@
 #include <algorithm>
+#include <msp/strings/format.h>
+#include "architecture.h"
+#include "builder.h"
 #include "tool.h"
 
 using namespace std;
+using namespace Msp;
 
 Tool::Tool(Builder &b, const string &t):
        builder(b),
-       tag(t)
+       architecture(0),
+       tag(t),
+       executable(0),
+       prepared(false)
+{ }
+
+Tool::Tool(Builder &b, const Architecture &a, const string &t):
+       builder(b),
+       architecture(&a),
+       tag(t),
+       executable(0),
+       prepared(false)
 { }
 
 bool Tool::accepts_suffix(const string &suffix, bool aux) const
@@ -18,9 +33,34 @@ bool Tool::accepts_suffix(const string &suffix, bool aux) const
                return false;
 }
 
-Target *Tool::create_target(Target &source, const string &arg) const
+Target *Tool::create_target(Target &source, const string &arg)
 {
        list<Target *> sources;
        sources.push_back(&source);
        return create_target(sources, arg);
 }
+
+void Tool::prepare()
+{
+       if(prepared)
+               return;
+
+       prepared = true;
+       do_prepare();
+}
+
+void Tool::set_executable(const string &command, bool cross)
+{
+       if(cross && architecture->is_cross())
+               return set_executable(format("%s-%s", architecture->get_cross_prefix(), command), false);
+
+       executable = builder.get_vfs().find_binary(command);
+       if(!executable)
+               builder.problem(string(), format("Can't find executable %s for tool %s", command, tag));
+}
+
+
+SubTool::SubTool(Tool &p):
+       Tool(p),
+       parent(p)
+{ }