Home | History | Annotate | Download | only in MC
      1 //===- SearchDirs.h -------------------------------------------------------===//
      2 //
      3 //                     The MCLinker Project
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 #ifndef MCLD_MC_SEARCHDIRS_H
     10 #define MCLD_MC_SEARCHDIRS_H
     11 #ifdef ENABLE_UNITTEST
     12 #include <gtest.h>
     13 #endif
     14 #include <mcld/ADT/Uncopyable.h>
     15 #include <mcld/MC/MCLDInput.h>
     16 #include <mcld/Support/Path.h>
     17 
     18 #include <llvm/ADT/StringRef.h>
     19 
     20 #include <vector>
     21 #include <string>
     22 
     23 namespace mcld {
     24 
     25 class MCLDFile;
     26 class MCLDDirectory;
     27 
     28 /** \class SearchDirs
     29  *  \brief SearchDirs contains the list of paths that MCLinker will search for
     30  *  archive libraries and control scripts.
     31  *
     32  *  SearchDirs is customized for linking. It handles -L on the command line
     33  *  and SEARCH_DIR macro in the link script.
     34  *
     35  *  @see MCLDDirectory.
     36  */
     37 class SearchDirs : private Uncopyable
     38 {
     39 public:
     40   typedef std::vector<MCLDDirectory*> DirList;
     41   typedef DirList::iterator iterator;
     42   typedef DirList::const_iterator const_iterator;
     43 
     44 public:
     45   SearchDirs();
     46 
     47   SearchDirs(const sys::fs::Path& pSysRoot);
     48 
     49   ~SearchDirs();
     50 
     51   // find - give a namespec, return a real path of the shared object.
     52   sys::fs::Path*
     53   find(const std::string& pNamespec, mcld::Input::Type pPreferType);
     54 
     55   const sys::fs::Path*
     56   find(const std::string& pNamespec, mcld::Input::Type pPreferType) const;
     57 
     58   void setSysRoot(const sys::fs::Path& pSysRoot) { m_SysRoot = pSysRoot; }
     59   const sys::fs::Path& sysroot() const { return m_SysRoot; }
     60 
     61   // -----  iterators  ----- //
     62   const_iterator begin() const { return m_DirList.begin(); }
     63   iterator       begin()       { return m_DirList.begin(); }
     64   const_iterator end  () const { return m_DirList.end();   }
     65   iterator       end  ()       { return m_DirList.end();   }
     66 
     67   // -----  modifiers  ----- //
     68   bool insert(const char* pDirectory);
     69 
     70   bool insert(const std::string& pDirectory);
     71 
     72   bool insert(const sys::fs::Path& pDirectory);
     73 
     74 private:
     75   DirList m_DirList;
     76   sys::fs::Path m_SysRoot;
     77 };
     78 
     79 } // namespace of mcld
     80 
     81 #endif
     82 
     83