X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.cpp;h=e0b69667952c64c1ad2e70229e5c4e951a128d7f;hb=7e5ac6af8987bf12f3e338d00e96e8cb74f3534b;hp=436a45afcfb8e0036381089ae7f596adf98e1b03;hpb=433f9ef196b6f5af6bb38447b650f5afaa5a783a;p=builder.git diff --git a/source/architecture.cpp b/source/architecture.cpp index 436a45a..e0b6966 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -1,15 +1,8 @@ -/* $Id$ - -This file is part of builder -Copyright © 2007-2010 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #include #ifndef WIN32 #include #endif -#include +#include #include #include "architecture.h" #include "builder.h" @@ -28,21 +21,19 @@ const char *types[] = const char *cpus[] = { - "i386", "pc", 0, - "i486", "pc", 0, - "pentium", "pc", 0, - "i586", "pc", "pentium", - "pentiumpro", "pc", 0, - "i686", "pc", "pentiumpro", - "pentium2", "pc", 0, - "pentium3", "pc", 0, - "pentium4", "pc", 0, - "core2", "pc", 0, - "k6", "pc", 0, - "athlon", "pc", 0, - "athlonxp", "pc", 0, - "athlon64", "pc", 0, - "armv5", "arm", 0, + "i386", "pc", + "i486", "pc", + "pentium", "pc", + "pentiumpro", "pc", + "pentium2", "pc", + "pentium3", "pc", + "pentium4", "pc", + "core2", "pc", + "k6", "pc", + "athlon", "pc", + "athlonxp", "pc", + "athlon64", "pc", + "armv5", "arm", 0 }; @@ -54,6 +45,15 @@ const char *systems[] = 0 }; +const char *aliases[] = +{ + "i586", "pentium", + "i686", "pentiumpro", + "x86_64", "athlon64", + "win32", "windows", + 0 +}; + } Architecture::Architecture(Builder &b, const string &spec): @@ -98,16 +98,8 @@ Architecture::Architecture(Builder &b, const string &spec): if(type!=native_arch.type || system!=native_arch.system) cross_prefix = format("%s-%s", type, system); - else if(bits!=native_arch.bits) - { - build_info.cflags.push_back(format("-m%d", bits)); - build_info.ldflags.push_back(format("-m%d", bits)); - } - else + else if(bits==native_arch.bits) native = true; - - if(!cpu.empty()) - build_info.cflags.push_back(format("-march=%s", cpu)); } name = type; if(!cpu.empty()) @@ -145,7 +137,7 @@ std::string Architecture::get_tool(const string &t) const return native_arch.get_tool(t); } else - throw KeyError("Unknown tool", t); + throw invalid_argument("Unknown tool"); } bool Architecture::match_name(const string &pattern) const @@ -153,49 +145,68 @@ bool Architecture::match_name(const string &pattern) const vector parts = split(pattern, "-"); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { - if(*i!=type && *i!=cpu && *i!=system) + string part = resolve_alias(*i); + if((part=="32" && bits==32) || (part=="64" && bits==64)) + ; + else if(part!=type && part!=cpu && part!=system) return false; } return true; } +string Architecture::resolve_alias(const string &part) const +{ + for(unsigned j=0; aliases[j]; j+=2) + if(part==aliases[j]) + return aliases[j+1]; + + return part; +} + void Architecture::parse_specification(const string &spec) { vector parts = split(spec, "-"); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { + string part = resolve_alias(*i); + bool ok = false; + for(unsigned j=0; (!ok && types[j]); ++j) - if(*i==types[j]) + if(part==types[j]) { - if(!type.empty() && *i!=type) - throw InvalidParameterValue("Conflicting type specification"); - type = *i; + if(!type.empty() && part!=type) + throw invalid_argument("Conflicting type specification"); + type = part; ok = true; } - for(unsigned j=0; (!ok && cpus[j]); j+=3) - if(*i==cpus[j]) + + for(unsigned j=0; (!ok && cpus[j]); j+=2) + if(part==cpus[j]) { if(type.empty()) type = cpus[j+1]; else if(cpus[j+1]!=type) - throw InvalidParameterValue("Conflicting CPU specification"); - cpu = (cpus[j+2] ? cpus[j+2] : *i); + throw invalid_argument("Conflicting CPU specification"); + cpu = part; ok = true; } + for(unsigned j=0; (!ok && systems[j]); ++j) - if(*i==systems[j]) + if(part==systems[j]) { - system = *i; + system = part; ok = true; } - if(!ok && (*i=="32" || *i=="64")) + + if(!ok && (part=="32" || part=="64")) { - bits = lexical_cast(*i); + bits = lexical_cast(part); ok = true; } + if(!ok) - throw InvalidParameterValue("Unrecognized part in arch specification: "+*i); + throw invalid_argument("Unrecognized part in arch specification: "+*i); } }