X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.cpp;h=a9434986a91170a3de3ef4c7e6462b7b2ee1c911;hb=081e13e6f146d1685bdcb1ec1c82752f4c6d264d;hp=3a9f5549df5f7a2add49547dbf05c22d122117e3;hpb=43bd25ffcb0b4f7882773f4676b209a99cb73c04;p=builder.git diff --git a/source/architecture.cpp b/source/architecture.cpp index 3a9f554..a943498 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -14,26 +14,31 @@ namespace { const char *types[] = { - "pc", + "x86", "arm", + "ppc", 0 }; const char *cpus[] = { - "i386", "pc", - "i486", "pc", - "pentium", "pc", - "pentiumpro", "pc", - "pentium2", "pc", - "pentium3", "pc", - "pentium4", "pc", - "core2", "pc", - "k6", "pc", - "athlon", "pc", - "athlonxp", "pc", - "athlon64", "pc", + "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 }; @@ -41,16 +46,25 @@ const char *systems[] = { "linux", "freebsd", + "darwin", "windows", + "android", 0 }; const char *aliases[] = { - "i586", "pentium", - "i686", "pentiumpro", - "x86_64", "athlon64", - "win32", "windows", + "pc", "x86", + "x86_64", "x86-64", + "amd64", "x86-64", + "i586", "pentium", + "i686", "pentiumpro", + "corei7", "nehalem", + "win32", "windows-32", + "win64", "windows-64", + "power macintosh", "ppc", + "armeabi", "arm", + "v7a", "armv7a", 0 }; @@ -84,8 +98,6 @@ Architecture::Architecture(Builder &b, const string &spec): const Architecture &native_arch = builder.get_native_arch(); if(type.empty()) type = native_arch.type; - if(cpu.empty()) - cpu = native_arch.cpu; if(system.empty()) system = native_arch.system; if(!bits) @@ -98,118 +110,117 @@ 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()) name += format("-%s", cpu); name += format("-%d-%s", bits, system); -} - -void Architecture::set_tool(const string &t, const string &p) -{ - tools[t] = p; -} - -void Architecture::set_cross_prefix(const string &p) -{ - cross_prefix = p; -} -std::string Architecture::get_tool(const string &t) const -{ - StringMap::const_iterator i = tools.find(t); - if(i!=tools.end()) + if(system=="windows") { - if(i->second[0]=='-') - return cross_prefix+i->second; - else - return i->second; + sharedlib_patterns.push_back(Pattern("%.dll")); + sharedlib_patterns.push_back(Pattern("lib%.dll")); + /* XXX Hack: Consider import libraries (*.dll.a) as dynamic libraries, + even though technically they are linked statically. */ + sharedlib_patterns.push_back(Pattern("lib%.dll.a")); + staticlib_patterns.push_back(Pattern("lib%.a")); + executable_patterns.push_back(Pattern("%.exe")); } - - const Architecture &native_arch = builder.get_native_arch(); - if(this!=&native_arch) + else { - if(!cross_prefix.empty()) - return cross_prefix+"-"+native_arch.get_tool(t); + if(system=="darwin") + sharedlib_patterns.push_back(Pattern("lib%.dylib")); else - return native_arch.get_tool(t); + sharedlib_patterns.push_back(Pattern("lib%.so")); + staticlib_patterns.push_back(Pattern("lib%.a")); + executable_patterns.push_back(Pattern("%")); } - else - throw invalid_argument("Unknown tool"); } bool Architecture::match_name(const string &pattern) const { - vector parts = split(pattern, "-"); + bool negate = (pattern[0]=='!'); + vector parts = split(pattern.substr(negate), "-"); + resolve_aliases(parts); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) { - string part = resolve_alias(*i); - if((part=="32" && bits==32) || (part=="64" && bits==64)) + if((*i=="32" && bits==32) || (*i=="64" && bits==64)) ; - else if(part!=type && part!=cpu && part!=system) - return false; + else if(*i!=type && *i!=cpu && *i!=system) + return negate; } - return true; + return !negate; } -string Architecture::resolve_alias(const string &part) const +void Architecture::resolve_aliases(vector &parts) { - for(unsigned j=0; aliases[j]; j+=2) - if(part==aliases[j]) - return aliases[j+1]; + 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) { - string part = resolve_alias(*i); - bool ok = false; for(unsigned j=0; (!ok && types[j]); ++j) - if(part==types[j]) + if(*i==types[j]) { - if(!type.empty() && part!=type) + if(!type.empty() && *i!=type) throw invalid_argument("Conflicting type specification"); - type = part; + type = *i; ok = true; } for(unsigned j=0; (!ok && cpus[j]); j+=2) - if(part==cpus[j]) + if(*i==cpus[j]) { if(type.empty()) type = cpus[j+1]; else if(cpus[j+1]!=type) throw invalid_argument("Conflicting CPU specification"); - cpu = part; + cpu = *i; ok = true; } for(unsigned j=0; (!ok && systems[j]); ++j) - if(part==systems[j]) + if(*i==systems[j]) { - system = part; + system = *i; ok = true; } - if(!ok && (part=="32" || part=="64")) + if(!ok && (*i=="32" || *i=="64")) { - bits = lexical_cast(part); + bits = lexical_cast(*i); ok = true; } @@ -220,13 +231,7 @@ void Architecture::parse_specification(const string &spec) Architecture::Loader::Loader(Architecture &a): - arch(a) + DataFile::ObjectLoader(a) { add("prefix", &Architecture::cross_prefix); - add("tool", &Loader::tool); -} - -void Architecture::Loader::tool(const string &t, const string &p) -{ - arch.tools[t] = p; }