X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Farchitecture.cpp;h=758d8b9b3a264d5f3905d9d18f10b033b7849e15;hb=7600faa265e30c62220fe066002f0bdd116a7e48;hp=2efcd5e3e4ee23dc9294cfb04f261ab06ce8f1c8;hpb=7c2db9e2b91da953701be233336c5bfa1f3c4af0;p=builder.git diff --git a/source/architecture.cpp b/source/architecture.cpp index 2efcd5e..758d8b9 100644 --- a/source/architecture.cpp +++ b/source/architecture.cpp @@ -96,9 +96,7 @@ const char *aliases[] = } Architecture::Architecture(Builder &b, const string &spec): - builder(b), - bits(0), - native(false) + builder(b) { if(spec.empty()) { @@ -140,6 +138,17 @@ Architecture::Architecture(Builder &b, const string &spec): toolchain = "gnu"; } + update(); +} + +void Architecture::refine(const string &spec) +{ + parse_specification(spec); + update(); +} + +void Architecture::update() +{ name = type; if(!cpu.empty()) name += format("-%s", cpu); @@ -147,6 +156,7 @@ Architecture::Architecture(Builder &b, const string &spec): name += format("-%s", fpu); name += format("-%d-%s-%s", bits, system, toolchain); + filename_patterns.clear(); if(system=="windows") { add_pattern("%.dll"); @@ -177,7 +187,7 @@ 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 parts = split(pattern.substr(negate), "-"); @@ -187,31 +197,32 @@ bool Architecture::match_name(const string &pattern) const if((p=="32" && bits==32) || (p=="64" && bits==64)) ; 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 &names) const { string best; - unsigned best_size = 0; + unsigned best_quality = 0; for(const string &n: names) - if(match_name(n)) - { - /* 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(char c: n) - size += (c=='-'); - - if(size>best_size) + { + unsigned quality; + if(match_name(n, &quality)) + if(quality>best_quality) { best = n; - best_size = size; + best_quality = quality; } - } + } return best; } @@ -291,6 +302,8 @@ void Architecture::parse_specification(const string &spec) for(unsigned j=0; (!ok && systems[j]); ++j) if(p==systems[j]) { + if(!system.empty() && p!=system) + throw invalid_argument("Conflicting system specification"); system = p; ok = true; } @@ -298,13 +311,18 @@ void Architecture::parse_specification(const string &spec) for(unsigned j=0; (!ok && toolchains[j]); ++j) if(p==toolchains[j]) { + if(!toolchain.empty() && p!=toolchain) + throw invalid_argument("Conflicting toolchain specification"); toolchain = p; ok = true; } if(!ok && (p=="32" || p=="64")) { - bits = lexical_cast(p); + unsigned b = lexical_cast(p); + if(bits && b!=bits) + throw invalid_argument("Conflicting bits specification"); + bits = b; ok = true; }