]> git.tdb.fi Git - builder.git/commitdiff
Improve architecture name matching
authorMikko Rasa <tdb@tdb.fi>
Mon, 19 Dec 2022 19:12:29 +0000 (21:12 +0200)
committerMikko Rasa <tdb@tdb.fi>
Mon, 19 Dec 2022 19:13:46 +0000 (21:13 +0200)
It will now treat x86_64 as a more specific match than just x86.

source/architecture.cpp
source/architecture.h

index 2efcd5e3e4ee23dc9294cfb04f261ab06ce8f1c8..48c6a204b17fc43220086ca207c68817739c9179 100644 (file)
@@ -177,7 +177,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<string> parts = split(pattern.substr(negate), "-");
@@ -187,31 +187,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<string> &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;
 }
index 7f3c4b2a45e28b4e1d3c8900fa5e23cbb2d00bf2..776de858b03fcc2b587771e73f9322ab29f1d815 100644 (file)
@@ -44,7 +44,7 @@ public:
        const std::string &get_cpu() const { return cpu; }
        const std::string &get_fpu() const { return fpu; }
        const std::string &get_toolchain() const { return toolchain; }
-       bool match_name(const std::string &) const;
+       bool match_name(const std::string &, unsigned * = 0) const;
        std::string best_match(const std::vector<std::string> &) const;
        bool is_native() const { return native; }
        bool is_cross() const { return !cross_prefix.empty(); }