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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_prj_utils.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/16 17:05:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.24
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef PROJECT_TREE_BUILDER__MSVC_PRJ_UTILS__HPP
  10. #define PROJECT_TREE_BUILDER__MSVC_PRJ_UTILS__HPP
  11. /* $Id: msvc_prj_utils.hpp,v 1000.3 2004/06/16 17:05:02 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Author:  Viatcheslav Gorelenkov
  37.  *
  38.  */
  39. #include <corelib/ncbireg.hpp>
  40. #include <app/project_tree_builder/msvc71_project__.hpp>
  41. #include <app/project_tree_builder/proj_item.hpp>
  42. #include <set>
  43. #include <corelib/ncbienv.hpp>
  44. BEGIN_NCBI_SCOPE
  45. USING_SCOPE(objects);
  46. /// Creates CVisualStudioProject class instance from file.
  47. ///
  48. /// @param file_path
  49. ///   Path to file load from.
  50. /// @return
  51. ///   Created on heap CVisualStudioProject instance or NULL
  52. ///   if failed.
  53. CVisualStudioProject * LoadFromXmlFile(const string& file_path);
  54. /// Save CVisualStudioProject class instance to file.
  55. ///
  56. /// @param file_path
  57. ///   Path to file project will be saved to.
  58. /// @param project
  59. ///   Project to save.
  60. void SaveToXmlFile  (const string&               file_path, 
  61.                      const CVisualStudioProject& project);
  62. /// Save CVisualStudioProject class instance to file only if no such file 
  63. //  or contents of this file will be different from already present file.
  64. ///
  65. /// @param file_path
  66. ///   Path to file project will be saved to.
  67. /// @param project
  68. ///   Project to save.
  69. void SaveIfNewer    (const string&               file_path, 
  70.                      const CVisualStudioProject& project);
  71. /// Consider promotion candidate to present 
  72. void PromoteIfDifferent(const string& present_path, 
  73.                         const string& candidate_path);
  74. /// Generate pseudo-GUID.
  75. string GenerateSlnGUID(void);
  76. /// Get extension for source file without extension.
  77. ///
  78. /// @param file_path
  79. ///   Source file full path withour extension.
  80. /// @return
  81. ///   Extension of source file (".cpp" or ".c") 
  82. ///   if such file exist. Empty string string if there is no
  83. ///   such file.
  84. string SourceFileExt(const string& file_path);
  85. /////////////////////////////////////////////////////////////////////////////
  86. ///
  87. /// SConfigInfo --
  88. ///
  89. /// Abstraction of configuration informaion.
  90. ///
  91. /// Configuration name, debug/release flag, runtime library 
  92. /// 
  93. struct SConfigInfo
  94. {
  95.     SConfigInfo(void);
  96.     SConfigInfo(const string& name, 
  97.                 bool          debug, 
  98.                 const string& runtime_library);
  99.     string m_Name;
  100.     bool   m_Debug;
  101.     string m_RuntimeLibrary;
  102. };
  103. // Helper to load configs from ini files
  104. void LoadConfigInfoByNames(const CNcbiRegistry& registry, 
  105.                            const list<string>&  config_names, 
  106.                            list<SConfigInfo>*   configs);
  107. /////////////////////////////////////////////////////////////////////////////
  108. ///
  109. /// SCustomBuildInfo --
  110. ///
  111. /// Abstraction of custom build source file.
  112. ///
  113. /// Information for custom buil source file 
  114. /// (not *.c, *.cpp, *.midl, *.rc, etc.)
  115. /// MSVC does not know how to buil this file and
  116. /// we provide information how to do it.
  117. /// 
  118. struct SCustomBuildInfo
  119. {
  120.     string m_SourceFile; // absolut path!
  121.     string m_CommandLine;
  122.     string m_Description;
  123.     string m_Outputs;
  124.     string m_AdditionalDependencies;
  125.     bool IsEmpty(void) const
  126.     {
  127.         return m_SourceFile.empty() || m_CommandLine.empty();
  128.     }
  129.     void Clear(void)
  130.     {
  131.         m_SourceFile.erase();
  132.         m_CommandLine.erase();
  133.         m_Description.erase();
  134.         m_Outputs.erase();
  135.         m_AdditionalDependencies.erase();
  136.     }
  137. };
  138. /////////////////////////////////////////////////////////////////////////////
  139. ///
  140. /// CMsvc7RegSettings --
  141. ///
  142. /// Abstraction of [msvc7] section in app registry.
  143. ///
  144. /// Settings for generation of msvc 7.10 projects
  145. /// 
  146. class CMsvc7RegSettings
  147. {
  148. public:
  149.     CMsvc7RegSettings(void);
  150.     string            m_Version;
  151.     list<SConfigInfo> m_ConfigInfo;
  152.     string            m_CompilersSubdir;
  153.     string            m_ProjectsSubdir;
  154.     string            m_MakefilesExt;
  155.     string            m_MetaMakefile;
  156.     string            m_DllInfo;
  157. private:
  158.     CMsvc7RegSettings(const CMsvc7RegSettings&);
  159.     CMsvc7RegSettings& operator= (const CMsvc7RegSettings&);
  160. };
  161. /// Is abs_dir a parent of abs_parent_dir.
  162. bool IsSubdir(const string& abs_parent_dir, const string& abs_dir);
  163. /// Erase if predicate is true
  164. template <class C, class P> 
  165. void EraseIf(C& cont, const P& pred)
  166. {
  167.     for (typename C::iterator p = cont.begin(); p != cont.end(); )
  168.     {
  169.         if ( pred(*p) ) {
  170.             typename C::iterator p_next = p;
  171.     ++p_next;
  172.             cont.erase(p);
  173.     p = p_next;
  174.         }
  175.         else
  176.             ++p;
  177.     }
  178. }
  179. /// Get option fron registry from  
  180. ///     [<section>.debug.<ConfigName>] section for debug configuratios
  181. ///  or [<section>.release.<ConfigName>] for release configurations
  182. ///
  183. /// if no such option then try      
  184. ///     [<section>.debug]
  185. /// or  [<section>.release]
  186. ///
  187. /// if no such option then finally try
  188. ///     [<section>]
  189. ///
  190. string GetOpt(const CNcbiRegistry& registry, 
  191.               const string&        section, 
  192.               const string&        opt, 
  193.               const SConfigInfo&   config);
  194. /// return <config>|Win32 as needed by MSVC compiler
  195. string ConfigName(const string& config);
  196. //-----------------------------------------------------------------------------
  197. // Base interface class for all insertors
  198. class IFilesToProjectInserter
  199. {
  200. public:
  201.     virtual ~IFilesToProjectInserter(void)
  202.     {
  203.     }
  204.     virtual void AddSourceFile (const string& rel_file_path) = 0;
  205.     virtual void AddHeaderFile (const string& rel_file_path) = 0;
  206.     virtual void AddInlineFile (const string& rel_file_path) = 0;
  207.     virtual void Finalize      (void)                        = 0;
  208. };
  209. // Insert .cpp and .c files to filter and set PCH usage if necessary
  210. class CSrcToFilterInserterWithPch
  211. {
  212. public:
  213.     CSrcToFilterInserterWithPch(const string&            project_id,
  214.                                 const list<SConfigInfo>& configs,
  215.                                 const string&            project_dir);
  216.     ~CSrcToFilterInserterWithPch(void);
  217.     void operator() (CRef<CFilter>& filter, 
  218.                      const string&  rel_source_file);
  219. private:
  220.     string            m_ProjectId;
  221.     list<SConfigInfo> m_Configs;
  222.     string            m_ProjectDir;
  223.     typedef set<string> TPchHeaders;
  224.     TPchHeaders m_PchHeaders;
  225.     enum EUsePch {
  226.         eNotUse = 0,
  227.         eCreate = 1,
  228.         eUse    = 3
  229.     };
  230.     typedef pair<EUsePch, string> TPch;
  231.     TPch DefinePchUsage(const string&     project_dir,
  232.                         const string&     rel_source_file);
  233.     // Prohibited to:
  234.     CSrcToFilterInserterWithPch(void);
  235.     CSrcToFilterInserterWithPch(const CSrcToFilterInserterWithPch&);
  236.     CSrcToFilterInserterWithPch& operator=(const CSrcToFilterInserterWithPch&);
  237. };
  238. class CBasicProjectsFilesInserter : public IFilesToProjectInserter
  239. {
  240. public:
  241.     CBasicProjectsFilesInserter(CVisualStudioProject*    vcproj,
  242.                                 const string&            project_id,
  243.                                 const list<SConfigInfo>& configs,
  244.                                 const string&            project_dir);
  245.     virtual ~CBasicProjectsFilesInserter(void);
  246.     // IFilesToProjectInserter implementation
  247.     virtual void AddSourceFile (const string& rel_file_path);
  248.     virtual void AddHeaderFile (const string& rel_file_path);
  249.     virtual void AddInlineFile (const string& rel_file_path);
  250.     virtual void Finalize      (void);
  251.     struct SFiltersItem
  252.     {
  253.         SFiltersItem(void);
  254.         SFiltersItem(const string& project_dir);
  255.         CRef<CFilter> m_SourceFiles;
  256.         CRef<CFilter> m_HeaderFiles;
  257.         CRef<CFilter> m_HeaderFilesPrivate;
  258.         CRef<CFilter> m_HeaderFilesImpl;
  259.         CRef<CFilter> m_InlineFiles;
  260.         
  261.         string        m_ProjectDir;
  262.         void Initilize(void);
  263.         void AddSourceFile (CSrcToFilterInserterWithPch& inserter_w_pch,
  264.                             const string&                rel_file_path);
  265.         void AddHeaderFile (const string& rel_file_path);
  266.         void AddInlineFile (const string& rel_file_path);
  267.     };
  268. private:
  269.     CVisualStudioProject*       m_Vcproj;
  270.     
  271.     CSrcToFilterInserterWithPch m_SrcInserter;
  272.     SFiltersItem                m_Filters;
  273.     
  274.     // Prohibited to:
  275.     CBasicProjectsFilesInserter(void);
  276.     CBasicProjectsFilesInserter(const CBasicProjectsFilesInserter&);
  277.     CBasicProjectsFilesInserter& operator=(const CBasicProjectsFilesInserter&);
  278. };
  279. class CDllProjectFilesInserter : public IFilesToProjectInserter
  280. {
  281. public:
  282.     CDllProjectFilesInserter(CVisualStudioProject*    vcproj,
  283.                              const CProjKey           dll_project_key,
  284.                              const list<SConfigInfo>& configs,
  285.                              const string&            project_dir);
  286.     virtual ~CDllProjectFilesInserter(void);
  287.     // IFilesToProjectInserter implementation
  288.     virtual void AddSourceFile (const string& rel_file_path);
  289.     virtual void AddHeaderFile (const string& rel_file_path);
  290.     virtual void AddInlineFile (const string& rel_file_path);
  291.     virtual void Finalize      (void);
  292. private:
  293.     CVisualStudioProject*       m_Vcproj;
  294.     CProjKey                    m_DllProjectKey;
  295.     CSrcToFilterInserterWithPch m_SrcInserter;
  296.     string                      m_ProjectDir;
  297.     typedef CBasicProjectsFilesInserter::SFiltersItem TFiltersItem;
  298.     TFiltersItem  m_PrivateFilters;
  299.     CRef<CFilter> m_HostedLibrariesRootFilter;
  300.     typedef map<CProjKey, TFiltersItem> THostedLibs;
  301.     THostedLibs m_HostedLibs;
  302.     // Prohibited to:
  303.     CDllProjectFilesInserter(void);
  304.     CDllProjectFilesInserter(const CDllProjectFilesInserter&);
  305.     CDllProjectFilesInserter& operator=(const CDllProjectFilesInserter&);
  306. };
  307. /// Common function shared by 
  308. /// CMsvcMasterProjectGenerator and CMsvcProjectGenerator
  309. void AddCustomBuildFileToFilter(CRef<CFilter>&          filter, 
  310.                                 const list<SConfigInfo> configs,
  311.                                 const string&           project_dir,
  312.                                 const SCustomBuildInfo& build_info);
  313. /// Checks if 2 dirs has the same root
  314. bool SameRootDirs(const string& dir1, const string& dir2);
  315. /// Fill-In MSVC 7.10 Utility project
  316. void CreateUtilityProject(const string&            name, 
  317.                           const list<SConfigInfo>& configs, 
  318.                           CVisualStudioProject*    project);
  319. /// Project naming schema
  320. string CreateProjectName(const CProjKey& project_id);
  321. /// Utility class for distinguish between static and dll builds
  322. class CBuildType
  323. {
  324. public:
  325.     CBuildType(bool dll_flag);
  326.     enum EBuildType {
  327.         eStatic,
  328.         eDll
  329.     };
  330.     EBuildType GetType   (void) const;
  331.     string     GetTypeStr(void) const;
  332. private:
  333.     EBuildType m_Type;
  334.     
  335.     //prohibited to:
  336.     CBuildType(void);
  337.     CBuildType(const CBuildType&);
  338.     CBuildType& operator= (const CBuildType&);
  339. };
  340. /// Distribution if source files by lib projects
  341. /// Uses in dll project to separate source files to groups by libs
  342. class CDllSrcFilesDistr
  343. {
  344. public:
  345.     CDllSrcFilesDistr(void);
  346.     // Register .cpp .c files during DLL creation
  347.     void RegisterSource  (const string&   src_file_path, 
  348.                           const CProjKey& dll_project_id,
  349.                           const CProjKey& lib_project_id);
  350.     // Register .hpp .h files during DLL creation
  351.     void RegisterHeader  (const string&   hrd_file_path, 
  352.                           const CProjKey& dll_project_id,
  353.                           const CProjKey& lib_project_id);
  354.     // Register .inl    files during DLL creation
  355.     void RegisterInline  (const string&   inl_file_path, 
  356.                           const CProjKey& dll_project_id,
  357.                           const CProjKey& lib_project_id);
  358.     
  359.     // Retrive original lib_id for .cpp .c file
  360.     CProjKey GetSourceLib(const string&   src_file_path, 
  361.                           const CProjKey& dll_project_id) const;
  362.     // Retrive original lib_id for .cpp .c file
  363.     CProjKey GetHeaderLib(const string&   hdr_file_path, 
  364.                           const CProjKey& dll_project_id) const;
  365.     // Retrive original lib_id for .inl file
  366.     CProjKey GetInlineLib(const string&   inl_file_path, 
  367.                           const CProjKey& dll_project_id) const;
  368. private:
  369.     typedef pair<string,    CProjKey> TDllSrcKey;
  370.     typedef map<TDllSrcKey, CProjKey> TDistrMap;
  371.     TDistrMap m_SourcesMap;
  372.     TDistrMap m_HeadersMap;
  373.     TDistrMap m_InlinesMap;
  374.     //prohibited to
  375.     CDllSrcFilesDistr(const CDllSrcFilesDistr&);
  376.     CDllSrcFilesDistr& operator= (const CDllSrcFilesDistr&);
  377. };
  378. END_NCBI_SCOPE
  379. /*
  380.  * ===========================================================================
  381.  * $Log: msvc_prj_utils.hpp,v $
  382.  * Revision 1000.3  2004/06/16 17:05:02  gouriano
  383.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.24
  384.  *
  385.  * Revision 1.24  2004/06/14 19:18:43  gorelenk
  386.  * Changed definition of enum in CBuildType .
  387.  *
  388.  * Revision 1.23  2004/06/10 15:12:55  gorelenk
  389.  * Added newline at the file end to avoid GCC warning.
  390.  *
  391.  * Revision 1.22  2004/06/08 16:28:27  gorelenk
  392.  * Added members m_HeaderFilesPrivate and m_HeaderFilesImpl
  393.  * to struct SFiltersItem.
  394.  *
  395.  * Revision 1.21  2004/06/07 13:51:38  gorelenk
  396.  * Added m_DllInfo to class CMsvc7RegSettings.
  397.  *
  398.  * Revision 1.20  2004/05/26 17:56:59  gorelenk
  399.  * Refactored source files inserter:
  400.  * old inserter moved to class CSrcToFilterInserterWithPch,
  401.  * declared interface IFilesToProjectInserter and 2 implementations:
  402.  * CBasicProjectsFilesInserter for app/lib projects and
  403.  * CDllProjectFilesInserter for dlls.
  404.  *
  405.  * Revision 1.19  2004/05/17 16:13:44  gorelenk
  406.  * Added declaration of class CDllSrcFilesDistr .
  407.  *
  408.  * Revision 1.18  2004/05/10 14:25:47  gorelenk
  409.  * + CSourceFileToProjectInserter .
  410.  *
  411.  * Revision 1.17  2004/04/13 17:06:02  gorelenk
  412.  * Added member m_CompilersSubdir to class CMsvc7RegSettings.
  413.  *
  414.  * Revision 1.16  2004/03/18 17:41:03  gorelenk
  415.  * Aligned classes member-functions parameters inside declarations.
  416.  *
  417.  * Revision 1.15  2004/03/10 16:42:12  gorelenk
  418.  * Changed declaration of class CMsvc7RegSettings.
  419.  *
  420.  * Revision 1.14  2004/03/02 23:28:17  gorelenk
  421.  * Added declaration of class CBuildType.
  422.  *
  423.  * Revision 1.13  2004/02/20 22:54:45  gorelenk
  424.  * Added analysis of ASN projects depends.
  425.  *
  426.  * Revision 1.12  2004/02/12 23:13:49  gorelenk
  427.  * Declared function for MSVC utility project creation.
  428.  *
  429.  * Revision 1.11  2004/02/12 16:22:40  gorelenk
  430.  * Changed generation of command line for custom build info.
  431.  *
  432.  * Revision 1.10  2004/02/10 18:08:16  gorelenk
  433.  * Added declaration of functions SaveIfNewer and PromoteIfDifferent
  434.  * - support for file overwriting only if it was changed.
  435.  *
  436.  * Revision 1.9  2004/02/06 23:15:40  gorelenk
  437.  * Implemented support of ASN projects, semi-auto configure,
  438.  * CPPFLAGS support. Second working version.
  439.  *
  440.  * Revision 1.8  2004/02/05 16:26:43  gorelenk
  441.  * Function GetComponents moved to class CMsvcSite member.
  442.  *
  443.  * Revision 1.7  2004/02/04 23:17:58  gorelenk
  444.  * Added declarations of functions GetComponents and SameRootDirs.
  445.  *
  446.  * Revision 1.6  2004/02/03 17:09:46  gorelenk
  447.  * Changed declaration of class CMsvc7RegSettings.
  448.  * Added declaration of function GetComponents.
  449.  *
  450.  * Revision 1.5  2004/01/28 17:55:05  gorelenk
  451.  * += For msvc makefile support of :
  452.  *                 Requires tag, ExcludeProject tag,
  453.  *                 AddToProject section (SourceFiles and IncludeDirs),
  454.  *                 CustomBuild section.
  455.  * += For support of user local site.
  456.  *
  457.  * Revision 1.4  2004/01/26 19:25:41  gorelenk
  458.  * += MSVC meta makefile support
  459.  * += MSVC project makefile support
  460.  *
  461.  * Revision 1.3  2004/01/22 17:57:08  gorelenk
  462.  * first version
  463.  *
  464.  * ===========================================================================
  465.  */
  466. #endif //PROJECT_TREE_BUILDER__MSVC_PRJ_UTILS__HPP