]> git.tdb.fi Git - builder.git/blobdiff - source/virtualfilesystem.h
Cache result of parsing $PATH
[builder.git] / source / virtualfilesystem.h
index 045f9b5057bcdb2b3514736147f83c015d97afd5..9a25930aa8a8cf693980cf80720a23bb3508623b 100644 (file)
@@ -3,12 +3,14 @@
 
 #include <list>
 #include <map>
+#include <set>
 #include <msp/fs/path.h>
 #include "buildinfo.h"
 
 class Builder;
 class FileTarget;
 class Pattern;
+class Tool;
 
 /**
 Provides access to the filesystem in a way that takes known targets into
@@ -18,14 +20,13 @@ possible to build them.
 class VirtualFileSystem
 {
 public:
-       typedef std::list<Msp::FS::Path> SearchPath;
+       using SearchPath = std::list<Msp::FS::Path>;
 
 private:
-       typedef std::map<Msp::FS::Path, FileTarget *> TargetMap;
-
        Builder &builder;
-       TargetMap targets;
+       std::map<Msp::FS::Path, FileTarget *> targets;
        std::set<Msp::FS::Path> nonexistent;
+       SearchPath sys_bin_path;
 
 public:
        VirtualFileSystem(Builder &);
@@ -39,14 +40,16 @@ public:
        void register_path(const Msp::FS::Path &, FileTarget *);
 
        /** Locates a source file.  If a file is found but no target is associated
-       with it, a new package-less target is created with the appropriate tool. */
-       FileTarget *find_header(const std::string &, const SearchPath &);
+       with it, a new package-less target is created with the appropriate tool.  If
+       use_syspath is true, the system path reported by the tool is also searched. */
+       FileTarget *find_header(const std::string &, Tool *, const SearchPath &, bool use_syspath = true);
 
        /** Locates a library.  The library name should be the same as what would be
        used in linking with the library.  If a file is found but no target is
        associated with it, a new package-less target of appropriate type is
-       created. */
-       FileTarget *find_library(const std::string &, const SearchPath &, BuildInfo::LibraryMode);
+       created.  If use_syspath is true, the system path reported by the LINK tool
+       is also searched. */
+       FileTarget *find_library(const std::string &, const SearchPath &, BuildInfo::LibraryMode, bool use_syspath = true);
 
        /** Locates a binary.  The normal search path for binaries is used (usually
        this means the PATH environment variable).  If a file is found but no target