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