MCLDDirectory.cpp revision 5460a1f25d9ddecb5c70667267d66d51af177a99
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