SearchPathOptions.cpp revision 533eae20118036f425f27bf0536ef0ccbb090b65
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
14namespace {
15
16llvm::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
23llvm::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
31llvm::cl::alias ArgSearchDirListAlias("library-path",
32  llvm::cl::desc("alias for -L"),
33  llvm::cl::aliasopt(ArgSearchDirList));
34
35llvm::cl::opt<bool> ArgNoStdlib("nostdlib",
36  llvm::cl::desc("Only search lib dirs explicitly specified on cmdline"),
37  llvm::cl::init(false));
38
39llvm::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
46llvm::cl::alias ArgRuntimePathAlias("R",
47  llvm::cl::desc("alias for --rpath"),
48  llvm::cl::aliasopt(ArgRuntimePath), llvm::cl::Prefix);
49
50// Not supported yet {
51llvm::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
58llvm::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
65using namespace mcld;
66
67//===----------------------------------------------------------------------===//
68// SearchPathOptions
69//===----------------------------------------------------------------------===//
70SearchPathOptions::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
79bool 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