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//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/MC/MCLDDirectory.h"
105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "mcld/Support/FileSystem.h"
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld::sys::fs;
145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MCLDDirectory
175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory()
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(), m_bInSysroot(false) {
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(const char* pName)
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(pName) {
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName);
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(const std::string &pName)
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(pName) {
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName);
385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(llvm::StringRef pName)
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  : Directory(), m_Name(pName.data(), pName.size()) {
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName.str());
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory &MCLDDirectory::assign(llvm::StringRef pName)
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Name.assign(pName.data(), pName.size());
665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName.str());
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_bInSysroot = ('=' == Directory::m_Path.native()[0]);
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_FileStatus = FileStatus();
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_SymLinkStatus = FileStatus();
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Cache.clear();
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Handler = 0;
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (*this);
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::~MCLDDirectory()
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaobool MCLDDirectory::isInSysroot() const
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_bInSysroot;
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot)
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot) {
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    std::string old_path = Directory::m_Path.native();
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native() = pSysroot.native();
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.m_append_separator_if_needed();
985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native() += old_path;
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::canonicalize(Directory::m_Path.native());
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    detail::open_dir(*this);
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
104