X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.cpp;h=627ba66ccf6ab6defbcaa960c09fbca775845b14;hb=HEAD;hp=a3f3b132447f3213ce7d5f0f797751f90beae79b;hpb=bf0883b6dd3946612922aa1b7c04a87d06442df7;p=builder.git diff --git a/source/architecture.cpp b/source/architecture.cpp deleted file mode 100644 index a3f3b13..0000000 --- a/source/architecture.cpp +++ /dev/null @@ -1,308 +0,0 @@ -#include -#include -#include -#include "architecture.h" -#include "builder.h" -#include "executable.h" -#include "objectfile.h" -#include "sharedlibrary.h" -#include "staticlibrary.h" -#include "sysutils.h" - -using namespace std; -using namespace Msp; - -namespace { - -const char *types[] = -{ - "x86", - "arm", - "ppc", - 0 -}; - -const char *cpus[] = -{ - "i386", "x86", - "i486", "x86", - "pentium", "x86", - "pentiumpro", "x86", - "pentium2", "x86", - "pentium3", "x86", - "pentium4", "x86", - "core2", "x86", - "nehalem", "x86", - "k6", "x86", - "athlon", "x86", - "athlonxp", "x86", - "athlon64", "x86", - "armv5", "arm", - "armv6", "arm", - "armv7", "arm", - "armv7a", "arm", - 0 -}; - -const char *fpus[] = -{ - "387", "x86", - "sse", "x86", - "vfpv3", "arm", - "neon", "arm", - 0 -}; - -const char *systems[] = -{ - "linux", - "freebsd", - "darwin", - "windows", - "android", - 0 -}; - -const char *toolchains[] = -{ - "gnu", - "clang", - 0 -}; - -const char *aliases[] = -{ - "pc", "x86", - "x86_64", "x86-64", - "x64", "x86-64", - "amd64", "x86-64", - "i586", "pentium", - "i686", "pentiumpro", - "corei7", "nehalem", - "win32", "windows-32", - "win64", "windows-64", - "power macintosh", "ppc", - "armeabi", "arm", - "v7a", "armv7a", - "gcc", "gnu", - "mingw", "windows-gnu", - 0 -}; - -} - -Architecture::Architecture(Builder &b, const string &spec): - builder(b), - bits(0), - native(false) -{ - if(spec.empty()) - { - parse_specification(get_system_type()); - // We really only want to set type for the default arch - cpu.clear(); - bits = sizeof(void *)*numeric_limits::digits; - native = true; - } - else - { - parse_specification(spec); - const Architecture &native_arch = builder.get_native_arch(); - if(type.empty()) - type = native_arch.type; - if(system.empty()) - system = native_arch.system; - if(!bits) - { - if(type==native_arch.type) - bits = native_arch.bits; - else - bits = 32; - } - - if(type!=native_arch.type || system!=native_arch.system) - cross_prefix = format("%s-%s", type, system); - 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-%s", bits, system, toolchain); - - add_pattern("%.o"); - if(system=="windows") - { - add_pattern("%.dll"); - add_pattern("lib%.dll"); - /* XXX Hack: Consider import libraries (*.dll.a) as dynamic libraries, - even though technically they are linked statically. */ - add_pattern("lib%.dll.a"); - add_pattern("lib%.a"); - add_pattern("%.lib"); - add_pattern("%.exe"); - } - else - { - if(system=="darwin") - add_pattern("lib%.dylib"); - else - add_pattern("lib%.so"); - add_pattern("lib%.a"); - add_pattern("%"); - } -} - -bool Architecture::match_name(const string &pattern) const -{ - bool negate = (pattern[0]=='!'); - vector parts = split(pattern.substr(negate), "-"); - resolve_aliases(parts); - for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - { - if((*i=="32" && bits==32) || (*i=="64" && bits==64)) - ; - else if(*i!=type && *i!=cpu && *i!=fpu && *i!=system && *i!=toolchain) - return negate; - } - return !negate; -} - -string Architecture::best_match(const vector &names) const -{ - string best; - unsigned best_size = 0; - for(vector::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) - { - best = *i; - best_size = size; - } - } - - return best; -} - -template -void Architecture::add_pattern(const string &pat) -{ - filename_patterns[typeid(T).name()].push_back(Pattern(pat)); -} - -void Architecture::resolve_aliases(vector &parts) -{ - for(unsigned i=0; i rparts = split(replace, "-"); - parts[i] = rparts[0]; - parts.insert(parts.begin()+i+1, rparts.begin()+1, rparts.end()); - i += rparts.size()-1; - } - else - parts[i] = replace; - } - } -} - -void Architecture::parse_specification(const string &spec) -{ - vector parts = split(spec, "-"); - resolve_aliases(parts); - for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - { - bool ok = false; - - for(unsigned j=0; (!ok && types[j]); ++j) - if(*i==types[j]) - { - if(!type.empty() && *i!=type) - throw invalid_argument("Conflicting type specification"); - type = *i; - ok = true; - } - - for(unsigned j=0; (!ok && cpus[j]); j+=2) - if(*i==cpus[j]) - { - if(type.empty()) - type = cpus[j+1]; - else if(cpus[j+1]!=type) - throw invalid_argument("Conflicting CPU specification"); - cpu = *i; - ok = true; - } - - for(unsigned j=0; (!ok && fpus[j]); j+=2) - if(*i==fpus[j]) - { - if(fpus[j+1]!=type) - throw invalid_argument("Conflicting FPU specification"); - fpu = *i; - ok = true; - } - - for(unsigned j=0; (!ok && systems[j]); ++j) - if(*i==systems[j]) - { - system = *i; - 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(*i); - ok = true; - } - - if(!ok) - throw invalid_argument("Unrecognized part in arch specification: "+*i); - } -} - - -Architecture::Loader::Loader(Architecture &a): - DataFile::ObjectLoader(a) -{ - add("prefix", &Architecture::cross_prefix); -}