proj_src_resolver.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:6k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: proj_src_resolver.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:31:27  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: proj_src_resolver.cpp,v 1000.1 2004/06/01 18:31:27 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Viatcheslav Gorelenkov
  35.  *
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <app/project_tree_builder/proj_src_resolver.hpp>
  39. #include <app/project_tree_builder/proj_builder_app.hpp>
  40. BEGIN_NCBI_SCOPE
  41. // collect include statements and resolve to abs pathes 
  42. static void s_GetMakefileIncludes(const string& applib_mfilepath,
  43.                                   const string& source_base_dir,
  44.                                   list<string>* includes)
  45. {
  46.     includes->clear();
  47.     CNcbiIfstream ifs(applib_mfilepath.c_str(), 
  48.                       IOS_BASE::in | IOS_BASE::binary);
  49.     if ( !ifs )
  50.         NCBI_THROW(CProjBulderAppException, eFileOpen, applib_mfilepath);
  51.     string strline;
  52.     while ( getline(ifs, strline) ) {
  53.         const string include_token("include ");
  54.         strline = NStr::TruncateSpaces(strline);
  55.         if ( NStr::StartsWith(strline, include_token) ) {
  56.             string include = strline.substr(include_token.length());
  57.             
  58.             const string srcdir_token("$(srcdir)");
  59.             if (include.find(srcdir_token) == 0) {
  60.                 include = include.substr(srcdir_token.length());
  61.                 include = CDirEntry::ConcatPath(source_base_dir, include);
  62.                 include = CDirEntry::NormalizePath(include);
  63.             }
  64.             includes->push_back(include);
  65.         }
  66.     }
  67. }
  68. //-----------------------------------------------------------------------------
  69. CProjSRCResolver::CProjSRCResolver(const string&       applib_mfilepath,
  70.                              const string&       source_base_dir,
  71.                              const list<string>& sources_src)
  72.  :m_MakefilePath    (applib_mfilepath),
  73.   m_SourcesBaseDir(source_base_dir),
  74.   m_SourcesSrc      (sources_src)
  75. {
  76. }
  77.     
  78. CProjSRCResolver::~CProjSRCResolver(void)
  79. {
  80. }
  81. static bool s_SourceFileExists(const string& dir, const string& name)
  82. {
  83.     string path = CDirEntry::ConcatPath(dir, name);
  84.     if ( CDirEntry(path + ".cpp").Exists() )
  85.         return true;
  86.     if ( CDirEntry(path + ".c").Exists() )
  87.         return true;
  88.     
  89.     return false;
  90. }
  91. void CProjSRCResolver::ResolveTo(list<string>* sources_dst)
  92. {
  93.     sources_dst->clear();
  94.     
  95.     list<string> sources_names;
  96.     ITERATE(list<string>, p, m_SourcesSrc) {
  97.         const string& src = *p;
  98.         if ( !CSymResolver::IsDefine(src) ) {
  99.             sources_names.push_back(src);
  100.         } else {
  101.             PrepereResolver();
  102.             string src_define = FilterDefine(src);
  103.             list<string> resolved_src_defines;
  104.             m_Resolver.Resolve(src_define, &resolved_src_defines);
  105.             copy(resolved_src_defines.begin(),
  106.                  resolved_src_defines.end(),
  107.                  back_inserter(sources_names));
  108.         }
  109.     }
  110.     ITERATE(list<string>, p, sources_names) {
  111.         const string& src = *p;
  112.         bool found = false;
  113.         if ( s_SourceFileExists(m_SourcesBaseDir, src) ) {
  114.             sources_dst->push_back(src);
  115.             found = true;
  116.         } else {
  117.             ITERATE(list<string>, n, m_MakefileDirs) {
  118.                 const string& dir = *n;
  119.                 if ( s_SourceFileExists(dir, src) ) {
  120.                     string path = 
  121.                         CDirEntry::CreateRelativePath(m_SourcesBaseDir, dir);
  122.                     path = CDirEntry::ConcatPath(path, src);
  123.                     sources_dst->push_back(path);
  124.                     found = true;
  125.                     break;
  126.                 }
  127.             }
  128.         }
  129.         if ( !found ) 
  130.             sources_dst->push_back(src);
  131.     }
  132. }
  133. void CProjSRCResolver::PrepereResolver(void)
  134. {
  135.     if ( !m_Resolver.IsEmpty() )
  136.         return;
  137.     list<string> include_makefiles;
  138.     s_GetMakefileIncludes(m_MakefilePath, 
  139.                           m_SourcesBaseDir, &include_makefiles);
  140.     CSymResolver::LoadFrom(m_MakefilePath, &m_Resolver);
  141.     ITERATE(list<string>, p, include_makefiles) {
  142.         const string& makefile_path = *p;
  143.         m_Resolver += CSymResolver(makefile_path);
  144.         string dir;
  145.         CDirEntry::SplitPath(makefile_path, &dir);
  146.         m_MakefileDirs.push_back(dir);
  147.     }
  148. }
  149. END_NCBI_SCOPE
  150. /*
  151.  * ===========================================================================
  152.  * $Log: proj_src_resolver.cpp,v $
  153.  * Revision 1000.1  2004/06/01 18:31:27  gouriano
  154.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  155.  *
  156.  * Revision 1.4  2004/05/21 21:41:41  gorelenk
  157.  * Added PCH ncbi_pch.hpp
  158.  *
  159.  * Revision 1.3  2004/02/12 23:15:30  gorelenk
  160.  * Implemented utility projects creation and configure re-build of the app.
  161.  *
  162.  * Revision 1.2  2004/02/10 18:05:48  gorelenk
  163.  * Implemented recursive resolving for makefiles from different dirs.
  164.  *
  165.  * Revision 1.1  2004/02/04 23:36:45  gorelenk
  166.  * Initial revision.
  167.  *
  168.  * ===========================================================================
  169.  */