X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftool.cpp;h=496132f7a5266523e92777e0558aeb79b62b57cb;hb=92d81529ec8f3b84f5471162d0b27914eff7adb5;hp=a2c61bf1f24ffa9cd48f4add29e0501c64f47343;hpb=3e8f3a5e852e9dd5b78ec3d89c722ef1bae6bef5;p=builder.git diff --git a/source/tool.cpp b/source/tool.cpp index a2c61bf..496132f 100644 --- a/source/tool.cpp +++ b/source/tool.cpp @@ -1,14 +1,41 @@ #include +#include +#include "architecture.h" +#include "builder.h" #include "tool.h" using namespace std; +using namespace Msp; Tool::Tool(Builder &b, const string &t): builder(b), + architecture(0), tag(t), - executable(0) + executable(0), + processing_unit(ONE_FILE), + prepared(false) { } +Tool::Tool(Builder &b, const Architecture &a, const string &t): + builder(b), + architecture(&a), + tag(t), + executable(0), + processing_unit(ONE_FILE), + prepared(false) +{ } + +void Tool::set_command(const string &cmd, bool cross) +{ + if(cmd.empty()) + throw invalid_argument("Tool::set_command"); + + if(cross && architecture->is_cross() && !FS::Path(cmd).is_absolute()) + command = format("%s-%s", architecture->get_cross_prefix(), cmd); + else + command = cmd; +} + bool Tool::accepts_suffix(const string &suffix, bool aux) const { if(find(input_suffixes.begin(), input_suffixes.end(), suffix)!=input_suffixes.end()) @@ -19,15 +46,72 @@ 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 sources; sources.push_back(&source); return create_target(sources, arg); } +void Tool::prepare() +{ + if(prepared) + return; + + prepared = true; + do_prepare(); + if(!executable && !command.empty()) + { + executable = builder.get_vfs().find_binary(command); + if(!executable) + { + builder.get_logger().log("problems", format("Can't find executable %s for %s", command, tag)); + problems.push_back(format("Can't find executable %s", command)); + } + } +} + SubTool::SubTool(Tool &p): Tool(p), parent(p) { } + +Target *SubTool::create_source(const Component &c, const FS::Path &p) const +{ + return parent.create_source(c, p); +} + +Target *SubTool::create_source(const FS::Path &p) const +{ + return parent.create_source(p); +} + +Target *SubTool::create_target(const list &s, const string &a) +{ + return parent.create_target(s, a); +} + +Target *SubTool::create_install(Target &t) const +{ + return parent.create_install(t); +} + +string SubTool::create_build_signature(const BuildInfo &bi) const +{ + return parent.create_build_signature(bi); +} + + +void operator>>(const LexicalConverter &conv, Tool::ProcessingUnit &unit) +{ + const string &str = conv.get(); + if(str=="FILE") + unit = Tool::ONE_FILE; + else if(str=="DIRECTORY") + unit = Tool::DIRECTORY; + else if(str=="COMPONENT") + unit = Tool::COMPONENT; + else + throw lexical_error(format("conversion of '%s' to ProcessingUnit", str)); +}