1533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===- SearchPathOptions.cpp ----------------------------------------------===//
2533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//
3533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//                     The MCLinker Project
4533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//
5533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// This file is distributed under the University of Illinois Open Source
6533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// License. See LICENSE.TXT for details.
7533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//
8533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===----------------------------------------------------------------------===//
9533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/SearchPathOptions.h>
10533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/LinkerConfig.h>
11533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/LinkerScript.h>
12533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines#include <mcld/Support/raw_ostream.h>
13533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
14533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesnamespace {
15533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
16533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<mcld::sys::fs::Path,
17533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines              false,
18533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines              llvm::cl::parser<mcld::sys::fs::Path> > ArgSysRoot("sysroot",
19533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("Use directory as the location of the sysroot"),
20533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::value_desc("directory"),
21533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::ValueRequired);
22533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
23533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::list<std::string,
24533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines               bool,
25533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines               llvm::cl::SearchDirParser> ArgSearchDirList("L",
26533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::ZeroOrMore,
27533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("Add [searchdir] to the list of search paths"),
28533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::value_desc("searchdir"),
29533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::Prefix);
30533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
31533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgSearchDirListAlias("library-path",
32533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("alias for -L"),
33533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::aliasopt(ArgSearchDirList));
34533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
35533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::opt<bool> ArgNoStdlib("nostdlib",
36533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("Only search lib dirs explicitly specified on cmdline"),
37533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::init(false));
38533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
39533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::list<std::string,
40533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines               bool,
41533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines               llvm::cl::SearchDirParser> ArgRuntimePath("rpath",
42533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::ZeroOrMore,
43533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("Add a directory to the runtime library search path"),
44533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::value_desc("dir"));
45533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
46533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::alias ArgRuntimePathAlias("R",
47533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("alias for --rpath"),
48533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::aliasopt(ArgRuntimePath), llvm::cl::Prefix);
49533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
50533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// Not supported yet {
51533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::list<std::string,
52533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines               bool,
53533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines               llvm::cl::SearchDirParser> ArgRuntimePathLink("rpath-link",
54533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::ZeroOrMore,
55533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("Add a directory to the link time library search path"),
56533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::value_desc("dir"));
57533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
58533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesllvm::cl::list<std::string> ArgY("Y",
59533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::desc("Add path to the default library search path"),
60533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::value_desc("default-search-path"));
61533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// } Not supported yet
62533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
63533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines} // anonymous namespace
64533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
65533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesusing namespace mcld;
66533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
67533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===----------------------------------------------------------------------===//
68533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines// SearchPathOptions
69533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines//===----------------------------------------------------------------------===//
70533eae20118036f425f27bf0536ef0ccbb090b65Stephen HinesSearchPathOptions::SearchPathOptions()
71533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  : m_SysRoot(ArgSysRoot),
72533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    m_SearchDirList(ArgSearchDirList),
73533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    m_NoStdlib(ArgNoStdlib),
74533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    m_RuntimePath(ArgRuntimePath),
75533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    m_RuntimePathLink(ArgRuntimePathLink),
76533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    m_Y(ArgY) {
77533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines}
78533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
79533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hinesbool SearchPathOptions::parse(LinkerConfig& pConfig, LinkerScript& pScript)
80533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines{
81533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  // set --sysroot
82533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  if (!m_SysRoot.empty()) {
83533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    if (exists(m_SysRoot) && is_directory(m_SysRoot))
84533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines      pScript.setSysroot(m_SysRoot);
85533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  }
86533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
87533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  // set -L[path]
88533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::list<std::string>::iterator sd;
89533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::list<std::string>::iterator sdEnd = m_SearchDirList.end();
90533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  for (sd = m_SearchDirList.begin(); sd != sdEnd; ++sd) {
91533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    if (!pScript.directories().insert(*sd)) {
92533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines      // FIXME: need a warning function
93533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines      errs() << "WARNING: can not open search directory `-L"
94533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines             << *sd
95533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines             << "'.\n";
96533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    }
97533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  }
98533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
99533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  // set -no-stdlib
100533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  pConfig.options().setNoStdlib(m_NoStdlib);
101533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
102533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  // set --rpath [path]
103533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::list<std::string>::iterator rp;
104533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  llvm::cl::list<std::string>::iterator rpEnd = m_RuntimePath.end();
105533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  for (rp = m_RuntimePath.begin(); rp != rpEnd; ++rp) {
106533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines    pConfig.options().getRpathList().push_back(*rp);
107533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  }
108533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
109533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines  return true;
110533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines}
111533eae20118036f425f27bf0536ef0ccbb090b65Stephen Hines
112