]> git.tdb.fi Git - builder.git/commitdiff
Let tools have a say in installing their targets
authorMikko Rasa <tdb@tdb.fi>
Thu, 6 Sep 2012 06:51:42 +0000 (09:51 +0300)
committerMikko Rasa <tdb@tdb.fi>
Thu, 6 Sep 2012 06:51:42 +0000 (09:51 +0300)
source/builder.cpp
source/tool.h

index c61d4a77c71c8f98e53790cd4d95028ebb0cc378..3344429c433728f01a54ca6c2ea3ae98e166426f 100644 (file)
@@ -341,9 +341,12 @@ void Builder::add_primary_target(Target &t)
 
 void Builder::add_installed_target(Target &t)
 {
-       Target *install = get_target("install");
-       const Tool &copy = toolchain.get_tool("CP");
-       install->add_dependency(*copy.create_target(t));
+       Target *inst_tgt = 0;
+       if(const Tool *tool = t.get_tool())
+               inst_tgt = tool->create_install(t);
+       if(!inst_tgt)
+               inst_tgt = toolchain.get_tool("CP").create_target(t);
+       get_target("install")->add_dependency(*inst_tgt);
 }
 
 void Builder::usage(const char *reason, const char *argv0, bool brief)
index d5d7e784b205578ad571b1de906a81aa01eb4e20..294805359e43dc7f2096cfc9650ca7afb5bf1379 100644 (file)
@@ -74,6 +74,10 @@ public:
        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;
 
+       /** 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(); }
 
        /** Invokes the tool to build a target.  This should not be called directly;