]> git.tdb.fi Git - builder.git/blobdiff - source/architecture.cpp
More flexible way to manage filename patterns
[builder.git] / source / architecture.cpp
index 2c5d383ec3622cc25a9caa61b4e4448c41547ea1..a3f3b132447f3213ce7d5f0f797751f90beae79b 100644 (file)
@@ -3,6 +3,10 @@
 #include <msp/strings/utils.h>
 #include "architecture.h"
 #include "builder.h"
+#include "executable.h"
+#include "objectfile.h"
+#include "sharedlibrary.h"
+#include "staticlibrary.h"
 #include "sysutils.h"
 
 using namespace std;
@@ -137,26 +141,26 @@ Architecture::Architecture(Builder &b, const string &spec):
                name += format("-%s", fpu);
        name += format("-%d-%s-%s", bits, system, toolchain);
 
-       object_patterns.push_back(Pattern("%.o"));
+       add_pattern<ObjectFile>("%.o");
        if(system=="windows")
        {
-               sharedlib_patterns.push_back(Pattern("%.dll"));
-               sharedlib_patterns.push_back(Pattern("lib%.dll"));
+               add_pattern<SharedLibrary>("%.dll");
+               add_pattern<SharedLibrary>("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"));
-               staticlib_patterns.push_back(Pattern("%.lib"));
-               executable_patterns.push_back(Pattern("%.exe"));
+               add_pattern<SharedLibrary>("lib%.dll.a");
+               add_pattern<StaticLibrary>("lib%.a");
+               add_pattern<StaticLibrary>("%.lib");
+               add_pattern<Executable>("%.exe");
        }
        else
        {
                if(system=="darwin")
-                       sharedlib_patterns.push_back(Pattern("lib%.dylib"));
+                       add_pattern<SharedLibrary>("lib%.dylib");
                else
-                       sharedlib_patterns.push_back(Pattern("lib%.so"));
-               staticlib_patterns.push_back(Pattern("lib%.a"));
-               executable_patterns.push_back(Pattern("%"));
+                       add_pattern<SharedLibrary>("lib%.so");
+               add_pattern<StaticLibrary>("lib%.a");
+               add_pattern<Executable>("%");
        }
 }
 
@@ -199,6 +203,12 @@ string Architecture::best_match(const vector<string> &names) const
        return best;
 }
 
+template<typename T>
+void Architecture::add_pattern(const string &pat)
+{
+       filename_patterns[typeid(T).name()].push_back(Pattern(pat));
+}
+
 void Architecture::resolve_aliases(vector<string> &parts)
 {
        for(unsigned i=0; i<parts.size(); ++i)