X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftool.cpp;h=6e2b21431fc5d1808fef9fd691ccd83ff1bd3275;hb=d10be3251b2b6605723c6c753a4c9a9ba35c9950;hp=65a45041286e6a054649461bd65770cccc614d69;hpb=7ed7c30ee0ceb734f17fe0c6d4bc6d37fb2ab5a7;p=builder.git diff --git a/source/tool.cpp b/source/tool.cpp index 65a4504..6e2b214 100644 --- a/source/tool.cpp +++ b/source/tool.cpp @@ -1,41 +1,38 @@ -#include +#include +#include #include #include "architecture.h" #include "builder.h" +#include "filetarget.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), - prepared(false) -{ } - -Tool::Tool(Builder &b, const Architecture &a, const string &t): - builder(b), - architecture(&a), - tag(t), - executable(0), - 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; +} + +void Tool::set_run(function f) +{ + run_func = move(f); +} bool Tool::accepts_suffix(const string &suffix, bool aux) const { - if(find(input_suffixes.begin(), input_suffixes.end(), suffix)!=input_suffixes.end()) - return true; - else if(aux) - return find(aux_suffixes.begin(), aux_suffixes.end(), suffix)!=aux_suffixes.end(); - else - return false; + return (any_equals(input_suffixes, suffix) || (aux && any_equals(aux_suffixes, suffix))); } Target *Tool::create_target(Target &source, const string &arg) { - list sources; + vector sources; sources.push_back(&source); return create_target(sources, arg); } @@ -46,21 +43,60 @@ void Tool::prepare() return; prepared = true; + if(!command.empty()) + executable = builder.get_vfs().find_binary(command); do_prepare(); + if(!executable) + { + builder.get_logger().log("problems", "Can't find executable %s for %s", command, tag); + problems.push_back(format("Can't find executable %s", command)); + } } -void Tool::set_executable(const string &command, bool cross) +string Tool::create_build_signature(const BuildInfo &) const { - if(cross && architecture->is_cross()) - return set_executable(format("%s-%s", architecture->get_cross_prefix(), command), false); + if(executable) + return format("%s=%s", tag, FS::basename(executable->get_path())); + else + return string(); +} - executable = builder.get_vfs().find_binary(command); - if(!executable) - builder.problem(string(), format("Can't find executable %s for tool %s", command, tag)); + +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 vector &s, const string &a) +{ + return parent.create_target(s, a); +} + +Target *SubTool::create_install(Target &t) const +{ + return parent.create_install(t); +} -SubTool::SubTool(Tool &p): - Tool(p), - parent(p) -{ } +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)); +}