]> git.tdb.fi Git - builder.git/commitdiff
Redesign the way commands are set for tools
authorMikko Rasa <tdb@tdb.fi>
Fri, 24 May 2013 17:27:01 +0000 (20:27 +0300)
committerMikko Rasa <tdb@tdb.fi>
Fri, 24 May 2013 17:28:31 +0000 (20:28 +0300)
This is necessary for some future developments.

13 files changed:
source/datatool.cpp
source/datatool.h
source/gnuarchiver.cpp
source/gnuarchiver.h
source/gnuccompiler.cpp
source/gnucompiler.cpp
source/gnucompiler.h
source/gnucxxcompiler.cpp
source/gnulinker.cpp
source/mingwdlltool.cpp
source/mingwdlltool.h
source/tool.cpp
source/tool.h

index eeeec4ea68b30706a670c6b84ffd0af98d64cfdf..9b101c7bf6187332636615af74a058ed06127c2f 100644 (file)
@@ -15,6 +15,7 @@ using namespace Msp;
 DataTool::DataTool(Builder &b):
        Tool(b, "DATA")
 {
+       set_command("mspdatatool");
        input_suffixes.push_back(".mdt");
 }
 
@@ -47,11 +48,6 @@ Target *DataTool::create_target(const list<Target *> &sources, const string &arg
                throw invalid_argument("DataTool::create_target");
 }
 
-void DataTool::do_prepare()
-{
-       set_executable("mspdatatool");
-}
-
 Task *DataTool::run(const Target &tgt) const
 {
        const Component &comp = *tgt.get_component();
index f2720c005b3622e657a8309e17c8e58ca6e308b8..264ddc1523527a615be087f41faf4f8fa542e8b8 100644 (file)
@@ -10,9 +10,6 @@ public:
 
        virtual Target *create_source(const Component &, const Msp::FS::Path &) const;
        virtual Target *create_target(const std::list<Target *> &, const std::string &);
-private:
-       virtual void do_prepare();
-public:
        virtual Task *run(const Target &) const;
 };
 
index cc4359e90071235a57df19c0ac59a3a58fd12088..6cf4adb90f80c0df53ff686e5da0e42d04c0ae31 100644 (file)
@@ -16,6 +16,7 @@ using namespace Msp;
 GnuArchiver::GnuArchiver(Builder &b, const Architecture &a):
        Tool(b, a, "AR")
 {
+       set_command("ar", true);
        input_suffixes.push_back(".o");
 }
 
@@ -39,11 +40,6 @@ Target *GnuArchiver::create_target(const list<Target *> &sources, const string &
        return lib;
 }
 
-void GnuArchiver::do_prepare()
-{
-       set_executable("ar", true);
-}
-
 Task *GnuArchiver::run(const Target &target) const
 {
        const StaticLibrary &lib = dynamic_cast<const StaticLibrary &>(target);
index 2c625b6c82265257148bfb4d7950a98163f88b01..eab49339af07d0223f48fe5fdc783900bc227298 100644 (file)
@@ -9,9 +9,6 @@ public:
        GnuArchiver(Builder &, const Architecture &);
 
        virtual Target *create_target(const std::list<Target *> &, const std::string &);
-private:
-       virtual void do_prepare();
-public:
        virtual Task *run(const Target &) const;
 };
 
index 7089a26ec341a1dfe3e0e8c2c5b18a3e5755d4b3..cedea1050bb7390df3d6e3424c2bcb916a2f0c75 100644 (file)
@@ -5,8 +5,9 @@ using namespace std;
 using namespace Msp;
 
 GnuCCompiler::GnuCCompiler(Builder &b, const Architecture &a):
-       GnuCompiler(b, a, "CC", "gcc")
+       GnuCompiler(b, a, "CC")
 {
+       set_command("gcc", true);
        input_suffixes.push_back(".c");
        aux_suffixes.push_back(".h");
 }
index 5f69c0dca49ad5585153398cce07a20de07c9f32..cd7391f0277175578a22536e1bd3d5bb7a122368 100644 (file)
@@ -13,9 +13,8 @@
 using namespace std;
 using namespace Msp;
 
-GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t, const string &c):
-       Tool(b, a, t),
-       command(c)
+GnuCompiler::GnuCompiler(Builder &b, const Architecture &a, const string &t):
+       Tool(b, a, t)
 {
        if(architecture->is_native())
                system_path.push_back("/usr/include");
@@ -52,11 +51,6 @@ string GnuCompiler::create_build_signature(const BuildInfo &binfo) const
        return result;
 }
 
-void GnuCompiler::do_prepare()
-{
-       set_executable(command, true);
-}
-
 Task *GnuCompiler::run(const Target &target) const
 {
        const ObjectFile &object = dynamic_cast<const ObjectFile &>(target);
index 0c283e22827ac3f1afa05bdd4f6302bb032bd99d..af3761bcfa62de57535332503edbac10955b286b 100644 (file)
@@ -12,18 +12,12 @@ appropriate type.
 */
 class GnuCompiler: public Tool
 {
-private:
-       std::string command;
-
 protected:
-       GnuCompiler(Builder &, const Architecture &, const std::string &, const std::string &);
+       GnuCompiler(Builder &, const Architecture &, const std::string &);
 
 public:
        virtual Target *create_target(const std::list<Target *> &, const std::string &);
        virtual std::string create_build_signature(const BuildInfo &) const;
-protected:
-       virtual void do_prepare();
-public:
        virtual Task *run(const Target &) const;
 };
 
index 1926a5ed14bcc3e74a17fab214152c3ce87ca2a4..55f7109e7b05470bb03ac690d98a970ce0323bf4 100644 (file)
@@ -11,8 +11,9 @@ using namespace std;
 using namespace Msp;
 
 GnuCxxCompiler::GnuCxxCompiler(Builder &b, const Architecture &a):
-       GnuCompiler(b, a, "CXX", "g++")
+       GnuCompiler(b, a, "CXX")
 {
+       set_command("g++", true);
        input_suffixes.push_back(".cpp");
        input_suffixes.push_back(".cc");
        aux_suffixes.push_back(".hpp");
index 9ae5d640e3e8fcec5106133fce9c2a422fa11328..ea448acdcf3105980709bca561a1c1b3bc2ceb28 100644 (file)
@@ -115,7 +115,14 @@ Task *GnuLinker::run(const Target &) const
 GnuLinker::Linker::Linker(GnuLinker &p, const string &ct):
        SubTool(p),
        compiler_tag(ct)
-{ }
+{
+       if(compiler_tag=="CC")
+               set_command("gcc", true);
+       else if(compiler_tag=="CXX")
+               set_command("g++", true);
+       else
+               throw invalid_argument("GnuLinker::Linker::Linker");
+}
 
 Target *GnuLinker::Linker::create_target(const list<Target *> &sources, const string &arg)
 {
@@ -150,18 +157,6 @@ void GnuLinker::Linker::do_prepare()
                compiler.prepare();
                executable = compiler.get_executable();
        }
-       else
-       {
-               string command;
-               if(compiler_tag=="CC")
-                       command = "gcc";
-               else if(compiler_tag=="CXX")
-                       command = "g++";
-               else
-                       throw invalid_argument("GnuLinker::Linker::Linker");
-
-               set_executable(command, true);
-       }
 }
 
 Task *GnuLinker::Linker::run(const Target &target) const
index 1bb35093620aac6edfda6f85dd149514bdd91596..03babd4126e09df7ff8869f5da214807094fb530 100644 (file)
@@ -17,7 +17,9 @@ using namespace Msp;
 
 MingwDllTool::MingwDllTool(Builder &b, const Architecture &a):
        Tool(b, a, "DLL")
-{ }
+{
+       set_command("dlltool", true);
+}
 
 Target *MingwDllTool::create_target(const list<Target *> &sources, const string &)
 {
@@ -55,11 +57,6 @@ Target *MingwDllTool::create_install(Target &target) const
                return 0;
 }
 
-void MingwDllTool::do_prepare()
-{
-       set_executable("dlltool", true);
-}
-
 Task *MingwDllTool::run(const Target &target) const
 {
        const ImportLibrary *imp = dynamic_cast<const ImportLibrary *>(&target);
index 796da75024f6876cce0657522d0f1610bed5156e..2930831b9f908b3ccc314bd92f3f42c25c778450 100644 (file)
@@ -10,11 +10,6 @@ public:
 
        virtual Target *create_target(const std::list<Target *> &, const std::string &);
        virtual Target *create_install(Target &) const;
-
-private:
-       virtual void do_prepare();
-
-public:
        virtual Task *run(const Target &) const;
 };
 
index 8aa75dcafd982646980871b59ff74c796d5a00ca..abded33f7aba8131d1f64d8b6c050a3da1e7d504 100644 (file)
@@ -23,6 +23,17 @@ Tool::Tool(Builder &b, const Architecture &a, const string &t):
        prepared(false)
 { }
 
+void Tool::set_command(const string &cmd, bool cross)
+{
+       if(cmd.empty())
+               throw invalid_argument("Tool::set_command");
+
+       if(cross && architecture->is_cross())
+               command = format("%s-%s", architecture->get_cross_prefix(), cmd);
+       else
+               command = cmd;
+}
+
 bool Tool::accepts_suffix(const string &suffix, bool aux) const
 {
        if(find(input_suffixes.begin(), input_suffixes.end(), suffix)!=input_suffixes.end())
@@ -47,16 +58,12 @@ void Tool::prepare()
 
        prepared = true;
        do_prepare();
-}
-
-void Tool::set_executable(const string &command, bool cross)
-{
-       if(cross && architecture->is_cross())
-               return set_executable(format("%s-%s", architecture->get_cross_prefix(), command), false);
-
-       executable = builder.get_vfs().find_binary(command);
-       if(!executable)
-               problems.push_back(format("Can't find executable %s", command));
+       if(!executable && !command.empty())
+       {
+               executable = builder.get_vfs().find_binary(command);
+               if(!executable)
+                       problems.push_back(format("Can't find executable %s", command));
+       }
 }
 
 
index be3646cd8f0f674a6022980a1205de5aa5c7b6b9..7531bbf86b945e82638ea0044a106001b4a45931 100644 (file)
@@ -27,6 +27,7 @@ protected:
        Builder &builder;
        const Architecture *architecture;
        std::string tag;
+       std::string command;
        FileTarget *executable;
        SuffixList input_suffixes;
        SuffixList aux_suffixes;
@@ -45,8 +46,15 @@ public:
        tool is architecture-agnostic. */
        const Architecture *get_architecture() const { return architecture; }
 
+       /** Overrides the command used by the tool.  The new command should accept
+       the same command line arguments.  Only works on tools that use an external
+       command.  If cross is true and the architecture is not native, a cross
+       prefix is added to the command.  May have no effect after prepare() has been
+       called. */
+       void set_command(const std::string &cmd, bool cross = false);
+
        /** Returns a target for the tool's own executable.  If the tool does not
-       use an external program, returns null. */
+       use an external program, returns null.  The tool must be prepared first. */
        FileTarget *get_executable() const { return executable; }
 
        /// Returns a list of suffixes that can be processed with this tool.
@@ -90,11 +98,6 @@ public:
 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; }