X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Ftool.h;h=dab39e7424882ffc10a840bbda2fe916bc938a59;hb=15cf75a5ac62454d90b8b2987b1940710056f4d0;hp=5ea63356a4028b0d6afac2dfe0b6be02fce1c65c;hpb=7780df0b9a760327a9ad9ff80fc6b5d9a273db96;p=builder.git diff --git a/source/tool.h b/source/tool.h index 5ea6335..dab39e7 100644 --- a/source/tool.h +++ b/source/tool.h @@ -16,11 +16,20 @@ class Component; class FileTarget; class Target; +class ToolData +{ +public: + VirtualFileSystem::SearchPath system_path; + BuildInfo build_info; + Msp::Variant extra_data; + std::vector 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 @@ -39,14 +48,12 @@ protected: std::vector input_suffixes; std::vector aux_suffixes; ProcessingUnit processing_unit = ONE_FILE; - VirtualFileSystem::SearchPath system_path; - BuildInfo build_info; std::function run_func; bool prepared = false; - std::vector 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() { } @@ -58,6 +65,8 @@ public: 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); @@ -100,6 +109,8 @@ public: 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; } @@ -123,9 +134,10 @@ public: virtual std::string create_build_signature(const BuildInfo &) const; void prepare(); + void prepare(Tool &) const; protected: - virtual void do_prepare() { } + virtual void do_prepare(ToolData &) const { } public: const std::vector &get_problems() const { return problems; }