class Builder;
class Component;
+class FileTarget;
class Target;
class Task;
+/**
+Base class for tools. Tools are used to turn targets into other targets.
+Examples include compilers and linkers.
+*/
class Tool
{
public:
protected:
Builder &builder;
std::string tag;
+ FileTarget *executable;
SuffixList input_suffixes;
SuffixList aux_suffixes;
SearchPath system_path;
virtual ~Tool() { }
const std::string &get_tag() const { return tag; }
+ // XXX The executable target should be retrieved when first needed
+ FileTarget *get_executable() const { return executable; }
const SuffixList &get_input_suffixes() const { return input_suffixes; }
const SuffixList &get_auxiliary_suffixes() const { return aux_suffixes; }
bool accepts_suffix(const std::string &, bool = false) const;
virtual Task *run(const Target &) const = 0;
};
+/**
+Intermediate base class for tool facets. For example, a linker may need to
+use different commands depending on whether C++ source files are present or
+not, but their presence can't be directly determined from the object files.
+*/
+class SubTool: public Tool
+{
+protected:
+ Tool &parent;
+
+ SubTool(Tool &);
+};
+
#endif