]> git.tdb.fi Git - builder.git/blobdiff - source/builder.cpp
Avoid a memory leak if Builder::set_architecture is called again
[builder.git] / source / builder.cpp
index 032bb87001d17cc9dff7e0c8d33b03eeb96f39cd..6f90c9d417598747e74daedac3bb7e7e30301631 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>
@@ -47,6 +48,9 @@ Builder::~Builder()
 
 void Builder::set_architecture(const string &name)
 {
+       if(current_arch!=&native_arch)
+               delete current_arch;
+
        if(name.empty())
        {
                current_arch = &native_arch;
@@ -92,17 +96,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)