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