Home | History | Annotate | Download | only in gold
      1 // dirsearch.h -- directory searching for gold  -*- C++ -*-
      2 
      3 // Copyright (C) 2006-2016 Free Software Foundation, Inc.
      4 // Written by Ian Lance Taylor <iant (at) google.com>.
      5 
      6 // This file is part of gold.
      7 
      8 // This program is free software; you can redistribute it and/or modify
      9 // it under the terms of the GNU General Public License as published by
     10 // the Free Software Foundation; either version 3 of the License, or
     11 // (at your option) any later version.
     12 
     13 // This program is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // You should have received a copy of the GNU General Public License
     19 // along with this program; if not, write to the Free Software
     20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21 // MA 02110-1301, USA.
     22 
     23 #ifndef GOLD_DIRSEARCH_H
     24 #define GOLD_DIRSEARCH_H
     25 
     26 #include <string>
     27 #include <list>
     28 
     29 #include "options.h"
     30 #include "token.h"
     31 
     32 namespace gold
     33 {
     34 
     35 class General_options;
     36 class Workqueue;
     37 
     38 // A simple interface to manage directories to be searched for
     39 // libraries.
     40 
     41 class Dirsearch
     42 {
     43  public:
     44   Dirsearch()
     45     : directories_(NULL), token_(true)
     46   { }
     47 
     48   // Set the list of directories to search.
     49   void
     50   initialize(Workqueue*, const General_options::Dir_list*);
     51 
     52   // Search for a file, giving one or two names to search for (the
     53   // second one may be empty).  Return a full path name for the file,
     54   // or the empty string if it could not be found.  This may only be
     55   // called if the token is not blocked.  Set *IS_IN_SYSROOT if the
     56   // file was found in a directory which is in the sysroot.  *PINDEX
     57   // should be set to zero the first time this is called; it will be
     58   // updated with the index of the directory where the file is found,
     59   // and that value plus one may be used to find the next file with
     60   // the same name(s).
     61   std::string
     62   find(const std::vector<std::string>& names, bool* is_in_sysroot,
     63        int* pindex, std::string *found_name) const;
     64 
     65   // Return the blocker token which controls access.
     66   Task_token*
     67   token()
     68   { return &this->token_; }
     69 
     70   // Search for a file in a directory list.  This is a low-level function and
     71   // therefore can be used before options and parameters are set.
     72   static std::string
     73   find_file_in_dir_list(const std::string& name,
     74                         const General_options::Dir_list& directories,
     75                         const std::string& extra_search_dir);
     76 
     77  private:
     78   // We can not copy this class.
     79   Dirsearch(const Dirsearch&);
     80   Dirsearch& operator=(const Dirsearch&);
     81 
     82   // Directories to search.
     83   const General_options::Dir_list* directories_;
     84   // Blocker token to control access from tasks.
     85   Task_token token_;
     86 };
     87 
     88 } // End namespace gold.
     89 
     90 #endif // !defined(GOLD_DIRSEARCH_H)
     91