]> git.tdb.fi Git - builder.git/blobdiff - source/tool.h
Group most existing tools in sub-toolchains
[builder.git] / source / tool.h
index d5d7e784b205578ad571b1de906a81aa01eb4e20..be3646cd8f0f674a6022980a1205de5aa5c7b6b9 100644 (file)
@@ -31,6 +31,8 @@ protected:
        SuffixList input_suffixes;
        SuffixList aux_suffixes;
        SearchPath system_path;
+       bool prepared;
+       std::list<std::string> problems;
 
        Tool(Builder &, const std::string &);
        Tool(Builder &, const Architecture &, const std::string &);
@@ -39,9 +41,12 @@ public:
 
        const std::string &get_tag() const { return tag; }
 
+       /** Returns the architecture this tool build for.  May return null if the
+       tool is architecture-agnostic. */
+       const Architecture *get_architecture() const { return architecture; }
+
        /** Returns a target for the tool's own executable.  If the tool does not
        use an external program, returns null. */
-       // XXX The executable target should be retrieved when first needed
        FileTarget *get_executable() const { return executable; }
 
        /// Returns a list of suffixes that can be processed with this tool.
@@ -67,15 +72,32 @@ public:
        virtual Target *create_source(const Msp::FS::Path &) const { return 0; }
 
        /// Convenience function to create a target from a single source.
-       Target *create_target(Target &, const std::string & = std::string()) const;
+       Target *create_target(Target &, const std::string & = std::string());
 
        /** Creates a target from sources.  The exact types of accepted sources
        depends on the tool.  The optional second argument can be used to select an
        alternative target type for tools that can create multiple kinds of targets. */ 
-       virtual Target *create_target(const std::list<Target *> &, const std::string & = std::string()) const = 0;
+       virtual Target *create_target(const std::list<Target *> &, const std::string & = std::string()) = 0;
+
+       /** Creates an install target for a target created by this tool.  Can return
+       null if the tool does not want to handle installing in a special way. */
+       virtual Target *create_install(Target &) const { return 0; }
 
        virtual std::string create_build_signature(const BuildInfo &) const { return std::string(); }
 
+       void prepare();
+
+protected:
+       virtual void do_prepare() { }
+
+       /** Locates an executable for the tool from the VFS.  If it isn't found, a
+       problem is reported.  If cross is true and the architecture is not native,
+       a cross prefix is added to the command. */
+       void set_executable(const std::string &command, bool cross = false);
+
+public:
+       const std::list<std::string> &get_problems() const { return problems; }
+
        /** Invokes the tool to build a target.  This should not be called directly;
        use Target::build() instead. */
        virtual Task *run(const Target &) const = 0;