//===- 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; }