X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftool.cpp;h=eaf4977d8c16030f2aa1bb0994ad3abc1d67c900;hb=4e220a1ec5800e2f1caba02d55977a3b6f68d112;hp=54138215e5f0ca25d368fb32bc801592f3413c2d;hpb=aa053d637e8259755af7d2e4b510a242f4d29c7b;p=builder.git diff --git a/source/tool.cpp b/source/tool.cpp index 5413821..eaf4977 100644 --- a/source/tool.cpp +++ b/source/tool.cpp @@ -9,24 +9,6 @@ using namespace std; using namespace Msp; -Tool::Tool(Builder &b, const string &t): - builder(b), - architecture(0), - tag(t), - 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()) @@ -38,6 +20,11 @@ void Tool::set_command(const string &cmd, bool cross) command = cmd; } +void Tool::set_run(function f) +{ + run_func = move(f); +} + bool Tool::accepts_suffix(const string &suffix, bool aux) const { return (any_equals(input_suffixes, suffix) || (aux && any_equals(aux_suffixes, suffix))); @@ -56,55 +43,34 @@ void Tool::prepare() return; prepared = true; - do_prepare(); - if(!executable && !command.empty()) - { + + if(!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)); - } + prepare(*this); + if(!command.empty() && !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)); } } -string Tool::create_build_signature(const BuildInfo &) const -{ - if(executable) - return format("%s=%s", tag, FS::basename(executable->get_path())); - else - return string(); -} - - -SubTool::SubTool(Tool &p): - Tool(p), - parent(p) -{ } - -Target *SubTool::create_source(const Component &c, const FS::Path &p) const +void Tool::prepare(Tool &tool) const { - return parent.create_source(c, p); -} + if(&tool!=this && tool.get_base_tool()!=this) + throw invalid_argument("Tool::prepare"); -Target *SubTool::create_source(const FS::Path &p) const -{ - return parent.create_source(p); -} + if(&tool!=this && !command.empty() && tool.command.empty()) + throw logic_error("Derived tool has no command"); -Target *SubTool::create_target(const vector &s, const string &a) -{ - return parent.create_target(s, a); + do_prepare(tool); } -Target *SubTool::create_install(Target &t) const -{ - return parent.create_install(t); -} - -string SubTool::create_build_signature(const BuildInfo &bi) const +string Tool::create_build_signature(const BuildInfo &) const { - return parent.create_build_signature(bi); + if(executable) + return format("%s=%s", tag, FS::basename(executable->get_path())); + else + return string(); }