]> git.tdb.fi Git - builder.git/blobdiff - source/architecture.cpp
Use default member initializers and constructor delegation
[builder.git] / source / architecture.cpp
index 75a64607a395f7726357d52887fb06e65953277c..9662bbaa6f08e2dbcaeef2f9a75c9df77818b99d 100644 (file)
@@ -49,6 +49,8 @@ const char *fpus[] =
 {
        "387",   "x86",
        "sse",   "x86",
+       "sse3",  "x86",
+       "sse4.1", "x86",
        "vfpv3", "arm",
        "neon",  "arm",
        0
@@ -68,6 +70,7 @@ const char *toolchains[] =
 {
        "gnu",
        "clang",
+       "msvc",
        0
 };
 
@@ -93,9 +96,7 @@ const char *aliases[] =
 }
 
 Architecture::Architecture(Builder &b, const string &spec):
-       builder(b),
-       bits(0),
-       native(false)
+       builder(b)
 {
        if(spec.empty())
        {
@@ -131,6 +132,8 @@ Architecture::Architecture(Builder &b, const string &spec):
        {
                if((system=="darwin" || system=="freebsd") && builder.get_vfs().find_binary("clang"))
                        toolchain = "clang";
+               else if(system=="windows" && native)
+                       toolchain = "msvc";
                else
                        toolchain = "gnu";
        }
@@ -142,18 +145,27 @@ Architecture::Architecture(Builder &b, const string &spec):
                name += format("-%s", fpu);
        name += format("-%d-%s-%s", bits, system, toolchain);
 
-       add_pattern<ObjectFile>("%.o");
        if(system=="windows")
        {
                add_pattern<SharedLibrary>("%.dll");
-               add_pattern<SharedLibrary>("lib%.dll");
-               add_pattern<ImportLibrary>("lib%.dll.a");
-               add_pattern<StaticLibrary>("lib%.a");
-               add_pattern<StaticLibrary>("%.lib");
+               if(toolchain=="msvc")
+               {
+                       add_pattern<ObjectFile>("%.obj");
+                       add_pattern<ImportLibrary>("%.lib");
+                       add_pattern<StaticLibrary>("%_static.lib");
+               }
+               else
+               {
+                       add_pattern<ObjectFile>("%.o");
+                       add_pattern<SharedLibrary>("lib%.dll");
+                       add_pattern<ImportLibrary>("lib%.dll.a");
+                       add_pattern<StaticLibrary>("lib%.a");
+               }
                add_pattern<Executable>("%.exe");
        }
        else
        {
+               add_pattern<ObjectFile>("%.o");
                if(system=="darwin")
                        add_pattern<SharedLibrary>("lib%.dylib");
                else
@@ -163,41 +175,42 @@ Architecture::Architecture(Builder &b, const string &spec):
        }
 }
 
-bool Architecture::match_name(const string &pattern) const
+bool Architecture::match_name(const string &pattern, unsigned *quality) const
 {
        bool negate = (pattern[0]=='!');
        vector<string> parts = split(pattern.substr(negate), "-");
        resolve_aliases(parts);
-       for(vector<string>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
+       for(const string &p: parts)
        {
-               if((*i=="32" && bits==32) || (*i=="64" && bits==64))
+               if((p=="32" && bits==32) || (p=="64" && bits==64))
                        ;
-               else if(*i!=type && *i!=cpu && *i!=fpu && *i!=system && *i!=toolchain)
+               else if(p!=type && p!=cpu && p!=fpu && p!=system && p!=toolchain)
+               {
+                       if(quality)
+                               *quality = 0;
                        return negate;
+               }
        }
+
+       if(quality)
+               *quality = parts.size();
        return !negate;
 }
 
 string Architecture::best_match(const vector<string> &names) const
 {
        string best;
-       unsigned best_size = 0;
-       for(vector<string>::const_iterator i=names.begin(); i!=names.end(); ++i)
-               if(match_name(*i))
-               {
-                       /* TODO Do full parse and alias resolution here?  Otherwise x86 and
-                       x86_64 are treated as equally good, even though the latter is more
-                       specific. */
-                       unsigned size = 1;
-                       for(string::const_iterator j=i->begin(); j!=i->end(); ++j)
-                               size += (*j=='-');
-
-                       if(size>best_size)
+       unsigned best_quality = 0;
+       for(const string &n: names)
+       {
+               unsigned quality;
+               if(match_name(n, &quality))
+                       if(quality>best_quality)
                        {
-                               best = *i;
-                               best_size = size;
+                               best = n;
+                               best_quality = quality;
                        }
-               }
+       }
 
        return best;
 }
@@ -241,61 +254,61 @@ void Architecture::parse_specification(const string &spec)
 {
        vector<string> parts = split(spec, "-");
        resolve_aliases(parts);
-       for(vector<string>::const_iterator i=parts.begin(); i!=parts.end(); ++i)
+       for(const string &p: parts)
        {
                bool ok = false;
 
                for(unsigned j=0; (!ok && types[j]); ++j)
-                       if(*i==types[j])
+                       if(p==types[j])
                        {
-                               if(!type.empty() && *i!=type)
+                               if(!type.empty() && p!=type)
                                        throw invalid_argument("Conflicting type specification");
-                               type = *i;
+                               type = p;
                                ok = true;
                        }
 
                for(unsigned j=0; (!ok && cpus[j]); j+=2)
-                       if(*i==cpus[j])
+                       if(p==cpus[j])
                        {
                                if(type.empty())
                                        type = cpus[j+1];
                                else if(cpus[j+1]!=type)
                                        throw invalid_argument("Conflicting CPU specification");
-                               cpu = *i;
+                               cpu = p;
                                ok = true;
                        }
 
                for(unsigned j=0; (!ok && fpus[j]); j+=2)
-                       if(*i==fpus[j])
+                       if(p==fpus[j])
                        {
                                if(fpus[j+1]!=type)
                                        throw invalid_argument("Conflicting FPU specification");
-                               fpu = *i;
+                               fpu = p;
                                ok = true;
                        }
 
                for(unsigned j=0; (!ok && systems[j]); ++j)
-                       if(*i==systems[j])
+                       if(p==systems[j])
                        {
-                               system = *i;
+                               system = p;
                                ok = true;
                        }
 
                for(unsigned j=0; (!ok && toolchains[j]); ++j)
-                       if(*i==toolchains[j])
+                       if(p==toolchains[j])
                        {
-                               toolchain = *i;
+                               toolchain = p;
                                ok = true;
                        }
 
-               if(!ok && (*i=="32" || *i=="64"))
+               if(!ok && (p=="32" || p=="64"))
                {
-                       bits = lexical_cast<unsigned>(*i);
+                       bits = lexical_cast<unsigned>(p);
                        ok = true;
                }
 
                if(!ok)
-                       throw invalid_argument("Unrecognized part in arch specification: "+*i);
+                       throw invalid_argument("Unrecognized part in arch specification: "+p);
        }
 }