]> git.tdb.fi Git - builder.git/blobdiff - source/architecture.cpp
Make object file names configurable through Architecture
[builder.git] / source / architecture.cpp
index 627ba66ccf6ab6defbcaa960c09fbca775845b14..63ec6ba3f3dc5da4f60bd814a592547c0c1c1d15 100644 (file)
@@ -1,5 +1,5 @@
 #include <limits>
-#ifndef WIN32
+#ifndef _WIN32
 #include <sys/utsname.h>
 #endif
 #include <msp/strings/format.h>
@@ -61,6 +61,13 @@ const char *systems[] =
        0
 };
 
+const char *toolchains[] =
+{
+       "gnu",
+       "clang",
+       0
+};
+
 const char *aliases[] =
 {
        "pc",              "x86",
@@ -74,6 +81,8 @@ const char *aliases[] =
        "power macintosh", "ppc",
        "armeabi",         "arm",
        "v7a",             "armv7a",
+       "gcc",             "gnu",
+       "mingw",           "windows-gnu",
        0
 };
 
@@ -86,7 +95,7 @@ Architecture::Architecture(Builder &b, const string &spec):
 {
        if(spec.empty())
        {
-#ifdef WIN32
+#ifdef _WIN32
                system = "windows";
 #else
                utsname un;
@@ -122,13 +131,23 @@ Architecture::Architecture(Builder &b, const string &spec):
                else if(bits==native_arch.bits)
                        native = true;
        }
+
+       if(toolchain.empty())
+       {
+               if((system=="darwin" || system=="freebsd") && builder.get_vfs().find_binary("clang"))
+                       toolchain = "clang";
+               else
+                       toolchain = "gnu";
+       }
+
        name = type;
        if(!cpu.empty())
                name += format("-%s", cpu);
        if(!fpu.empty())
                name += format("-%s", fpu);
-       name += format("-%d-%s", bits, system);
+       name += format("-%d-%s-%s", bits, system, toolchain);
 
+       object_patterns.push_back(Pattern("%.o"));
        if(system=="windows")
        {
                sharedlib_patterns.push_back(Pattern("%.dll"));
@@ -160,7 +179,7 @@ bool Architecture::match_name(const string &pattern) const
        {
                if((*i=="32" && bits==32) || (*i=="64" && bits==64))
                        ;
-               else if(*i!=type && *i!=cpu && *i!=fpu && *i!=system)
+               else if(*i!=type && *i!=cpu && *i!=fpu && *i!=system && *i!=toolchain)
                        return negate;
        }
        return !negate;
@@ -263,6 +282,13 @@ void Architecture::parse_specification(const string &spec)
                                ok = true;
                        }
 
+               for(unsigned j=0; (!ok && toolchains[j]); ++j)
+                       if(*i==toolchains[j])
+                       {
+                               toolchain = *i;
+                               ok = true;
+                       }
+
                if(!ok && (*i=="32" || *i=="64"))
                {
                        bits = lexical_cast<unsigned>(*i);