| //===- SearchPathOptions.cpp ----------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <mcld/SearchPathOptions.h> |
| #include <mcld/LinkerConfig.h> |
| #include <mcld/LinkerScript.h> |
| #include <mcld/Support/raw_ostream.h> |
| |
| namespace { |
| |
| llvm::cl::opt<mcld::sys::fs::Path, |
| false, |
| llvm::cl::parser<mcld::sys::fs::Path> > ArgSysRoot("sysroot", |
| llvm::cl::desc("Use directory as the location of the sysroot"), |
| llvm::cl::value_desc("directory"), |
| llvm::cl::ValueRequired); |
| |
| llvm::cl::list<std::string, |
| bool, |
| llvm::cl::SearchDirParser> ArgSearchDirList("L", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Add [searchdir] to the list of search paths"), |
| llvm::cl::value_desc("searchdir"), |
| llvm::cl::Prefix); |
| |
| llvm::cl::alias ArgSearchDirListAlias("library-path", |
| llvm::cl::desc("alias for -L"), |
| llvm::cl::aliasopt(ArgSearchDirList)); |
| |
| llvm::cl::opt<bool> ArgNoStdlib("nostdlib", |
| llvm::cl::desc("Only search lib dirs explicitly specified on cmdline"), |
| llvm::cl::init(false)); |
| |
| llvm::cl::list<std::string, |
| bool, |
| llvm::cl::SearchDirParser> ArgRuntimePath("rpath", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Add a directory to the runtime library search path"), |
| llvm::cl::value_desc("dir")); |
| |
| llvm::cl::alias ArgRuntimePathAlias("R", |
| llvm::cl::desc("alias for --rpath"), |
| llvm::cl::aliasopt(ArgRuntimePath), llvm::cl::Prefix); |
| |
| // Not supported yet { |
| llvm::cl::list<std::string, |
| bool, |
| llvm::cl::SearchDirParser> ArgRuntimePathLink("rpath-link", |
| llvm::cl::ZeroOrMore, |
| llvm::cl::desc("Add a directory to the link time library search path"), |
| llvm::cl::value_desc("dir")); |
| |
| llvm::cl::list<std::string> ArgY("Y", |
| llvm::cl::desc("Add path to the default library search path"), |
| llvm::cl::value_desc("default-search-path")); |
| // } Not supported yet |
| |
| } // anonymous namespace |
| |
| using namespace mcld; |
| |
| //===----------------------------------------------------------------------===// |
| // SearchPathOptions |
| //===----------------------------------------------------------------------===// |
| SearchPathOptions::SearchPathOptions() |
| : m_SysRoot(ArgSysRoot), |
| m_SearchDirList(ArgSearchDirList), |
| m_NoStdlib(ArgNoStdlib), |
| m_RuntimePath(ArgRuntimePath), |
| m_RuntimePathLink(ArgRuntimePathLink), |
| m_Y(ArgY) { |
| } |
| |
| bool SearchPathOptions::parse(LinkerConfig& pConfig, LinkerScript& pScript) |
| { |
| // set --sysroot |
| if (!m_SysRoot.empty()) { |
| if (exists(m_SysRoot) && is_directory(m_SysRoot)) |
| pScript.setSysroot(m_SysRoot); |
| } |
| |
| // set -L[path] |
| llvm::cl::list<std::string>::iterator sd; |
| llvm::cl::list<std::string>::iterator sdEnd = m_SearchDirList.end(); |
| for (sd = m_SearchDirList.begin(); sd != sdEnd; ++sd) { |
| if (!pScript.directories().insert(*sd)) { |
| // FIXME: need a warning function |
| errs() << "WARNING: can not open search directory `-L" |
| << *sd |
| << "'.\n"; |
| } |
| } |
| |
| // set -no-stdlib |
| pConfig.options().setNoStdlib(m_NoStdlib); |
| |
| // set --rpath [path] |
| llvm::cl::list<std::string>::iterator rp; |
| llvm::cl::list<std::string>::iterator rpEnd = m_RuntimePath.end(); |
| for (rp = m_RuntimePath.begin(); rp != rpEnd; ++rp) { |
| pConfig.options().getRpathList().push_back(*rp); |
| } |
| |
| return true; |
| } |
| |