| //===- MCLDDirectory.cpp --------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include "mcld/MC/MCLDDirectory.h" |
| #include "mcld/Support/FileSystem.h" |
| |
| using namespace mcld; |
| using namespace mcld::sys::fs; |
| |
| //========================== |
| // MCLDDirectory |
| MCLDDirectory::MCLDDirectory() |
| : Directory(), m_Name(), m_bInSysroot(false) { |
| } |
| |
| MCLDDirectory::MCLDDirectory(const char* pName) |
| : Directory(), m_Name(pName) { |
| Directory::m_Path.assign(pName); |
| |
| if (!Directory::m_Path.empty()) |
| m_bInSysroot = ('=' == Directory::m_Path.native()[0]); |
| |
| Directory::m_Path.m_append_separator_if_needed(); |
| if (m_bInSysroot) |
| Directory::m_Path.native().erase(Directory::m_Path.native().begin()); |
| else |
| detail::open_dir(*this); |
| } |
| |
| MCLDDirectory::MCLDDirectory(const std::string &pName) |
| : Directory(), m_Name(pName) { |
| Directory::m_Path.assign(pName); |
| |
| if (!Directory::m_Path.empty()) |
| m_bInSysroot = ('=' == Directory::m_Path.native()[0]); |
| |
| Directory::m_Path.m_append_separator_if_needed(); |
| if (m_bInSysroot) |
| Directory::m_Path.native().erase(Directory::m_Path.native().begin()); |
| else |
| detail::open_dir(*this); |
| } |
| |
| MCLDDirectory::MCLDDirectory(llvm::StringRef pName) |
| : Directory(), m_Name(pName.data(), pName.size()) { |
| Directory::m_Path.assign(pName.str()); |
| |
| if (!Directory::m_Path.empty()) |
| m_bInSysroot = ('=' == Directory::m_Path.native()[0]); |
| |
| Directory::m_Path.m_append_separator_if_needed(); |
| if (m_bInSysroot) |
| Directory::m_Path.native().erase(Directory::m_Path.native().begin()); |
| else |
| detail::open_dir(*this); |
| } |
| |
| MCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName) |
| { |
| m_Name.assign(pName.data(), pName.size()); |
| Directory::m_Path.assign(pName.str()); |
| |
| if (!Directory::m_Path.empty()) |
| m_bInSysroot = ('=' == Directory::m_Path.native()[0]); |
| |
| Directory::m_Path.m_append_separator_if_needed(); |
| if (m_bInSysroot) |
| Directory::m_Path.native().erase(Directory::m_Path.native().begin()); |
| else |
| detail::open_dir(*this); |
| Directory::m_FileStatus = FileStatus(); |
| Directory::m_SymLinkStatus = FileStatus(); |
| Directory::m_Cache.clear(); |
| Directory::m_Handler = 0; |
| return (*this); |
| } |
| |
| MCLDDirectory::~MCLDDirectory() |
| { |
| } |
| |
| bool MCLDDirectory::isInSysroot() const |
| { |
| return m_bInSysroot; |
| } |
| |
| void MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot) |
| { |
| if (m_bInSysroot) { |
| std::string old_path = Directory::m_Path.native(); |
| Directory::m_Path.native() = pSysroot.native(); |
| Directory::m_Path.m_append_separator_if_needed(); |
| Directory::m_Path.native() += old_path; |
| detail::canonicalize(Directory::m_Path.native()); |
| detail::open_dir(*this); |
| } |
| } |
| |