blob: 5d281d531a1292dc7a4b2112acd467e5eafdac8f [file] [log] [blame]
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07001//===- 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//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -08009#include "mcld/MC/MCLDDirectory.h"
10#include "mcld/Support/FileSystem.h"
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070011
Stephen Hines37b74a32014-11-26 18:48:20 -080012namespace mcld {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070013
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070014//===----------------------------------------------------------------------===//
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070015// MCLDDirectory
Stephen Hinesf7ac0f12013-05-03 19:09:24 -070016//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -080017MCLDDirectory::MCLDDirectory() : Directory(), m_Name(), m_bInSysroot(false) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070018}
19
Stephen Hines37b74a32014-11-26 18:48:20 -080020MCLDDirectory::MCLDDirectory(const char* pName) : Directory(), m_Name(pName) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070021 Directory::m_Path.assign(pName);
22
23 if (!Directory::m_Path.empty())
Stephen Hines37b74a32014-11-26 18:48:20 -080024 m_bInSysroot = (Directory::m_Path.native()[0] == '=');
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070025
26 Directory::m_Path.m_append_separator_if_needed();
27 if (m_bInSysroot)
28 Directory::m_Path.native().erase(Directory::m_Path.native().begin());
29 else
Stephen Hines37b74a32014-11-26 18:48:20 -080030 sys::fs::detail::open_dir(*this);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070031}
32
Stephen Hines37b74a32014-11-26 18:48:20 -080033MCLDDirectory::MCLDDirectory(const std::string& pName)
34 : Directory(), m_Name(pName) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070035 Directory::m_Path.assign(pName);
36
37 if (!Directory::m_Path.empty())
Stephen Hines37b74a32014-11-26 18:48:20 -080038 m_bInSysroot = (Directory::m_Path.native()[0] == '=');
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070039
40 Directory::m_Path.m_append_separator_if_needed();
41 if (m_bInSysroot)
42 Directory::m_Path.native().erase(Directory::m_Path.native().begin());
43 else
Stephen Hines37b74a32014-11-26 18:48:20 -080044 sys::fs::detail::open_dir(*this);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070045}
46
47MCLDDirectory::MCLDDirectory(llvm::StringRef pName)
Stephen Hines37b74a32014-11-26 18:48:20 -080048 : Directory(), m_Name(pName.data(), pName.size()) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070049 Directory::m_Path.assign(pName.str());
50
51 if (!Directory::m_Path.empty())
Stephen Hines37b74a32014-11-26 18:48:20 -080052 m_bInSysroot = (Directory::m_Path.native()[0] == '=');
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070053
54 Directory::m_Path.m_append_separator_if_needed();
55 if (m_bInSysroot)
56 Directory::m_Path.native().erase(Directory::m_Path.native().begin());
57 else
Stephen Hines37b74a32014-11-26 18:48:20 -080058 sys::fs::detail::open_dir(*this);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070059}
60
Stephen Hines37b74a32014-11-26 18:48:20 -080061MCLDDirectory& MCLDDirectory::assign(llvm::StringRef pName) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070062 m_Name.assign(pName.data(), pName.size());
63 Directory::m_Path.assign(pName.str());
64
65 if (!Directory::m_Path.empty())
Stephen Hines37b74a32014-11-26 18:48:20 -080066 m_bInSysroot = (Directory::m_Path.native()[0] == '=');
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070067
68 Directory::m_Path.m_append_separator_if_needed();
69 if (m_bInSysroot)
70 Directory::m_Path.native().erase(Directory::m_Path.native().begin());
71 else
Stephen Hines37b74a32014-11-26 18:48:20 -080072 sys::fs::detail::open_dir(*this);
73 Directory::m_FileStatus = sys::fs::FileStatus();
74 Directory::m_SymLinkStatus = sys::fs::FileStatus();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070075 Directory::m_Cache.clear();
76 Directory::m_Handler = 0;
77 return (*this);
78}
79
Stephen Hines37b74a32014-11-26 18:48:20 -080080MCLDDirectory::~MCLDDirectory() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070081}
82
Stephen Hines37b74a32014-11-26 18:48:20 -080083bool MCLDDirectory::isInSysroot() const {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070084 return m_bInSysroot;
85}
86
Stephen Hines37b74a32014-11-26 18:48:20 -080087void MCLDDirectory::setSysroot(const sys::fs::Path& pSysroot) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070088 if (m_bInSysroot) {
89 std::string old_path = Directory::m_Path.native();
90 Directory::m_Path.native() = pSysroot.native();
91 Directory::m_Path.m_append_separator_if_needed();
92 Directory::m_Path.native() += old_path;
Stephen Hines37b74a32014-11-26 18:48:20 -080093 sys::fs::detail::canonicalize(Directory::m_Path.native());
94 sys::fs::detail::open_dir(*this);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070095 }
96}
97
Stephen Hines37b74a32014-11-26 18:48:20 -080098} // namespace mcld