1//===- MCLDDirectory.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/MC/MCLDDirectory.h> 10#include <mcld/Support/FileSystem.h> 11 12using namespace mcld; 13using namespace mcld::sys::fs; 14 15//===----------------------------------------------------------------------===// 16// MCLDDirectory 17//===----------------------------------------------------------------------===// 18MCLDDirectory::MCLDDirectory() 19 : Directory(), m_Name(), m_bInSysroot(false) { 20} 21 22MCLDDirectory::MCLDDirectory(const char* pName) 23 : Directory(), m_Name(pName) { 24 Directory::m_Path.assign(pName); 25 26 if (!Directory::m_Path.empty()) 27 m_bInSysroot = ('=' == Directory::m_Path.native()[0]); 28 29 Directory::m_Path.m_append_separator_if_needed(); 30 if (m_bInSysroot) 31 Directory::m_Path.native().erase(Directory::m_Path.native().begin()); 32 else 33 detail::open_dir(*this); 34} 35 36MCLDDirectory::MCLDDirectory(const std::string &pName) 37 : Directory(), m_Name(pName) { 38 Directory::m_Path.assign(pName); 39 40 if (!Directory::m_Path.empty()) 41 m_bInSysroot = ('=' == Directory::m_Path.native()[0]); 42 43 Directory::m_Path.m_append_separator_if_needed(); 44 if (m_bInSysroot) 45 Directory::m_Path.native().erase(Directory::m_Path.native().begin()); 46 else 47 detail::open_dir(*this); 48} 49 50MCLDDirectory::MCLDDirectory(llvm::StringRef pName) 51 : Directory(), m_Name(pName.data(), pName.size()) { 52 Directory::m_Path.assign(pName.str()); 53 54 if (!Directory::m_Path.empty()) 55 m_bInSysroot = ('=' == Directory::m_Path.native()[0]); 56 57 Directory::m_Path.m_append_separator_if_needed(); 58 if (m_bInSysroot) 59 Directory::m_Path.native().erase(Directory::m_Path.native().begin()); 60 else 61 detail::open_dir(*this); 62} 63 64MCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName) 65{ 66 m_Name.assign(pName.data(), pName.size()); 67 Directory::m_Path.assign(pName.str()); 68 69 if (!Directory::m_Path.empty()) 70 m_bInSysroot = ('=' == Directory::m_Path.native()[0]); 71 72 Directory::m_Path.m_append_separator_if_needed(); 73 if (m_bInSysroot) 74 Directory::m_Path.native().erase(Directory::m_Path.native().begin()); 75 else 76 detail::open_dir(*this); 77 Directory::m_FileStatus = FileStatus(); 78 Directory::m_SymLinkStatus = FileStatus(); 79 Directory::m_Cache.clear(); 80 Directory::m_Handler = 0; 81 return (*this); 82} 83 84MCLDDirectory::~MCLDDirectory() 85{ 86} 87 88bool MCLDDirectory::isInSysroot() const 89{ 90 return m_bInSysroot; 91} 92 93void MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot) 94{ 95 if (m_bInSysroot) { 96 std::string old_path = Directory::m_Path.native(); 97 Directory::m_Path.native() = pSysroot.native(); 98 Directory::m_Path.m_append_separator_if_needed(); 99 Directory::m_Path.native() += old_path; 100 detail::canonicalize(Directory::m_Path.native()); 101 detail::open_dir(*this); 102 } 103} 104 105