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