]> git.tdb.fi Git - builder.git/blobdiff - source/virtualfilesystem.cpp
Don't try to unlink nonexistent files
[builder.git] / source / virtualfilesystem.cpp
index ef7605b14b929fc8cbb4eea0f87a66ab48f89201..fe0159e857d61892ee7cc055bacedcc40d00b303 100644 (file)
@@ -5,7 +5,7 @@
 #include "csourcefile.h"
 #include "misc.h"
 #include "sharedlibrary.h"
-#include "systemlibrary.h"
+#include "staticlibrary.h"
 #include "virtualfilesystem.h"
 
 using namespace std;
@@ -158,45 +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();
-       if(mode!=ALL_STATIC)
-               fill_candidates(candidates, arch.get_shared_library_patterns(), lib);
-
-       /* Static libraries are always considered, since sometimes shared versions
-       may not be available */
-       fill_candidates(candidates, arch.get_static_library_patterns(), lib);
 
-       for(StringList::iterator i=candidates.begin(); i!=candidates.end(); ++i)
+       /* Try dynamic libraries only if library mode permits it */
+       if(mode!=ALL_STATIC)
        {
-               FS::Path full = path/ *i;
-               FileTarget *tgt = get_target(full);
-
-               if(tgt)
+               FS::Path fn = try_patterns(path, arch.get_shared_library_patterns(), lib);
+               if(!fn.empty())
                {
-                       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)
+                       FileTarget *tgt = get_target(fn);
+                       if(!tgt)
+                               return new SharedLibrary(builder, fn);
+                       else if(mode==DYNAMIC || !tgt->get_package())
                                return tgt;
                }
-               else if(FS::is_reg(full))
-               {
-                       tgt = new SystemLibrary(builder, full.str());
+       }
+
+       /* Static libraries are always considered, since sometimes shared versions
+       may not be available */
+       FS::Path fn = try_patterns(path, arch.get_static_library_patterns(), lib);
+       if(!fn.empty())
+       {
+               if(FileTarget *tgt = get_target(fn))
                        return tgt;
-               }
+               else
+                       return new StaticLibrary(builder, fn);
        }
 
        return 0;
 }
 
-void VirtualFileSystem::fill_candidates(StringList &candidates, const list<Pattern> &patterns, const string &base)
+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)
-               candidates.push_back(i->apply(base));
+       {
+               FS::Path full = dir/i->apply(base);
+               if(get_target(full) || FS::is_reg(full))
+                       return full;
+       }
+
+       return FS::Path();
 }