15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- SearchDirs.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//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/SearchDirs.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/MC/MCLDDirectory.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileSystem.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Non-member functions 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaostatic inline void SpecToFilename(const std::string& pSpec, std::string& pFile) 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pFile = "lib"; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao pFile += pSpec; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 24affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===----------------------------------------------------------------------===// 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SearchDirs 2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSearchDirs::SearchDirs() 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // a magic number 8, no why. 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // please prove it or change it 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao m_DirList.reserve(8); 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSearchDirs::SearchDirs(const sys::fs::Path& pSysRoot) 3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao : m_SysRoot(pSysRoot) { 3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // a magic number 8, no why. 3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // please prove it or change it 3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_DirList.reserve(8); 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoSearchDirs::~SearchDirs() 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao iterator dir, dirEnd = end(); 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for (dir = begin(); dir!=dirEnd; ++dir) { 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao delete (*dir); 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SearchDirs::insert(const std::string& pPath) 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MCLDDirectory* dir = new MCLDDirectory(pPath); 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (dir->isInSysroot()) 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao dir->setSysroot(m_SysRoot); 5422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (exists(dir->path()) && is_directory(dir->path())) { 5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao m_DirList.push_back(dir); 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return true; 5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines else { 606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines delete dir; 616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return false; 626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines } 636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return true; 646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} 656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesbool SearchDirs::insert(const char* pPath) 676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{ 686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines return insert(std::string(pPath)); 6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool SearchDirs::insert(const sys::fs::Path& pPath) 7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return insert(pPath.native()); 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesmcld::sys::fs::Path* 7787f34658dec9097d987d254a990ea7f311bfc95fStephen HinesSearchDirs::find(const std::string& pNamespec, mcld::Input::Type pType) 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(Input::DynObj == pType || 8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input::Archive == pType || 8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input::Script == pType); 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string file; 8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines switch(pType) { 8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Script: 8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines file.assign(pNamespec); 8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::DynObj: 8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Archive : 9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SpecToFilename(pNamespec, file); 9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines default: 9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } // end of switch 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // for all MCLDDirectorys 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao DirList::iterator mcld_dir, mcld_dir_end = m_DirList.end(); 9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mcld_dir = m_DirList.begin(); mcld_dir != mcld_dir_end; ++mcld_dir) { 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // for all entries in MCLDDirectory 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDDirectory::iterator entry = (*mcld_dir)->begin(); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MCLDDirectory::iterator enEnd = (*mcld_dir)->end(); 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao switch(pType) { 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Script: { 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines while (entry != enEnd) { 10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (file == entry.path()->filename()) 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return entry.path(); 10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ++entry; 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::DynObj: { 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines while (entry != enEnd) { 11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (file == entry.path()->stem().native() ) { 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mcld::sys::fs::detail::shared_library_extension == 11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines entry.path()->extension().native()) { 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return entry.path(); 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ++entry; 12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** Fall through **/ 12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Archive : { 12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines entry = (*mcld_dir)->begin(); 12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enEnd = (*mcld_dir)->end(); 12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines while (entry != enEnd) { 12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (file == entry.path()->stem().native() && 12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mcld::sys::fs::detail::static_library_extension == 13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines entry.path()->extension().native()) { 13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return entry.path(); 13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ++entry; 134affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines default: 13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 138affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } // end of switch 13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } // end of for 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoconst mcld::sys::fs::Path* 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoSearchDirs::find(const std::string& pNamespec, mcld::Input::Type pType) const 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{ 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines assert(Input::DynObj == pType || 14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input::Archive == pType || 14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines Input::Script == pType); 14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao std::string file; 15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines switch(pType) { 15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Script: 15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines file.assign(pNamespec); 15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::DynObj: 15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Archive : 15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines SpecToFilename(pNamespec, file); 15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines default: 16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } // end of switch 16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // for all MCLDDirectorys 16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao DirList::const_iterator mcld_dir, mcld_dir_end = m_DirList.end(); 16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines for (mcld_dir = m_DirList.begin(); mcld_dir != mcld_dir_end; ++mcld_dir) { 16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao // for all entries in MCLDDirectory 16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MCLDDirectory::iterator entry = (*mcld_dir)->begin(); 16822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MCLDDirectory::iterator enEnd = (*mcld_dir)->end(); 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao switch(pType) { 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Script: { 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines while (entry != enEnd) { 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (file == entry.path()->filename()) 17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return entry.path(); 17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ++entry; 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::DynObj: { 18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines while (entry != enEnd) { 18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (file == entry.path()->stem().native() ) { 18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (mcld::sys::fs::detail::shared_library_extension == 18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines entry.path()->extension().native()) { 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return entry.path(); 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ++entry; 18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines /** Fall through **/ 19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines case Input::Archive : { 19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines entry = (*mcld_dir)->begin(); 19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines enEnd = (*mcld_dir)->end(); 19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines while ( entry!=enEnd ) { 19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines if (file == entry.path()->stem().native() && 19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines mcld::sys::fs::detail::static_library_extension == 19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines entry.path()->extension().native()) { 19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines return entry.path(); 19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines ++entry; 20122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines } 20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines default: 20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines break; 20522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } // end of switch 206551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines } // end of for 20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return NULL; 20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 209