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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_project_context.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/16 17:05:04  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef PROJECT_TREE_BUILDER__PROJECT_CONTEXT__HPP
  10. #define PROJECT_TREE_BUILDER__PROJECT_CONTEXT__HPP
  11. /* $Id: msvc_project_context.hpp,v 1000.1 2004/06/16 17:05:04 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<list>
  40. #include<string>
  41. #include<map>
  42. #include <app/project_tree_builder/proj_item.hpp>
  43. #include <app/project_tree_builder/msvc_prj_utils.hpp>
  44. #include <app/project_tree_builder/msvc_makefile.hpp>
  45. #include <app/project_tree_builder/proj_builder_app.hpp>
  46. #include <corelib/ncbienv.hpp>
  47. BEGIN_NCBI_SCOPE
  48. /////////////////////////////////////////////////////////////////////////////
  49. ///
  50. /// CMsvcPrjProjectContext --
  51. ///
  52. /// Abstraction of MSVC project-specific context.
  53. ///
  54. /// Project context provides project-specific information for 
  55. /// project generation.
  56. class CMsvcPrjProjectContext
  57. {
  58. public:
  59.     //no value type semantics
  60.     CMsvcPrjProjectContext(const CProjItem& project);
  61.     //Compiler::General
  62.     string AdditionalIncludeDirectories(const SConfigInfo& cfg_info) const;
  63.     const string& ProjectName(void) const
  64.     {
  65.         return m_ProjectName;
  66.     }
  67.     const string& ProjectId(void) const
  68.     {
  69.         return m_ProjectId;
  70.     }
  71.     string AdditionalLinkerOptions(const SConfigInfo& cfg_info) const;
  72. #if 0
  73.     string AdditionalLibrarianOptions(const SConfigInfo& cfg_info) const;
  74. #endif
  75.     
  76.     string AdditionalLibraryDirectories(const SConfigInfo& cfg_info) const;
  77.  
  78.     const string& ProjectDir(void) const
  79.     {
  80.         return m_ProjectDir;
  81.     }
  82.     CProjItem::TProjType ProjectType(void) const
  83.     {
  84.         return m_ProjType;
  85.     }
  86.     const list<string>& SourcesDirsAbs(void) const
  87.     {
  88.         return m_SourcesDirsAbs;
  89.     }
  90.     const list<string>& IncludeDirsAbs(void) const
  91.     {
  92.         return m_IncludeDirsAbs;
  93.     }
  94.     const CMsvcCombinedProjectMakefile& GetMsvcProjectMakefile(void) const;
  95.     
  96.     static bool IsRequiresOk(const CProjItem& prj);
  97.     
  98.     bool IsConfigEnabled(const SConfigInfo& config) const;
  99.     const list<SCustomBuildInfo>& GetCustomBuildInfo(void) const
  100.     {
  101.         return m_CustomBuildInfo;
  102.     }
  103.     const list<string> Defines(const SConfigInfo& cfg_info) const;
  104.     const list<string>& PreBuilds(void) const
  105.     {
  106.         return m_PreBuilds;
  107.     }
  108. private:
  109.     // Prohibited to:
  110.     CMsvcPrjProjectContext(void);
  111.     CMsvcPrjProjectContext(const CMsvcPrjProjectContext&);
  112.     CMsvcPrjProjectContext& operator= (const CMsvcPrjProjectContext&);
  113.     string   m_ProjectName;
  114.     string   m_ProjectId;
  115.     string m_AdditionalLibrarianOptions;
  116.     string m_ProjectDir;
  117.     CProjItem::TProjType m_ProjType;
  118.     list<string> m_SourcesDirsAbs;
  119.     list<string> m_IncludeDirsAbs;
  120.     list<string> m_ProjectIncludeDirs;
  121.     list<string> m_ProjectLibs;
  122.     void CreateLibsList(list<string>* libs_list) const;
  123.     auto_ptr<CMsvcProjectMakefile>         m_MsvcProjectMakefile;
  124.     auto_ptr<CMsvcCombinedProjectMakefile> m_MsvcCombinedProjectMakefile;
  125.     string       m_SourcesBaseDir;
  126.     list<string> m_Requires;
  127.     list<SCustomBuildInfo> m_CustomBuildInfo;
  128.     list<string> m_Defines;
  129.     list<string> m_PreBuilds;
  130.     list<string> m_NcbiCLibs;
  131. };
  132. /////////////////////////////////////////////////////////////////////////////
  133. ///
  134. /// CMsvcPrjGeneralContext --
  135. ///
  136. /// Abstraction of MSVC project "general" context.
  137. ///
  138. /// Project context provides specific information for particular type of 
  139. /// project (Exe, Lib, Dll). This information not project-specific, but 
  140. /// more project type specific.
  141. class CMsvcPrjGeneralContext
  142. {
  143. public:
  144.     //no value type semantics
  145.     CMsvcPrjGeneralContext(const SConfigInfo& config, 
  146.                            const CMsvcPrjProjectContext& prj_context);
  147.     typedef enum { 
  148.         eExe, 
  149.         eLib, 
  150.         eDll, 
  151.         eOther } TTargetType;
  152.     TTargetType m_Type;
  153.     SConfigInfo m_Config;
  154.     //Configuration::General
  155.     string OutputDirectory(void) const
  156.     {
  157.         return m_OutputDirectory;
  158.     }
  159.     string ConfigurationName(void) const
  160.     {
  161.         return m_Config.m_Name;
  162.     }
  163.     const CMsvcMetaMakefile& GetMsvcMetaMakefile(void) const
  164.     {
  165.         return m_MsvcMetaMakefile;
  166.     }
  167. private:
  168.     /// Prohibited to:
  169.     CMsvcPrjGeneralContext(void);
  170.     CMsvcPrjGeneralContext(const CMsvcPrjGeneralContext&);
  171.     CMsvcPrjGeneralContext& operator= (const CMsvcPrjGeneralContext&);
  172.     string m_OutputDirectory;
  173.     string m_ConfigurationName;
  174.     const CMsvcMetaMakefile& m_MsvcMetaMakefile;
  175. };
  176. /////////////////////////////////////////////////////////////////////////////
  177. ///
  178. /// ITool --
  179. ///
  180. /// Base class for all MSVC tools.
  181. ///
  182. /// Polymorphic hierarchy base class.
  183. struct ITool
  184. {
  185.     virtual string Name(void) const = 0;
  186.     virtual ~ITool(void)
  187.     {
  188.     }
  189. };
  190. /////////////////////////////////////////////////////////////////////////////
  191. ///
  192. /// IConfiguration --
  193. ///
  194. /// "Configuration" interface.
  195. ///
  196. /// Abstract class.
  197. struct IConfiguration : public ITool
  198. {
  199.     //Name : Configuration+'|'+"Win32"
  200.     virtual string OutputDirectory(void) const = 0;
  201.     virtual string IntermediateDirectory(void) const = 0;
  202.     virtual string ConfigurationType(void) const = 0;
  203.     virtual string CharacterSet(void) const = 0;
  204. };
  205. /////////////////////////////////////////////////////////////////////////////
  206. ///
  207. /// ICompilerTool --
  208. ///
  209. /// "CompilerTool" interface.
  210. ///
  211. /// Abstract class.
  212. struct ICompilerTool : public ITool
  213. {
  214.     //string Name : "VCCLCompilerTool"
  215.     virtual string Optimization(void) const = 0;
  216.     virtual string AdditionalIncludeDirectories(void) const = 0;
  217.     // Preprocessor definition:
  218.     // LIB (Debug) WIN32;_DEBUG;_LIB
  219.     // LIB (Release) WIN32;NDEBUG;_LIB
  220.     // APP (Debug) WIN32;_DEBUG;_CONSOLE
  221.     // APP (Release) WIN32;NDEBUG;_CONSOLE
  222.     // DLL (Debug) WIN32;_DEBUG;_WINDOWS;_USRDLL;XNCBI_EXPORTS 
  223.     //                                    (project_name(uppercase)+"_EXPORTS")
  224.     // DLL (Relese) WIN32;NDEBUG;_WINDOWS;_USRDLL;XNCBI_EXPORTS
  225.     //                                    (project_name(uppercase)+"_EXPORTS")
  226.     // All configurations:
  227.     virtual string PreprocessorDefinitions(void)  const = 0;
  228.     virtual string MinimalRebuild(void)  const = 0;
  229.     virtual string BasicRuntimeChecks(void)  const = 0;
  230.     virtual string RuntimeLibrary(void)  const = 0;
  231.     virtual string RuntimeTypeInfo(void)                 const = 0;
  232.     virtual string UsePrecompiledHeader(void)  const = 0;
  233.     virtual string WarningLevel(void)  const = 0;
  234.     virtual string Detect64BitPortabilityProblems(void)  const = 0;
  235.     virtual string DebugInformationFormat(void)  const = 0;
  236.     virtual string CompileAs(void)                       const = 0;
  237.     //For release - EXE DLL LIB
  238.     virtual string InlineFunctionExpansion(void)  const = 0;
  239.     virtual string OmitFramePointers(void)  const = 0;
  240.     virtual string StringPooling(void)  const = 0;
  241.     virtual string EnableFunctionLevelLinking(void)  const = 0;
  242.     //Latest additions
  243.     virtual string OptimizeForProcessor(void)      const = 0;
  244.     virtual string StructMemberAlignment(void)      const = 0; 
  245.     virtual string CallingConvention(void)          const = 0;
  246.     virtual string IgnoreStandardIncludePath(void)      const = 0;
  247.     virtual string ExceptionHandling(void)          const = 0;
  248.     virtual string BufferSecurityCheck(void)      const = 0;
  249.     virtual string DisableSpecificWarnings(void)  const = 0;
  250.     virtual string UndefinePreprocessorDefinitions(void) const = 0;
  251.     virtual string AdditionalOptions(void)          const = 0;
  252.     virtual string GlobalOptimizations(void)      const = 0;
  253.     virtual string FavorSizeOrSpeed(void)          const = 0;
  254.     virtual string BrowseInformation(void)          const = 0;
  255. };
  256. /////////////////////////////////////////////////////////////////////////////
  257. ///
  258. /// ILinkerTool --
  259. ///
  260. /// "LinkerTool" interface.
  261. ///
  262. /// Abstract class.
  263. struct ILinkerTool : public ITool
  264. {
  265.     //string Name : "VCLinkerTool"
  266.     virtual string AdditionalOptions(void)   const = 0;
  267.     virtual string OutputFile(void)   const = 0;
  268.     virtual string LinkIncremental(void)   const = 0;
  269.     virtual string GenerateDebugInformation(void)   const = 0;
  270.     virtual string ProgramDatabaseFile(void)   const = 0;
  271.     virtual string SubSystem(void)   const = 0;
  272.     virtual string ImportLibrary(void)   const = 0;
  273.     virtual string TargetMachine(void)   const = 0;
  274.     //release - EXE DLL +=
  275.     virtual string OptimizeReferences(void)   const = 0;
  276.     virtual string EnableCOMDATFolding(void)   const = 0;
  277.     //Latest additions
  278.     virtual string IgnoreAllDefaultLibraries(void)   const = 0;
  279.     virtual string IgnoreDefaultLibraryNames(void)   const = 0;
  280.     virtual string AdditionalLibraryDirectories(void) const = 0;
  281. };
  282. /////////////////////////////////////////////////////////////////////////////
  283. ///
  284. /// ILibrarianTool --
  285. ///
  286. /// "LibrarianTool" interface.
  287. ///
  288. /// Abstract class.
  289. struct ILibrarianTool : public ITool
  290. {
  291.     //string Name : "VCLibrarianTool"
  292.     virtual string AdditionalOptions(void)   const = 0;
  293.     virtual string OutputFile(void)   const = 0;
  294.     virtual string IgnoreAllDefaultLibraries(void)   const = 0;
  295.     virtual string IgnoreDefaultLibraryNames(void)   const = 0;
  296.     
  297.     //Latest additions
  298.     virtual string AdditionalLibraryDirectories(void) const = 0;
  299. };
  300. /// Dummies - Name - only tools. Must present in msvc proj:
  301. struct ICustomBuildTool : public ITool
  302. {
  303.     //Name : "VCCustomBuildTool"
  304. };
  305. struct IMIDLTool : public ITool
  306. {
  307.     //Name : "VCMIDLTool"
  308. };
  309. struct IPostBuildEventTool : public ITool
  310. {
  311.     //Name : "VCPostBuildEventTool"
  312. };
  313. /// Not a dummy for lib projects
  314. struct IPreBuildEventTool : public ITool
  315. {
  316.     //Name : "VCPreBuildEventTool"
  317.     virtual string CommandLine(void) const = 0;
  318. };
  319. struct IPreLinkEventTool : public ITool
  320. {
  321.     //Name : "VCPreLinkEventTool"
  322. };
  323. /////////////////////////////////////////////////////////////////////////////
  324. ///
  325. /// IResourceCompilerTool --
  326. ///
  327. /// "ResourceCompilerTool" interface.
  328. ///
  329. /// Abstract class.
  330. struct IResourceCompilerTool : public ITool
  331. {
  332.     //Name : "VCResourceCompilerTool"
  333.     //must be implemented for Dll and Windows apps
  334.     virtual string AdditionalIncludeDirectories(void)  const = 0;
  335.     virtual string AdditionalOptions(void)            const = 0;
  336.     virtual string Culture(void)                       const = 0;
  337.     virtual string PreprocessorDefinitions(void)       const = 0;
  338. };
  339. /// Dummies - Name - only tools. Must present in msvc proj:
  340. struct IWebServiceProxyGeneratorTool : public ITool
  341. {
  342.     //Name : "VCWebServiceProxyGeneratorTool"
  343. };
  344. struct IXMLDataGeneratorTool : public ITool
  345. {
  346.     //Name : "VCXMLDataGeneratorTool"
  347. };
  348. struct IManagedWrapperGeneratorTool : public ITool
  349. {
  350.     //Name : "VCManagedWrapperGeneratorTool"
  351. };
  352. struct IAuxiliaryManagedWrapperGeneratorTool : public ITool
  353. {
  354.     //Name : "VCAuxiliaryManagedWrapperGeneratorTool"
  355. };
  356. /////////////////////////////////////////////////////////////////////////////
  357. ///
  358. /// CMsvcTools --
  359. ///
  360. /// Abstraction of MSVC 7.10 C++ project build tools.
  361. ///
  362. /// Provides all tools interfaces. Tools implementation will depends upon
  363. /// project general and project specific contexts.
  364. class CMsvcTools
  365. {
  366. public:
  367.     CMsvcTools(const CMsvcPrjGeneralContext& general_context,
  368.                const CMsvcPrjProjectContext& project_context);
  369.     ~CMsvcTools();
  370.     IConfiguration      * Configuration (void) const;
  371.     ICompilerTool       * Compiler      (void) const;
  372.     ILinkerTool         * Linker        (void) const;
  373.     ILibrarianTool      * Librarian     (void) const;
  374.     ICustomBuildTool * CustomBuid    (void) const;
  375.     IMIDLTool * MIDL     (void) const;
  376.     IPostBuildEventTool * PostBuildEvent(void) const;
  377.     IPreBuildEventTool * PreBuildEvent (void) const;
  378.     IPreLinkEventTool * PreLinkEvent  (void) const;
  379.     
  380.     IResourceCompilerTool *
  381.                           ResourceCompiler          (void) const;
  382.     IWebServiceProxyGeneratorTool *
  383.                           WebServiceProxyGenerator (void) const;
  384.     IXMLDataGeneratorTool *
  385.                           XMLDataGenerator          (void) const;
  386.     IManagedWrapperGeneratorTool *
  387.                           ManagedWrapperGenerator (void) const;
  388.     IAuxiliaryManagedWrapperGeneratorTool *
  389.                           AuxiliaryManagedWrapperGenerator(void) const;
  390. private:
  391.     auto_ptr<IConfiguration>        m_Configuration;
  392.     auto_ptr<ICompilerTool>         m_Compiler;
  393.     auto_ptr<ILinkerTool>           m_Linker;
  394.     auto_ptr<ILibrarianTool>        m_Librarian;
  395.     
  396.     auto_ptr<ICustomBuildTool>      m_CustomBuid;
  397.     auto_ptr<IMIDLTool>             m_MIDL;
  398.     auto_ptr<IPostBuildEventTool> m_PostBuildEvent;
  399.     auto_ptr<IPreBuildEventTool> m_PreBuildEvent;
  400.     auto_ptr<IPreLinkEventTool> m_PreLinkEvent;
  401.     
  402.     auto_ptr<IResourceCompilerTool> m_ResourceCompiler;
  403.     auto_ptr<IWebServiceProxyGeneratorTool>
  404.                                     m_WebServiceProxyGenerator;
  405.     
  406.     auto_ptr<IXMLDataGeneratorTool> m_XMLDataGenerator;
  407.     
  408.     auto_ptr<IManagedWrapperGeneratorTool>
  409.                                     m_ManagedWrapperGenerator;
  410.     
  411.     auto_ptr<IAuxiliaryManagedWrapperGeneratorTool> 
  412.                                     m_AuxiliaryManagedWrapperGenerator;
  413.     //this is not a value-type class
  414.     CMsvcTools();
  415.     CMsvcTools(const CMsvcTools&);
  416.     CMsvcTools& operator= (const CMsvcTools&);
  417. };
  418. END_NCBI_SCOPE
  419. /*
  420.  * ===========================================================================
  421.  * $Log: msvc_project_context.hpp,v $
  422.  * Revision 1000.1  2004/06/16 17:05:04  gouriano
  423.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  424.  *
  425.  * Revision 1.17  2004/06/10 15:12:55  gorelenk
  426.  * Added newline at the file end to avoid GCC warning.
  427.  *
  428.  * Revision 1.16  2004/06/07 13:53:07  gorelenk
  429.  * Changed signature of member-function GetMsvcProjectMakefile
  430.  * of class CMsvcPrjProjectContext.
  431.  *
  432.  * Revision 1.15  2004/03/22 14:44:35  gorelenk
  433.  * Changed declaration of member-function Defines
  434.  * of class CMsvcPrjProjectContext.
  435.  *
  436.  * Revision 1.14  2004/03/10 16:43:41  gorelenk
  437.  * Changed declaration of class CMsvcPrjProjectContext.
  438.  *
  439.  * Revision 1.13  2004/03/08 23:29:02  gorelenk
  440.  * Added member-function ProjectId to class CMsvcPrjProjectContext.
  441.  *
  442.  * Revision 1.12  2004/03/05 18:10:17  gorelenk
  443.  * Removed member-function IncludeDirsRoot()
  444.  * from class CMsvcPrjProjectContext.
  445.  *
  446.  * Revision 1.11  2004/02/24 20:50:03  gorelenk
  447.  * Added declaration of member-function IsConfigEnabled
  448.  * to class CMsvcPrjProjectContext.
  449.  *
  450.  * Revision 1.10  2004/02/24 17:17:45  gorelenk
  451.  * Added member m_NcbiCLibs to class CMsvcPrjProjectContext.
  452.  *
  453.  * Revision 1.9  2004/02/23 20:43:42  gorelenk
  454.  * Added support of MSVC ResourceCompiler tool.
  455.  *
  456.  * Revision 1.8  2004/02/20 22:54:45  gorelenk
  457.  * Added analysis of ASN projects depends.
  458.  *
  459.  * Revision 1.7  2004/02/06 23:15:40  gorelenk
  460.  * Implemented support of ASN projects, semi-auto configure,
  461.  * CPPFLAGS support. Second working version.
  462.  *
  463.  * Revision 1.6  2004/02/03 17:08:07  gorelenk
  464.  * Changed declaration of class CMsvcPrjProjectContext.
  465.  *
  466.  * Revision 1.5  2004/01/28 17:55:06  gorelenk
  467.  * += For msvc makefile support of :
  468.  *                 Requires tag, ExcludeProject tag,
  469.  *                 AddToProject section (SourceFiles and IncludeDirs),
  470.  *                 CustomBuild section.
  471.  * += For support of user local site.
  472.  *
  473.  * Revision 1.4  2004/01/26 19:25:41  gorelenk
  474.  * += MSVC meta makefile support
  475.  * += MSVC project makefile support
  476.  *
  477.  * Revision 1.3  2004/01/22 17:57:08  gorelenk
  478.  * first version
  479.  *
  480.  * ===========================================================================
  481.  */
  482. #endif //PROJECT_TREE_BUILDER__PROJECT_CONTEXT__HPP