• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
12 using namespace mcld;
13 using namespace mcld::sys::fs;
14 
15 //===----------------------------------------------------------------------===//
16 // MCLDDirectory
17 //===----------------------------------------------------------------------===//
MCLDDirectory()18 MCLDDirectory::MCLDDirectory()
19   : Directory(), m_Name(), m_bInSysroot(false) {
20 }
21 
MCLDDirectory(const char * pName)22 MCLDDirectory::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 
MCLDDirectory(const std::string & pName)36 MCLDDirectory::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 
MCLDDirectory(llvm::StringRef pName)50 MCLDDirectory::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 
assign(llvm::StringRef pName)64 MCLDDirectory &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 
~MCLDDirectory()84 MCLDDirectory::~MCLDDirectory()
85 {
86 }
87 
isInSysroot() const88 bool MCLDDirectory::isInSysroot() const
89 {
90   return m_bInSysroot;
91 }
92 
setSysroot(const sys::fs::Path & pSysroot)93 void 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