]> git.tdb.fi Git - builder.git/blobdiff - source/virtualfilesystem.cpp
Move the Component reference to Target and make it a pointer
[builder.git] / source / virtualfilesystem.cpp
index e89b2dd61c0a6978cd3dd8cb9d9711375bb57d02..7febdb62b78c58d3e3ca0813ea526d12284e6798 100644 (file)
@@ -2,8 +2,8 @@
 #include <msp/io/print.h>
 #include <msp/strings/utils.h>
 #include "builder.h"
+#include "csourcefile.h"
 #include "misc.h"
-#include "header.h"
 #include "sharedlibrary.h"
 #include "systemlibrary.h"
 #include "virtualfilesystem.h"
@@ -150,7 +150,7 @@ FileTarget *VirtualFileSystem::get_header(const FS::Path &fn)
 
        if(FS::is_reg(fn))
        {
-               tgt = new SystemHeader(builder, fn.str());
+               tgt = new CSourceFile(builder, fn);
                return tgt;
        }
        return 0;
@@ -158,50 +158,44 @@ FileTarget *VirtualFileSystem::get_header(const FS::Path &fn)
 
 FileTarget *VirtualFileSystem::get_library(const string &lib, const FS::Path &path, LibMode mode)
 {
-       // Populate a list of candidate filenames
-       StringList candidates;
-
        const Architecture &arch = builder.get_current_arch();
+
+       /* Try dynamic libraries only if library mode permits it */
        if(mode!=ALL_STATIC)
        {
-               // XXX Should probably let the Architecture populate the list
-               if(arch.get_system()=="windows")
+               FS::Path fn = try_patterns(path, arch.get_shared_library_patterns(), lib);
+               if(!fn.empty())
                {
-                       candidates.push_back("lib"+lib+".dll");
-                       candidates.push_back(lib+".dll");
+                       FileTarget *tgt = get_target(fn);
+                       if(!tgt)
+                               return new SystemLibrary(builder, fn.str());
+                       else if(mode==DYNAMIC || !tgt->get_package())
+                               return tgt;
                }
-               else
-                       candidates.push_back("lib"+lib+".so");
        }
 
        /* Static libraries are always considered, since sometimes shared versions
        may not be available */
-       candidates.push_back("lib"+lib+".a");
-       if(arch.get_system()=="windows")
-               candidates.push_back("lib"+lib+".dll.a");
-
-       for(StringList::iterator i=candidates.begin(); i!=candidates.end(); ++i)
+       FS::Path fn = try_patterns(path, arch.get_static_library_patterns(), lib);
+       if(!fn.empty())
        {
-               FS::Path full = path/ *i;
-               FileTarget *tgt = get_target(full);
-
-               if(tgt)
-               {
-                       Target *real_tgt = tgt->get_real_target();
-
-                       /* Ignore dynamic libraries from local packages unless library mode is
-                       DYNAMIC */
-                       if(dynamic_cast<SharedLibrary *>(real_tgt) && mode!=DYNAMIC)
-                               continue;
-                       else if(tgt)
-                               return tgt;
-               }
-               else if(FS::is_reg(full))
-               {
-                       tgt = new SystemLibrary(builder, full.str());
+               if(FileTarget *tgt = get_target(fn))
                        return tgt;
-               }
+               else
+                       return new SystemLibrary(builder, fn.str());
        }
 
        return 0;
 }
+
+FS::Path VirtualFileSystem::try_patterns(const FS::Path &dir, const list<Pattern> &patterns, const string &base)
+{
+       for(list<Pattern>::const_iterator i=patterns.begin(); i!=patterns.end(); ++i)
+       {
+               FS::Path full = dir/i->apply(base);
+               if(get_target(full) || FS::is_reg(full))
+                       return full;
+       }
+
+       return FS::Path();
+}