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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_masterproject_generator.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:30:56  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: msvc_masterproject_generator.cpp,v 1000.1 2004/06/01 18:30:56 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_masterproject_generator.hpp>
  39. #include <app/project_tree_builder/msvc_prj_utils.hpp>
  40. #include <app/project_tree_builder/proj_builder_app.hpp>
  41. #include <app/project_tree_builder/msvc_prj_defines.hpp>
  42. BEGIN_NCBI_SCOPE
  43. static void
  44. s_RegisterCreatedFilter(CRef<CFilter>& filter, CSerialObject* parent);
  45. //-----------------------------------------------------------------------------
  46. CMsvcMasterProjectGenerator::CMsvcMasterProjectGenerator
  47.     ( const CProjectItemsTree& tree,
  48.       const list<SConfigInfo>& configs,
  49.       const string&            project_dir)
  50.     :m_Tree          (tree),
  51.      m_Configs       (configs),
  52.  m_Name          ("-HIERARCHICAL-VIEW-"), //_MasterProject
  53.      m_ProjectDir    (project_dir),
  54.      m_ProjectItemExt("._"),
  55.      m_FilesSubdir   ("UtilityProjectsFiles")
  56. {
  57.     m_CustomBuildCommand  = "@echo onn";
  58.     m_CustomBuildCommand += "devenv "
  59.                             "/build $(ConfigurationName) "
  60.                             "/project $(InputName) "
  61.                             ""$(SolutionPath)"n";
  62. }
  63. CMsvcMasterProjectGenerator::~CMsvcMasterProjectGenerator(void)
  64. {
  65. }
  66. void 
  67. CMsvcMasterProjectGenerator::SaveProject()
  68. {
  69.     CVisualStudioProject xmlprj;
  70.     CreateUtilityProject(m_Name, m_Configs, &xmlprj);
  71.     {{
  72.         CProjectTreeFolders folders(m_Tree);
  73.         ProcessTreeFolder(folders.m_RootParent, &xmlprj.SetFiles());
  74.     }}
  75.     SaveIfNewer(GetPath(), xmlprj);
  76. }
  77. string CMsvcMasterProjectGenerator::GetPath() const
  78. {
  79.     string project_path = 
  80.         CDirEntry::ConcatPath(m_ProjectDir, "_HIERARCHICAL_VIEW_");
  81.     project_path += MSVC_PROJECT_FILE_EXT;
  82.     return project_path;
  83. }
  84. void CMsvcMasterProjectGenerator::ProcessTreeFolder
  85.                                         (const SProjectTreeFolder&  folder,
  86.                                          CSerialObject*             parent)
  87. {
  88.     if ( folder.IsRoot() ) {
  89.         ITERATE(SProjectTreeFolder::TSiblings, p, folder.m_Siblings) {
  90.             
  91.             ProcessTreeFolder(*(p->second), parent);
  92.         }
  93.     } else {
  94.         CRef<CFilter> filter(new CFilter());
  95.         filter->SetAttlist().SetName(folder.m_Name);
  96.         filter->SetAttlist().SetFilter("");
  97.         s_RegisterCreatedFilter(filter, parent);
  98.         ITERATE(SProjectTreeFolder::TProjects, p, folder.m_Projects) {
  99.             const CProjKey& project_id = *p;
  100.             AddProjectToFilter(filter, project_id);
  101.         }
  102.         ITERATE(SProjectTreeFolder::TSiblings, p, folder.m_Siblings) {
  103.             
  104.             ProcessTreeFolder(*(p->second), filter);
  105.         }
  106.     }
  107. }
  108. static void
  109. s_RegisterCreatedFilter(CRef<CFilter>& filter, CSerialObject* parent)
  110. {
  111.     {{
  112.         // Files section?
  113.         CFiles* files_parent = dynamic_cast< CFiles* >(parent);
  114.         if (files_parent != NULL) {
  115.             // Parent is <Files> section of MSVC project
  116.             files_parent->SetFilter().push_back(filter);
  117.             return;
  118.         }
  119.     }}
  120.     {{
  121.         // Another folder?
  122.         CFilter* filter_parent = dynamic_cast< CFilter* >(parent);
  123.         if (filter_parent != NULL) {
  124.             // Parent is another Filter (folder)
  125.             CRef< CFilter_Base::C_FF::C_E > ce(new CFilter_Base::C_FF::C_E());
  126.             ce->SetFilter(*filter);
  127.             filter_parent->SetFF().SetFF().push_back(ce);
  128.             return;
  129.         }
  130.     }}
  131. }
  132. void 
  133. CMsvcMasterProjectGenerator::AddProjectToFilter(CRef<CFilter>&   filter, 
  134.                                                 const CProjKey&  project_id)
  135. {
  136.     CProjectItemsTree::TProjects::const_iterator p = 
  137.         m_Tree.m_Projects.find(project_id);
  138.     if (p != m_Tree.m_Projects.end()) {
  139.         // Add project to this filter (folder)
  140.         const CProjItem& project = p->second;
  141.         CreateProjectFileItem(project_id);
  142.         SCustomBuildInfo build_info;
  143.         string source_file_path_abs = 
  144.             CDirEntry::ConcatPath(m_ProjectDir, 
  145.                                   CreateProjectName(project_id) + m_ProjectItemExt);
  146.         source_file_path_abs = CDirEntry::NormalizePath(source_file_path_abs);
  147.         build_info.m_SourceFile  = source_file_path_abs;
  148.         build_info.m_Description = "Building project : $(InputName)";
  149.         build_info.m_CommandLine = m_CustomBuildCommand;
  150.         build_info.m_Outputs     = "$(InputPath).aanofile.out";
  151.         
  152.         AddCustomBuildFileToFilter(filter, 
  153.                                    m_Configs, 
  154.                                    m_ProjectDir, 
  155.                                    build_info);
  156.     } else {
  157.         LOG_POST(Error << "No project with id : " + project_id.Id());
  158.     }
  159. }
  160. void 
  161. CMsvcMasterProjectGenerator::CreateProjectFileItem(const CProjKey& project_id)
  162. {
  163.     string file_path = 
  164.         CDirEntry::ConcatPath(m_ProjectDir, CreateProjectName(project_id));
  165.     file_path += m_ProjectItemExt;
  166.     // Create dir if no such dir...
  167.     string dir;
  168.     CDirEntry::SplitPath(file_path, &dir);
  169.     CDir project_dir(dir);
  170.     if ( !project_dir.Exists() ) {
  171.         CDir(dir).CreatePath();
  172.     }
  173.     CNcbiOfstream  ofs(file_path.c_str(), IOS_BASE::out | IOS_BASE::trunc);
  174.     if ( !ofs )
  175.         NCBI_THROW(CProjBulderAppException, eFileCreation, file_path);
  176. }
  177. END_NCBI_SCOPE
  178. /*
  179.  * ===========================================================================
  180.  * $Log: msvc_masterproject_generator.cpp,v $
  181.  * Revision 1000.1  2004/06/01 18:30:56  gouriano
  182.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  183.  *
  184.  * Revision 1.15  2004/05/21 21:41:41  gorelenk
  185.  * Added PCH ncbi_pch.hpp
  186.  *
  187.  * Revision 1.14  2004/02/20 22:53:25  gorelenk
  188.  * Added analysis of ASN projects depends.
  189.  *
  190.  * Revision 1.13  2004/02/13 20:39:51  gorelenk
  191.  * Minor cosmetic changes.
  192.  *
  193.  * Revision 1.12  2004/02/12 23:15:29  gorelenk
  194.  * Implemented utility projects creation and configure re-build of the app.
  195.  *
  196.  * Revision 1.11  2004/02/12 17:45:12  gorelenk
  197.  * Redesigned projects saving.
  198.  *
  199.  * Revision 1.10  2004/02/12 16:27:56  gorelenk
  200.  * Changed generation of command line for datatool.
  201.  *
  202.  * Revision 1.9  2004/02/10 22:12:43  gorelenk
  203.  * Added creation of new dir while saving _MasterProject parts.
  204.  *
  205.  * Revision 1.8  2004/02/10 18:21:44  gorelenk
  206.  * Implemented overwrite only in case when _MasterProject is different from
  207.  * already present one.
  208.  *
  209.  * Revision 1.7  2004/02/04 23:59:52  gorelenk
  210.  * Changed log messages generation.
  211.  *
  212.  * Revision 1.6  2004/02/03 17:21:59  gorelenk
  213.  * Changed implementation of class CMsvcMasterProjectGenerator constructor.
  214.  *
  215.  * Revision 1.5  2004/01/30 20:45:50  gorelenk
  216.  * Changed procedure of folders generation.
  217.  *
  218.  * Revision 1.4  2004/01/28 17:55:48  gorelenk
  219.  * += For msvc makefile support of :
  220.  *                 Requires tag, ExcludeProject tag,
  221.  *                 AddToProject section (SourceFiles and IncludeDirs),
  222.  *                 CustomBuild section.
  223.  * += For support of user local site.
  224.  *
  225.  * Revision 1.3  2004/01/26 19:27:28  gorelenk
  226.  * += MSVC meta makefile support
  227.  * += MSVC project makefile support
  228.  *
  229.  * Revision 1.2  2004/01/22 17:57:54  gorelenk
  230.  * first version
  231.  *
  232.  * ===========================================================================
  233.  */