]> git.tdb.fi Git - builder.git/commitdiff
Store a target representing the executable in each tool
authorMikko Rasa <tdb@tdb.fi>
Sun, 8 Jul 2012 20:24:19 +0000 (23:24 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sun, 8 Jul 2012 21:08:55 +0000 (00:08 +0300)
source/gnuarchiver.cpp
source/gnucompiler.cpp
source/gnulinker.cpp
source/gnulinker.h
source/tool.cpp
source/tool.h

index 4916408e312607e840cfc9314bc3ee8061b6e760..13b2054ff5f26d2ea9006b3513d17e924b28faf9 100644 (file)
@@ -16,6 +16,8 @@ using namespace Msp;
 GnuArchiver::GnuArchiver(Builder &b):
        Tool(b, "AR")
 {
+       executable = builder.get_vfs().find_binary("ar");
+
        input_suffixes.push_back(".o");
 }
 
@@ -45,7 +47,7 @@ Task *GnuArchiver::run(const Target &target) const
        const Component &comp = *lib.get_component();
 
        vector<string> argv;
-       argv.push_back("ar");
+       argv.push_back(executable->get_path().str());
        argv.push_back("rc");
 
        FS::Path work_dir = comp.get_package().get_source();
index 5ecd29307fc9ac8339cc95090dddaf228e6beaed..87fd6623ee91a58ce606d905a95ee8eace56532e 100644 (file)
@@ -17,6 +17,8 @@ GnuCompiler::GnuCompiler(Builder &b, const string &t, const string &n):
        Tool(b, t),
        name(n)
 {
+       executable = builder.get_vfs().find_binary(name);
+
        const Architecture &arch = builder.get_current_arch();
        if(arch.is_native())
                system_path.push_back("/usr/include");
@@ -40,7 +42,7 @@ Task *GnuCompiler::run(const Target &target) const
        const Component &comp = object.get_component();
 
        ExternalTask::Arguments argv;
-       argv.push_back(name);
+       argv.push_back(executable->get_path().str());
        argv.push_back("-c");
 
        const BuildInfo &binfo = comp.get_build_info();
index 6eef8b3268da567f17385307e5c3022825fcd68a..32f2bf3bb1843c72b3d4249541bccfcd8359eb55 100644 (file)
@@ -7,7 +7,7 @@
 #include "component.h"
 #include "executable.h"
 #include "externaltask.h"
-#include "gnucxxcompiler.h"
+#include "gnucompiler.h"
 #include "gnulinker.h"
 #include "objectfile.h"
 #include "sharedlibrary.h"
@@ -83,12 +83,20 @@ Task *GnuLinker::run(const Target &) const
 GnuLinker::Linker::Linker(GnuLinker &p, const string &compiler_tag):
        SubTool(p)
 {
-       if(compiler_tag=="CC")
-               command = "gcc";
-       else if(compiler_tag=="CXX")
-               command = "g++";
+       const Tool &compiler = builder.get_toolchain().get_tool(compiler_tag);
+       if(dynamic_cast<const GnuCompiler *>(&compiler))
+               executable = compiler.get_executable();
        else
-               throw invalid_argument("GnuLinker::Linker::Linker");
+       {
+               string command;
+               if(compiler_tag=="CC")
+                       command = "gcc";
+               else if(compiler_tag=="CXX")
+                       command = "g++";
+               else
+                       throw invalid_argument("GnuLinker::Linker::Linker");
+               executable = builder.get_vfs().find_binary(command);
+       }
 }
 
 Target *GnuLinker::Linker::create_target(const list<Target *> &sources, const string &arg) const
@@ -101,7 +109,7 @@ Task *GnuLinker::Linker::run(const Target &target) const
        const Binary &bin = dynamic_cast<const Binary &>(target);
 
        vector<string> argv;
-       argv.push_back(command);
+       argv.push_back(executable->get_path().str());
 
        const Component &comp = *bin.get_component();
 
index 9f0475adf7202de215696716a10e35ccd14424ba..2fdaa3a58061f80c8de2c8319d2b79c25ad2d8dd 100644 (file)
@@ -8,9 +8,6 @@ class GnuLinker: public Tool
 private:
        class Linker: public SubTool
        {
-       private:
-               std::string command;
-
        public:
                Linker(GnuLinker &, const std::string &);
 
index 1ab3660474cf57de3a31bcf47df6231370beff5e..a2c61bf1f24ffa9cd48f4add29e0501c64f47343 100644 (file)
@@ -5,7 +5,8 @@ using namespace std;
 
 Tool::Tool(Builder &b, const string &t):
        builder(b),
-       tag(t)
+       tag(t),
+       executable(0)
 { }
 
 bool Tool::accepts_suffix(const string &suffix, bool aux) const
index 36d1be165b4f614a994d99ca08bcda4b37674ecd..7371103213b91f56483f630da8cada940d3fda66 100644 (file)
@@ -7,6 +7,7 @@
 
 class Builder;
 class Component;
+class FileTarget;
 class Target;
 class Task;
 
@@ -23,6 +24,7 @@ public:
 protected:
        Builder &builder;
        std::string tag;
+       FileTarget *executable;
        SuffixList input_suffixes;
        SuffixList aux_suffixes;
        SearchPath system_path;
@@ -32,6 +34,8 @@ public:
        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;