class FileTarget;
class Target;
+class ToolData
+{
+public:
+ VirtualFileSystem::SearchPath system_path;
+ BuildInfo build_info;
+ Msp::Variant extra_data;
+ std::vector<std::string> problems;
+};
+
/**
Base class for tools. Tools are used to turn targets into other targets.
Examples include compilers and linkers.
*/
-class Tool
+class Tool: protected ToolData
{
public:
enum ProcessingUnit
std::vector<std::string> input_suffixes;
std::vector<std::string> aux_suffixes;
ProcessingUnit processing_unit = ONE_FILE;
- VirtualFileSystem::SearchPath system_path;
- BuildInfo build_info;
std::function<Task *(const Target &)> run_func;
bool prepared = false;
- std::vector<std::string> problems;
Tool(Builder &b, const std::string &t): Tool(b, 0, t) { }
Tool(Builder &b, const Architecture *a, const std::string &t): builder(b), architecture(a), tag(t) { }
+
public:
virtual ~Tool() { }
tool is architecture-agnostic. */
const Architecture *get_architecture() const { return architecture; }
+ virtual const Tool *get_base_tool() const { return this; }
+
protected:
void set_run(std::function<Task *(const Target &)>);
the chain. */
const BuildInfo &get_build_info() const { return build_info; }
+ const Msp::Variant &get_extra_data() const { return extra_data; }
+
/// Creates a source file appropriate for this tool.
virtual Target *create_source(const Component &, const Msp::FS::Path &) const { return 0; }
virtual std::string create_build_signature(const BuildInfo &) const;
- void prepare();
+ void prepare(Tool * = 0);
protected:
- virtual void do_prepare() { }
+ virtual void do_prepare(ToolData &) const { }
public:
const std::vector<std::string> &get_problems() const { return problems; }