]> git.tdb.fi Git - builder.git/commitdiff
Use priorities to determine the default toolchain
authorMikko Rasa <tdb@tdb.fi>
Mon, 26 Dec 2022 11:28:21 +0000 (13:28 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 26 Dec 2022 11:34:51 +0000 (13:34 +0200)
12 files changed:
source/androidtools.cpp
source/androidtools.h
source/architecture.cpp
source/builder.cpp
source/clangtools.cpp
source/clangtools.h
source/gnutools.cpp
source/gnutools.h
source/microsofttools.cpp
source/microsofttools.h
source/toolchain.cpp
source/toolchain.h

index 0073dff18e7624109e44d0a7d10482f530d5451e..e0f2bb1087aee7989bc04f6640018f10a2527612 100644 (file)
@@ -224,6 +224,7 @@ void AndroidNdk::init_api_level(unsigned api)
 
 
 AndroidTools::AndroidTools(Builder &builder, const Architecture &arch):
+       Toolchain("android-gnu", get_priority(arch)),
        sdk(builder),
        ndk(builder, arch, sdk)
 {
@@ -248,3 +249,11 @@ AndroidTools::AndroidTools(Builder &builder, const Architecture &arch):
        add_tool(new ApkBuilder(builder));
        add_tool(new JarSigner(builder));
 }
+
+int AndroidTools::get_priority(const Architecture &arch)
+{
+       if(arch.get_system()=="android")
+               return 30;
+       else
+               return -10;
+}
index b08691c1434ce011e40eee4004d3ca0699e91725..6410cddff4016f66371a98001b1fea627eb39c3d 100644 (file)
@@ -78,6 +78,8 @@ private:
 
 public:
        AndroidTools(Builder &, const Architecture &);
+
+       static int get_priority(const Architecture &);
 };
 
 #endif
index 758d8b9b3a264d5f3905d9d18f10b033b7849e15..dbe40010c896680dfebbc6c0382f34fff06ad106 100644 (file)
@@ -128,16 +128,6 @@ Architecture::Architecture(Builder &b, const string &spec):
                        native = true;
        }
 
-       if(toolchain.empty())
-       {
-               if((system=="darwin" || system=="freebsd") && builder.get_vfs().find_binary("clang"))
-                       toolchain = "clang";
-               else if(system=="windows" && native)
-                       toolchain = "msvc";
-               else
-                       toolchain = "gnu";
-       }
-
        update();
 }
 
@@ -154,7 +144,9 @@ void Architecture::update()
                name += format("-%s", cpu);
        if(!fpu.empty())
                name += format("-%s", fpu);
-       name += format("-%d-%s-%s", bits, system, toolchain);
+       name += format("-%d-%s", bits, system);
+       if(!toolchain.empty())
+               name += format("-%s", toolchain);
 
        filename_patterns.clear();
        if(system=="windows")
index 032bb87001d17cc9dff7e0c8d33b03eeb96f39cd..3fbb1b6c4d56d7e4eb3daa04047857cf0ade8c03 100644 (file)
@@ -1,5 +1,6 @@
 #include <deque>
 #include <set>
+#include <msp/core/algorithm.h>
 #include <msp/core/except.h>
 #include <msp/core/maputils.h>
 #include <msp/datafile/parser.h>
@@ -92,17 +93,18 @@ void Builder::set_temp_directory(const FS::Path &p)
 
 void Builder::add_default_tools()
 {
-       const string &arch_tc = current_arch->get_toolchain();
+       toolchain.add_toolchain(new GnuTools(*this, *current_arch));
+       toolchain.add_toolchain(new ClangTools(*this, *current_arch));
        if(current_arch->get_system()=="android")
                toolchain.add_toolchain(new AndroidTools(*this, *current_arch));
-       else if(arch_tc=="msvc")
+       if(current_arch->get_system()=="windows")
                toolchain.add_toolchain(new MicrosoftTools(*this, *current_arch));
-       else if(arch_tc=="clang")
-               toolchain.add_toolchain(new ClangTools(*this, *current_arch));
-       else if(arch_tc=="gnu")
-               toolchain.add_toolchain(new GnuTools(*this, *current_arch));
        toolchain.add_toolchain(new BuiltinTools(*this));
        toolchain.add_tool(new DataTool(*this));
+
+       auto i = find_if(toolchain.get_toolchains(), [](const Toolchain *tc){ return (tc->has_tool("CC") || tc->has_tool("CXX")); });
+       if(i!=toolchain.get_toolchains().end())
+               current_arch->refine((*i)->get_name());
 }
 
 void Builder::set_logger(const Logger *l)
index d0910ff28fa9a171dc85027fa78bdc2a5eb58379..80968a71cd18dead38e6de5ff1bd0c6e1c50c58d 100644 (file)
@@ -6,7 +6,8 @@
 
 using namespace std;
 
-ClangTools::ClangTools(Builder &builder, const Architecture &arch)
+ClangTools::ClangTools(Builder &builder, const Architecture &arch):
+       Toolchain("clang", get_priority(arch))
 {
        add_tool(new ClangCompiler(builder, arch, "CC"));
        add_tool(new ClangCompiler(builder, arch, "CXX"));
@@ -15,3 +16,13 @@ ClangTools::ClangTools(Builder &builder, const Architecture &arch)
        add_tool(new GnuLinker(builder, arch));
        add_tool(new GnuArchiver(builder, arch));
 }
+
+int ClangTools::get_priority(const Architecture &arch)
+{
+       if(arch.get_toolchain()=="clang")
+               return 20;
+       else if(arch.get_system()=="darwin" || arch.get_system()=="freebsd")
+               return 10;
+       else
+               return 0;
+}
index ba86cc3f2e62f718449c1d7557445b339b3ee681..9faaf1a551587ac44b9e04db7e87d0173ac898de 100644 (file)
@@ -10,6 +10,8 @@ class ClangTools: public Toolchain
 {
 public:
        ClangTools(Builder &, const Architecture &);
+
+       static int get_priority(const Architecture &);
 };
 
 #endif
index fdd6e797414c86e6c47e38c791be1bd0bac77ac1..e64bcdb23b55a20ed66e040b5e512f30d95c8024 100644 (file)
@@ -5,7 +5,8 @@
 #include "gnutools.h"
 #include "mingwdlltool.h"
 
-GnuTools::GnuTools(Builder &builder, const Architecture &arch)
+GnuTools::GnuTools(Builder &builder, const Architecture &arch):
+       Toolchain("gnu", get_priority(arch))
 {
        add_tool(new GnuCompiler(builder, arch, "CC"));
        add_tool(new GnuCompiler(builder, arch, "CXX"));
@@ -17,3 +18,13 @@ GnuTools::GnuTools(Builder &builder, const Architecture &arch)
        if(arch.get_system()=="windows")
                add_tool(new MingwDllTool(builder, arch));
 }
+
+int GnuTools::get_priority(const Architecture &arch)
+{
+       if(arch.get_toolchain()=="gnu")
+               return 20;
+       else if(arch.get_system()=="linux")
+               return 10;
+       else
+               return 0;
+}
index 98e2856c4a7fd51b4616bfa8d230431c2a1bff50..5aeb966b7643e7a4f4e6c5edb45bf88a0ff4d4b9 100644 (file)
@@ -10,6 +10,8 @@ class GnuTools: public Toolchain
 {
 public:
        GnuTools(Builder &, const Architecture &);
+
+       static int get_priority(const Architecture &);
 };
 
 #endif
index d6ed9e4babdcc91133335a4051accc6b7008eda3..c320ecb6ee38d35a989465f071b8e1c9edcc0c0a 100644 (file)
@@ -13,7 +13,8 @@
 using namespace std;
 using namespace Msp;
 
-MicrosoftTools::MicrosoftTools(Builder &builder, const Architecture &arch)
+MicrosoftTools::MicrosoftTools(Builder &builder, const Architecture &arch):
+       Toolchain("msvc", get_priority(arch))
 {
        find_vc_bin_dir(builder, arch);
        find_windows_sdk_dir(builder);
@@ -86,3 +87,13 @@ void MicrosoftTools::find_windows_sdk_dir(Builder &builder)
 
        builder.get_logger().log("tools", "Windows SDK version %s found in %s", win_sdk_version, win_sdk_dir);
 }
+
+int MicrosoftTools::get_priority(const Architecture &arch)
+{
+       if(arch.get_toolchain()=="msvc")
+               return 20;
+       else if(arch.get_system()=="windows")
+               return 10;
+       else
+               return 0;
+}
index 027499a5dba3cb6f86cec3917f9bcdb7bede4d91..f2e3c379d7642368a2f9688999541c938c9519a7 100644 (file)
@@ -27,6 +27,8 @@ public:
        const Msp::FS::Path &get_vc_bin_dir() const { return vc_bin_dir; }
        const Msp::FS::Path &get_windows_sdk_dir() const { return win_sdk_dir; }
        const std::string &get_windows_sdk_version() const { return win_sdk_version; }
+
+       static int get_priority(const Architecture &);
 };
 
 #endif
index 8790c83dca0737e186a868900cc8d2665343484b..c5b8caa9ffb6dbe2b9e13b79eb9dd6e43083318e 100644 (file)
@@ -1,4 +1,4 @@
-#include <algorithm>
+#include <msp/core/algorithm.h>
 #include <msp/core/maputils.h>
 #include "tool.h"
 #include "toolchain.h"
@@ -21,7 +21,8 @@ void Toolchain::add_tool(Tool *tool)
 
 void Toolchain::add_toolchain(Toolchain *chain)
 {
-       chains.push_back(chain);
+       auto i = upper_bound(chains, chain->get_priority(), [](int p, Toolchain *tc){ return p>tc->get_priority(); });
+       chains.insert(i, chain);
 }
 
 bool Toolchain::has_tool(const string &tag) const
index ea452408cd4c6c25ba900a4d662ccc9847ec8f85..34fc0a2b6651a77eda77c44c97c4679edd8057db 100644 (file)
@@ -13,17 +13,25 @@ A container for tools.  Performs lookup based on tag or filename extension.
 class Toolchain
 {
 private:
+       std::string name;
+       int priority = 0;
        std::map<std::string, Tool *> tools;
        std::vector<Toolchain *> chains;
 
+protected:
+       Toolchain(const std::string &n, unsigned p): name(n), priority(p) { }
 public:
+       Toolchain() = default;
        ~Toolchain();
 
+       const std::string &get_name() const { return name; }
+       int get_priority() const { return priority; }
        void add_tool(Tool *);
        void add_toolchain(Toolchain *);
        bool has_tool(const std::string &) const;
        Tool &get_tool(const std::string &) const;
        Tool *get_tool_for_suffix(const std::string &, bool = false) const;
+       const std::vector<Toolchain *> &get_toolchains() { return chains; }
 };
 
 #endif