15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MCLDDirectory.cpp --------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
9f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/MC/MCLDDirectory.h>
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/Support/FileSystem.h>
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld::sys::fs;
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MCLDDirectory
17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory()
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(), m_bInSysroot(false) {
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(const char* pName)
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(pName) {
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName);
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(const std::string &pName)
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(pName) {
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName);
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(llvm::StringRef pName)
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(pName.data(), pName.size()) {
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName.str());
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName)
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Name.assign(pName.data(), pName.size());
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName.str());
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_FileStatus = FileStatus();
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_SymLinkStatus = FileStatus();
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Cache.clear();
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Handler = 0;
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (*this);
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::~MCLDDirectory()
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool MCLDDirectory::isInSysroot() const
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_bInSysroot;
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot)
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot) {
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    std::string old_path = Directory::m_Path.native();
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native() = pSysroot.native();
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.m_append_separator_if_needed();
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native() += old_path;
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::canonicalize(Directory::m_Path.native());
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
105