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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/MCLDDirectory.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/FileSystem.h"
115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
14f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// MCLDDirectory
16f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines//===----------------------------------------------------------------------===//
1737b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLDDirectory::MCLDDirectory() : Directory(), m_Name(), m_bInSysroot(false) {
185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
2037b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLDDirectory::MCLDDirectory(const char* pName) : Directory(), m_Name(pName) {
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName);
225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_bInSysroot = (Directory::m_Path.native()[0] == '=');
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sys::fs::detail::open_dir(*this);
315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
3337b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLDDirectory::MCLDDirectory(const std::string& pName)
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : Directory(), m_Name(pName) {
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName);
365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_bInSysroot = (Directory::m_Path.native()[0] == '=');
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sys::fs::detail::open_dir(*this);
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMCLDDirectory::MCLDDirectory(llvm::StringRef pName)
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : Directory(), m_Name(pName.data(), pName.size()) {
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName.str());
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_bInSysroot = (Directory::m_Path.native()[0] == '=');
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sys::fs::detail::open_dir(*this);
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6137b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLDDirectory& MCLDDirectory::assign(llvm::StringRef pName) {
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_Name.assign(pName.data(), pName.size());
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.assign(pName.str());
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (!Directory::m_Path.empty())
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    m_bInSysroot = (Directory::m_Path.native()[0] == '=');
675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Path.m_append_separator_if_needed();
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot)
705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native().erase(Directory::m_Path.native().begin());
715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  else
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sys::fs::detail::open_dir(*this);
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Directory::m_FileStatus = sys::fs::FileStatus();
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  Directory::m_SymLinkStatus = sys::fs::FileStatus();
755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Cache.clear();
765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  Directory::m_Handler = 0;
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return (*this);
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8037b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLDDirectory::~MCLDDirectory() {
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool MCLDDirectory::isInSysroot() const {
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  return m_bInSysroot;
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot) {
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  if (m_bInSysroot) {
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    std::string old_path = Directory::m_Path.native();
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native() = pSysroot.native();
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.m_append_separator_if_needed();
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    Directory::m_Path.native() += old_path;
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sys::fs::detail::canonicalize(Directory::m_Path.native());
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    sys::fs::detail::open_dir(*this);
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
99