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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_dlls_info.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/16 17:02:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: msvc_dlls_info.cpp,v 1000.4 2004/06/16 17:02:26 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/msvc_dlls_info.hpp>
  39. #include <app/project_tree_builder/proj_builder_app.hpp>
  40. #include <app/project_tree_builder/msvc_prj_defines.hpp>
  41. #include <app/project_tree_builder/proj_projects.hpp>
  42. #include <app/project_tree_builder/proj_tree_builder.hpp>
  43. #include <app/project_tree_builder/msvc_project_context.hpp>
  44. #include <app/project_tree_builder/msvc_prj_files_collector.hpp>
  45. #include <app/project_tree_builder/msvc_dlls_info_utils.hpp>
  46. #include <corelib/ncbistre.hpp>
  47. #include <algorithm>
  48. BEGIN_NCBI_SCOPE
  49. CMsvcDllsInfo::CMsvcDllsInfo(const string& file_path)
  50. {
  51.     CNcbiIfstream ifs(file_path.c_str(), IOS_BASE::in | IOS_BASE::binary);
  52.     if (ifs) {
  53.         //read registry
  54.         m_Registry.Read(ifs);
  55.     }
  56. }
  57. CMsvcDllsInfo::~CMsvcDllsInfo(void)
  58. {
  59. }
  60. void CMsvcDllsInfo::GetDllsList(list<string>* dlls_ids) const
  61. {
  62.     ncbi::GetDllsList(m_Registry, dlls_ids);
  63. }
  64. void CMsvcDllsInfo::GetBuildConfigs(list<SConfigInfo>* config) const
  65. {
  66.     config->clear();
  67.     string configs_str = 
  68.         m_Registry.GetString("DllBuild", "Configurations", "");
  69.     list<string> config_names;
  70.     NStr::Split(configs_str, LIST_SEPARATOR, config_names);
  71.     LoadConfigInfoByNames(GetApp().GetConfig(), config_names, config);
  72. }
  73. string CMsvcDllsInfo::GetBuildDefine(void) const
  74. {
  75.     return m_Registry.GetString("DllBuild", "BuildDefine", "");
  76. }
  77. bool CMsvcDllsInfo::SDllInfo::IsEmpty(void) const
  78. {
  79.     return  m_Hosting.empty() &&
  80.             m_Depends.empty() &&
  81.             m_DllDefine.empty();
  82. }
  83.  
  84.        
  85. void CMsvcDllsInfo::SDllInfo::Clear(void)
  86. {
  87.     m_Hosting.clear();
  88.     m_Depends.clear();
  89.     m_DllDefine.erase();
  90. }
  91. void CMsvcDllsInfo::GetDllInfo(const string& dll_id, SDllInfo* dll_info) const
  92. {
  93.     dll_info->Clear();
  94.     GetHostedLibs(m_Registry, dll_id, &(dll_info->m_Hosting) );
  95.     string depends_str = m_Registry.GetString(dll_id, "Dependencies", "");
  96.     NStr::Split(depends_str, LIST_SEPARATOR, dll_info->m_Depends);
  97.     dll_info->m_DllDefine = m_Registry.GetString(dll_id, "DllDefine", "");
  98. }
  99. bool CMsvcDllsInfo::IsDllHosted(const string& lib_id) const
  100. {
  101.     return !GetDllHost(lib_id).empty();
  102. }
  103. string CMsvcDllsInfo::GetDllHost(const string& lib_id) const
  104. {
  105.     list<string> dll_list;
  106.     GetDllsList(&dll_list);
  107.     ITERATE(list<string>, p, dll_list) {
  108.         const string& dll_id = *p;
  109.         SDllInfo dll_info;
  110.         GetDllInfo(dll_id, &dll_info);
  111.         if (find(dll_info.m_Hosting.begin(),
  112.                  dll_info.m_Hosting.end(),
  113.                  lib_id) != dll_info.m_Hosting.end()) {
  114.             return dll_id;
  115.         }
  116.     }
  117.     return "";
  118. }
  119. //-----------------------------------------------------------------------------
  120. void FilterOutDllHostedProjects(const CProjectItemsTree& tree_src, 
  121.                                 CProjectItemsTree*       tree_dst)
  122. {
  123.     tree_dst->m_RootSrc = tree_src.m_RootSrc;
  124.     tree_dst->m_Projects.clear();
  125.     ITERATE(CProjectItemsTree::TProjects, p, tree_src.m_Projects) {
  126.         const CProjKey&  proj_id = p->first;
  127.         const CProjItem& project = p->second;
  128.         bool dll_hosted = (proj_id.Type() == CProjKey::eLib)  &&
  129.                            GetApp().GetDllsInfo().IsDllHosted(proj_id.Id());
  130.         if ( !dll_hosted ) {
  131.             tree_dst->m_Projects[proj_id] = project;
  132.         }
  133.     }    
  134. }
  135. static bool s_IsInTree(CProjKey::TProjType      proj_type,
  136.                        const string&            proj_id,
  137.                        const CProjectItemsTree& tree)
  138. {
  139.     return tree.m_Projects.find
  140.                   (CProjKey(proj_type, 
  141.                             proj_id)) != 
  142.                                     tree.m_Projects.end();
  143. }
  144. static bool s_IsDllProject(const string& project_id)
  145. {
  146.     CMsvcDllsInfo::SDllInfo dll_info;
  147.     GetApp().GetDllsInfo().GetDllInfo(project_id, &dll_info);
  148.     return !dll_info.IsEmpty();
  149. }
  150. static void s_InitalizeDllProj(const string&                  dll_id, 
  151.                                const CMsvcDllsInfo::SDllInfo& dll_info,
  152.                                CProjItem*                     dll,
  153.                                CProjectItemsTree*             tree_dst)
  154. {
  155.     dll->m_Name           = dll_id;
  156.     dll->m_ID             = dll_id;
  157.     dll->m_ProjType       = CProjKey::eDll;
  158.     ITERATE(list<string>, p, dll_info.m_Depends) {
  159.         const string& depend_id = *p;
  160.         // Is this a dll?
  161.         if ( s_IsDllProject(depend_id) ) {
  162.             dll->m_Depends.push_back(CProjKey(CProjKey::eDll, 
  163.                                                depend_id));    
  164.         } else  {
  165.             if ( s_IsInTree(CProjKey::eApp, 
  166.                             depend_id, 
  167.                             GetApp().GetWholeTree()) ) {
  168.                 CProjKey depend_key(CProjKey::eApp, depend_id);
  169.                 dll->m_Depends.push_back(depend_key);
  170.                 tree_dst->m_Projects[depend_key] = 
  171.                  (GetApp().GetWholeTree().m_Projects.find(depend_key))->second;
  172.             }
  173.             else if ( s_IsInTree(CProjKey::eLib, 
  174.                                  depend_id, 
  175.                                  GetApp().GetWholeTree()) ) {
  176.                 CProjKey depend_key(CProjKey::eLib, depend_id);
  177.                 dll->m_Depends.push_back(depend_key); 
  178.                 tree_dst->m_Projects[depend_key] = 
  179.                  (GetApp().GetWholeTree().m_Projects.find(depend_key))->second;
  180.             } else  {
  181.                 LOG_POST(Error << "Can not find project : " + depend_id);
  182.             }
  183.         }
  184.     }
  185.     string dll_project_dir = GetApp().GetProjectTreeInfo().m_Compilers;
  186.     dll_project_dir = 
  187.         CDirEntry::ConcatPath(dll_project_dir, 
  188.                               GetApp().GetRegSettings().m_CompilersSubdir);
  189.     dll_project_dir = 
  190.         CDirEntry::ConcatPath(dll_project_dir, 
  191.                               GetApp().GetBuildType().GetTypeStr());
  192.     dll_project_dir =
  193.         CDirEntry::ConcatPath(dll_project_dir,
  194.                               GetApp().GetRegSettings().m_ProjectsSubdir);
  195.     dll_project_dir = 
  196.         CDirEntry::ConcatPath(dll_project_dir, dll_id);
  197.     dll_project_dir = CDirEntry::AddTrailingPathSeparator(dll_project_dir);
  198.     dll->m_SourcesBaseDir = dll_project_dir;
  199.     dll->m_Sources.clear();
  200.     dll->m_Sources.push_back("..\..\dll_main");
  201. }
  202. static void s_AddProjItemToDll(const CProjItem& lib, CProjItem* dll)
  203. {
  204.     // If this library is available as a third-party,
  205.     // then we'll require it
  206.     if (GetApp().GetSite().GetChoiceForLib(lib.m_ID) 
  207.                                                    == CMsvcSite::e3PartyLib ) {
  208.         CMsvcSite::SLibChoice choice = 
  209.             GetApp().GetSite().GetLibChoiceForLib(lib.m_ID);
  210.         dll->m_Requires.push_back(choice.m_3PartyLib);
  211.         dll->m_Requires.sort();
  212.         dll->m_Requires.unique();
  213.         return;
  214.     }
  215.     CMsvcPrjProjectContext lib_context(lib);
  216.     CMsvcPrjFilesCollector collector(lib_context, lib);
  217.     // Sources - all pathes are relative to one dll->m_SourcesBaseDir
  218.     ITERATE(list<string>, p, collector.SourceFiles()) {
  219.         const string& rel_path = *p;
  220.         string abs_path = 
  221.             CDirEntry::ConcatPath(lib_context.ProjectDir(), rel_path);
  222.         abs_path = CDirEntry::NormalizePath(abs_path);
  223.         // Register DLL source files as belongs to lib
  224.         // With .ext 
  225.         GetApp().GetDllFilesDistr().RegisterSource
  226.             (abs_path,
  227.              CProjKey(CProjKey::eDll, dll->m_ID),
  228.              CProjKey(CProjKey::eLib, lib.m_ID) );
  229.         string dir;
  230.         string base;
  231.         CDirEntry::SplitPath(abs_path, &dir, &base);
  232.         string abs_source_path = dir + base;
  233.         string new_rel_path = 
  234.             CDirEntry::CreateRelativePath(dll->m_SourcesBaseDir, 
  235.                                           abs_source_path);
  236.         dll->m_Sources.push_back(new_rel_path);
  237.     }
  238.     dll->m_Sources.sort();
  239.     dll->m_Sources.unique();
  240.     // Header files - also register them
  241.     ITERATE(list<string>, p, collector.HeaderFiles()) {
  242.         const string& rel_path = *p;
  243.         string abs_path = 
  244.             CDirEntry::ConcatPath(lib_context.ProjectDir(), rel_path);
  245.         abs_path = CDirEntry::NormalizePath(abs_path);
  246.         GetApp().GetDllFilesDistr().RegisterHeader
  247.             (abs_path,
  248.              CProjKey(CProjKey::eDll, dll->m_ID),
  249.              CProjKey(CProjKey::eLib, lib.m_ID) );
  250.     }
  251.     // Inline files - also register them
  252.     ITERATE(list<string>, p, collector.InlineFiles()) {
  253.         const string& rel_path = *p;
  254.         string abs_path = 
  255.             CDirEntry::ConcatPath(lib_context.ProjectDir(), rel_path);
  256.         abs_path = CDirEntry::NormalizePath(abs_path);
  257.         GetApp().GetDllFilesDistr().RegisterInline
  258.             (abs_path,
  259.              CProjKey(CProjKey::eDll, dll->m_ID),
  260.              CProjKey(CProjKey::eLib, lib.m_ID) );
  261.     }
  262.     // Depends
  263.     ITERATE(list<CProjKey>, p, lib.m_Depends) {
  264.         const CProjKey& depend_id = *p;
  265.         bool dll_hosted = (depend_id.Type() == CProjKey::eLib)  &&
  266.                            GetApp().GetDllsInfo().IsDllHosted(depend_id.Id());
  267.         if ( !dll_hosted ) {
  268.             dll->m_Depends.push_back(depend_id);
  269.         } else {
  270.             dll->m_Depends.push_back
  271.                 (CProjKey(CProjKey::eDll, 
  272.                  GetApp().GetDllsInfo().GetDllHost(depend_id.Id())));
  273.         }
  274.     }
  275.     dll->m_Depends.sort();
  276.     dll->m_Depends.unique();
  277.     // m_Requires
  278.     copy(lib.m_Requires.begin(), 
  279.          lib.m_Requires.end(), back_inserter(dll->m_Requires));
  280.     dll->m_Requires.sort();
  281.     dll->m_Requires.unique();
  282.     // Libs 3-Party
  283.     copy(lib.m_Libs3Party.begin(), 
  284.          lib.m_Libs3Party.end(), back_inserter(dll->m_Libs3Party));
  285.     dll->m_Libs3Party.sort();
  286.     dll->m_Libs3Party.unique();
  287.     // m_IncludeDirs
  288.     copy(lib.m_IncludeDirs.begin(), 
  289.          lib.m_IncludeDirs.end(), back_inserter(dll->m_IncludeDirs));
  290.     dll->m_IncludeDirs.sort();
  291.     dll->m_IncludeDirs.unique();
  292.     // m_DatatoolSources
  293.     copy(lib.m_DatatoolSources.begin(), 
  294.          lib.m_DatatoolSources.end(), back_inserter(dll->m_DatatoolSources));
  295.     dll->m_DatatoolSources.sort();
  296.     dll->m_DatatoolSources.unique();
  297.     // m_Defines
  298.     copy(lib.m_Defines.begin(), 
  299.          lib.m_Defines.end(), back_inserter(dll->m_Defines));
  300.     dll->m_Defines.sort();
  301.     dll->m_Defines.unique();
  302.     {{
  303.         string makefile_name = 
  304.             SMakeProjectT::CreateMakeAppLibFileName(lib.m_SourcesBaseDir,
  305.                                                     lib.m_Name);
  306.         CSimpleMakeFileContents makefile
  307.                                  (CDirEntry::ConcatPath(lib.m_SourcesBaseDir,
  308.                                                         makefile_name));
  309.         CSimpleMakeFileContents::TContents::const_iterator p = 
  310.             makefile.m_Contents.find("NCBI_C_LIBS");
  311.         list<string> ncbi_clibs;
  312.         if (p != makefile.m_Contents.end()) {
  313.             SAppProjectT::CreateNcbiCToolkitLibs(makefile, &ncbi_clibs);
  314.             dll->m_Libs3Party.push_back("NCBI_C_LIBS");
  315.             dll->m_Libs3Party.sort();
  316.             dll->m_Libs3Party.unique();
  317.             copy(ncbi_clibs.begin(),
  318.                  ncbi_clibs.end(),
  319.                  back_inserter(dll->m_NcbiCLibs));
  320.             dll->m_NcbiCLibs.sort();
  321.             dll->m_NcbiCLibs.unique();
  322.         }
  323.     }}
  324.     // m_NcbiCLibs
  325.     copy(lib.m_NcbiCLibs.begin(), 
  326.          lib.m_NcbiCLibs.end(), back_inserter(dll->m_NcbiCLibs));
  327.     dll->m_NcbiCLibs.sort();
  328.     dll->m_NcbiCLibs.unique();
  329.     auto_ptr<CMsvcProjectMakefile> msvc_project_makefile = 
  330.         auto_ptr<CMsvcProjectMakefile>
  331.             (new CMsvcProjectMakefile
  332.                     (CDirEntry::ConcatPath
  333.                             (lib.m_SourcesBaseDir, 
  334.                              CreateMsvcProjectMakefileName(lib))));
  335. }
  336. void CreateDllBuildTree(const CProjectItemsTree& tree_src, 
  337.                         CProjectItemsTree*       tree_dst)
  338. {
  339.     tree_dst->m_RootSrc = tree_src.m_RootSrc;
  340.     FilterOutDllHostedProjects(tree_src, tree_dst);
  341.     NON_CONST_ITERATE(CProjectItemsTree::TProjects, p, tree_dst->m_Projects) {
  342.         list<CProjKey> new_depends;
  343.         CProjItem& project = p->second;
  344.         ITERATE(list<CProjKey>, n, project.m_Depends) {
  345.             const CProjKey& depend_id = *n;
  346.             bool dll_hosted = 
  347.                 (depend_id.Type() == CProjKey::eLib)  &&
  348.                  GetApp().GetDllsInfo().IsDllHosted(depend_id.Id());
  349.             if ( !dll_hosted ) {
  350.                 new_depends.push_back(depend_id);
  351.             } else {
  352.                 new_depends.push_back
  353.                     (CProjKey(CProjKey::eDll, 
  354.                      GetApp().GetDllsInfo().GetDllHost(depend_id.Id())));
  355.             }
  356.         }
  357.         new_depends.sort();
  358.         new_depends.unique();
  359.         project.m_Depends = new_depends;
  360.     }
  361.     list<string> dll_ids;
  362.     CreateDllsList(tree_src, &dll_ids);
  363.     list<string> dll_depends_ids;
  364.     CollectDllsDepends(dll_ids, &dll_depends_ids);
  365.     copy(dll_depends_ids.begin(), 
  366.         dll_depends_ids.end(), back_inserter(dll_ids));
  367.     dll_ids.sort();
  368.     dll_ids.unique();
  369.     ITERATE(list<string>, p, dll_ids) {
  370.         const string& dll_id = *p;
  371.         CMsvcDllsInfo::SDllInfo dll_info;
  372.         GetApp().GetDllsInfo().GetDllInfo(dll_id, &dll_info);
  373.         CProjItem dll;
  374.         s_InitalizeDllProj(dll_id, dll_info, &dll, tree_dst);
  375.         ITERATE(list<string>, n, dll_info.m_Hosting) {
  376.             const string& lib_id = *n;
  377.             CProjectItemsTree::TProjects::const_iterator k = 
  378.              GetApp().GetWholeTree().m_Projects.find(CProjKey(CProjKey::eLib,
  379.                                                               lib_id));
  380.             if (k == GetApp().GetWholeTree().m_Projects.end()) {
  381.                 LOG_POST(Error << "No project " +
  382.                                    lib_id + " hosted in dll : " + dll_id);
  383.                 continue;
  384.             }
  385.             const CProjItem& lib = k->second;
  386.             s_AddProjItemToDll(lib, &dll);
  387.         }
  388.         tree_dst->m_Projects[CProjKey(CProjKey::eDll, dll_id)] = dll;
  389.     }
  390. }
  391. void CreateDllsList(const CProjectItemsTree& tree_src,
  392.                     list<string>*            dll_ids)
  393. {
  394.     dll_ids->clear();
  395.     set<string> dll_set;
  396.     ITERATE(CProjectItemsTree::TProjects, p, tree_src.m_Projects) {
  397.         const CProjKey&  proj_id = p->first;
  398.         const CProjItem& project = p->second;
  399.         bool dll_hosted = (proj_id.Type() == CProjKey::eLib)  &&
  400.                            GetApp().GetDllsInfo().IsDllHosted(proj_id.Id());
  401.         if ( dll_hosted ) {
  402.             dll_set.insert(GetApp().GetDllsInfo().GetDllHost(proj_id.Id()));
  403.         }
  404.     }    
  405.     copy(dll_set.begin(), dll_set.end(), back_inserter(*dll_ids));
  406. }
  407. void CollectDllsDepends(const list<string>& dll_ids,
  408.                         list<string>*       dll_depends_ids)
  409. {
  410.     size_t depends_cnt = dll_depends_ids->size();
  411.     ITERATE(list<string>, p, dll_ids) {
  412.         const string& dll_id = *p;
  413.         CMsvcDllsInfo::SDllInfo dll_info;
  414.         GetApp().GetDllsInfo().GetDllInfo(dll_id, &dll_info);
  415.         ITERATE(list<string>, n, dll_info.m_Depends) {
  416.             const string& depend_id = *n;
  417.             if ( s_IsDllProject(depend_id)  &&
  418.                  find(dll_ids.begin(), 
  419.                       dll_ids.end(), depend_id) == dll_ids.end() ) {
  420.                 dll_depends_ids->push_back(depend_id);
  421.             }
  422.         }
  423.     }
  424.     
  425.     dll_depends_ids->sort();
  426.     dll_depends_ids->unique();
  427.     if ( !(dll_depends_ids->size() > depends_cnt) )
  428.         return;
  429.     
  430.     list<string> total_dll_ids(dll_ids);
  431.     copy(dll_depends_ids->begin(), 
  432.          dll_depends_ids->end(), back_inserter(total_dll_ids));
  433.     total_dll_ids.sort();
  434.     total_dll_ids.unique();
  435.     CollectDllsDepends(total_dll_ids, dll_depends_ids);
  436. }
  437. END_NCBI_SCOPE
  438. /*
  439.  * ===========================================================================
  440.  * $Log: msvc_dlls_info.cpp,v $
  441.  * Revision 1000.4  2004/06/16 17:02:26  gouriano
  442.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.19
  443.  *
  444.  * Revision 1.19  2004/06/07 13:46:21  gorelenk
  445.  * Class CMsvcDllsInfo separated from application config.
  446.  *
  447.  * Revision 1.18  2004/06/04 14:48:53  gorelenk
  448.  * Changed dll_main location.
  449.  *
  450.  * Revision 1.17  2004/06/01 16:05:40  gorelenk
  451.  * Changed implementation of s_AddProjItemToDll : added conditional branch for
  452.  * processing lib_choice when library to add is available as a third-party .
  453.  *
  454.  * Revision 1.16  2004/05/26 17:58:03  gorelenk
  455.  * Changed implementation of s_AddProjItemToDll - added registration of
  456.  * inline source files.
  457.  *
  458.  * Revision 1.15  2004/05/21 21:41:41  gorelenk
  459.  * Added PCH ncbi_pch.hpp
  460.  *
  461.  * Revision 1.14  2004/05/19 14:24:32  gorelenk
  462.  * Changed s_AddProjItemToDll - added code for registration of DLLs source
  463.  * files.
  464.  *
  465.  * Revision 1.13  2004/04/20 14:14:24  gorelenk
  466.  * Changed implementation of CMsvcDllsInfo::GetDllsList and
  467.  * CMsvcDllsInfo::GetDllInfo .
  468.  *
  469.  * Revision 1.12  2004/04/13 17:07:52  gorelenk
  470.  * Changed implementation of s_InitalizeDllProj .
  471.  *
  472.  * Revision 1.11  2004/03/23 14:39:41  gorelenk
  473.  * Changed implementation of functions s_InitalizeDllProj and
  474.  * CreateDllBuildTree to use whole build tree by GetApp().GetWholeTree().
  475.  *
  476.  * Revision 1.10  2004/03/16 23:51:43  gorelenk
  477.  * Changed implementation of s_AddProjItemToDll .
  478.  *
  479.  * Revision 1.9  2004/03/16 17:43:33  gorelenk
  480.  * Addition of dllmain moved from s_AddProjItemToDll to s_InitalizeDllProj .
  481.  *
  482.  * Revision 1.8  2004/03/16 16:37:33  gorelenk
  483.  * Changed msvc7_prj subdirs structure: Separated "static" and "dll" branches.
  484.  *
  485.  * Revision 1.7  2004/03/15 21:21:47  gorelenk
  486.  * Added definition of function CollectDllsDepends. Changed implementation of
  487.  * function CreateDllBuildTree.
  488.  *
  489.  * Revision 1.6  2004/03/12 20:20:00  gorelenk
  490.  * Changed implementation of s_InitalizeDllProj - changed processing of
  491.  * dll dependencies.
  492.  *
  493.  * Revision 1.5  2004/03/10 22:54:58  gorelenk
  494.  * Changed implementation of s_InitalizeDllProj - added dependencies from
  495.  * other dll.
  496.  *
  497.  * Revision 1.4  2004/03/10 16:36:39  gorelenk
  498.  * Implemented functions FilterOutDllHostedProjects,
  499.  * CreateDllBuildTree and CreateDllsList.
  500.  *
  501.  * Revision 1.3  2004/03/08 23:34:06  gorelenk
  502.  * Implemented member-functions GelDllInfo, IsDllHosted, GetDllHost and
  503.  * GetLibPrefixes of class CMsvcDllsInfo.
  504.  *
  505.  * Revision 1.2  2004/03/03 22:16:45  gorelenk
  506.  * Added implementation of class CMsvcDllsInfo.
  507.  *
  508.  * Revision 1.1  2004/03/03 17:07:14  gorelenk
  509.  * Initial revision.
  510.  *
  511.  * ===========================================================================
  512.  */