Home | History | Annotate | Download | only in lib
      1 //===- SearchPathOptions.cpp ----------------------------------------------===//
      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 #include <mcld/SearchPathOptions.h>
     10 #include <mcld/LinkerConfig.h>
     11 #include <mcld/LinkerScript.h>
     12 #include <mcld/Support/raw_ostream.h>
     13 
     14 namespace {
     15 
     16 llvm::cl::opt<mcld::sys::fs::Path,
     17               false,
     18               llvm::cl::parser<mcld::sys::fs::Path> > ArgSysRoot("sysroot",
     19   llvm::cl::desc("Use directory as the location of the sysroot"),
     20   llvm::cl::value_desc("directory"),
     21   llvm::cl::ValueRequired);
     22 
     23 llvm::cl::list<std::string,
     24                bool,
     25                llvm::cl::SearchDirParser> ArgSearchDirList("L",
     26   llvm::cl::ZeroOrMore,
     27   llvm::cl::desc("Add [searchdir] to the list of search paths"),
     28   llvm::cl::value_desc("searchdir"),
     29   llvm::cl::Prefix);
     30 
     31 llvm::cl::alias ArgSearchDirListAlias("library-path",
     32   llvm::cl::desc("alias for -L"),
     33   llvm::cl::aliasopt(ArgSearchDirList));
     34 
     35 llvm::cl::opt<bool> ArgNoStdlib("nostdlib",
     36   llvm::cl::desc("Only search lib dirs explicitly specified on cmdline"),
     37   llvm::cl::init(false));
     38 
     39 llvm::cl::list<std::string,
     40                bool,
     41                llvm::cl::SearchDirParser> ArgRuntimePath("rpath",
     42   llvm::cl::ZeroOrMore,
     43   llvm::cl::desc("Add a directory to the runtime library search path"),
     44   llvm::cl::value_desc("dir"));
     45 
     46 llvm::cl::alias ArgRuntimePathAlias("R",
     47   llvm::cl::desc("alias for --rpath"),
     48   llvm::cl::aliasopt(ArgRuntimePath), llvm::cl::Prefix);
     49 
     50 // Not supported yet {
     51 llvm::cl::list<std::string,
     52                bool,
     53                llvm::cl::SearchDirParser> ArgRuntimePathLink("rpath-link",
     54   llvm::cl::ZeroOrMore,
     55   llvm::cl::desc("Add a directory to the link time library search path"),
     56   llvm::cl::value_desc("dir"));
     57 
     58 llvm::cl::list<std::string> ArgY("Y",
     59   llvm::cl::desc("Add path to the default library search path"),
     60   llvm::cl::value_desc("default-search-path"));
     61 // } Not supported yet
     62 
     63 } // anonymous namespace
     64 
     65 using namespace mcld;
     66 
     67 //===----------------------------------------------------------------------===//
     68 // SearchPathOptions
     69 //===----------------------------------------------------------------------===//
     70 SearchPathOptions::SearchPathOptions()
     71   : m_SysRoot(ArgSysRoot),
     72     m_SearchDirList(ArgSearchDirList),
     73     m_NoStdlib(ArgNoStdlib),
     74     m_RuntimePath(ArgRuntimePath),
     75     m_RuntimePathLink(ArgRuntimePathLink),
     76     m_Y(ArgY) {
     77 }
     78 
     79 bool SearchPathOptions::parse(LinkerConfig& pConfig, LinkerScript& pScript)
     80 {
     81   // set --sysroot
     82   if (!m_SysRoot.empty()) {
     83     if (exists(m_SysRoot) && is_directory(m_SysRoot))
     84       pScript.setSysroot(m_SysRoot);
     85   }
     86 
     87   // set -L[path]
     88   llvm::cl::list<std::string>::iterator sd;
     89   llvm::cl::list<std::string>::iterator sdEnd = m_SearchDirList.end();
     90   for (sd = m_SearchDirList.begin(); sd != sdEnd; ++sd) {
     91     if (!pScript.directories().insert(*sd)) {
     92       // FIXME: need a warning function
     93       errs() << "WARNING: can not open search directory `-L"
     94              << *sd
     95              << "'.\n";
     96     }
     97   }
     98 
     99   // set -no-stdlib
    100   pConfig.options().setNoStdlib(m_NoStdlib);
    101 
    102   // set --rpath [path]
    103   llvm::cl::list<std::string>::iterator rp;
    104   llvm::cl::list<std::string>::iterator rpEnd = m_RuntimePath.end();
    105   for (rp = m_RuntimePath.begin(); rp != rpEnd; ++rp) {
    106     pConfig.options().getRpathList().push_back(*rp);
    107   }
    108 
    109   return true;
    110 }
    111 
    112