X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Ftool.cpp;h=d7b27ff275e39cfbdd908ffbc21119474a40d540;hb=68ef01e3f94ba5d0297e7979551e7d9404906db7;hp=e1858493add33c2624f78cd0585235d7603c03a1;hpb=338eefb513953ae55e8e3614c009c242ba8ad74e;p=builder.git diff --git a/source/tool.cpp b/source/tool.cpp index e185849..d7b27ff 100644 --- a/source/tool.cpp +++ b/source/tool.cpp @@ -1,21 +1,81 @@ -#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), - tag(t) -{ } +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) const +void Tool::set_run(function f) { - return find(input_suffixes.begin(), input_suffixes.end(), suffix)!=input_suffixes.end(); + run_func = move(f); } -Target *Tool::create_target(Target &source, const string &arg) const +bool Tool::accepts_suffix(const string &suffix, bool aux) const { - list sources; + return (any_equals(input_suffixes, suffix) || (aux && any_equals(aux_suffixes, suffix))); +} + +Target *Tool::create_target(Target &source, const string &arg) +{ + vector sources; sources.push_back(&source); return create_target(sources, arg); } + +void Tool::prepare(Tool *tool) +{ + if(!tool) + tool = this; + else if(tool->get_base_tool()!=this) + throw invalid_argument("Tool::prepare"); + + if(tool->prepared) + return; + + tool->prepared = true; + if(!tool->command.empty()) + tool->executable = builder.get_vfs().find_binary(tool->command); + do_prepare(*tool); + if(!command.empty() && !executable) + { + builder.get_logger().log("problems", "Can't find executable %s for %s", tool->command, tool->tag); + tool->problems.push_back(format("Can't find executable %s", tool->command)); + } +} + +string Tool::create_build_signature(const BuildInfo &) const +{ + if(executable) + return format("%s=%s", tag, FS::basename(executable->get_path())); + else + return string(); +} + + +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)); +}