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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_makefile.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/16 17:02:28  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: msvc_makefile.cpp,v 1000.2 2004/06/16 17:02:28 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/stl_msvc_usage.hpp>
  39. #include <app/project_tree_builder/msvc_makefile.hpp>
  40. #include <app/project_tree_builder/proj_builder_app.hpp>
  41. #include <app/project_tree_builder/msvc_prj_defines.hpp>
  42. #include <algorithm>
  43. #include <corelib/ncbistr.hpp>
  44. BEGIN_NCBI_SCOPE
  45. //-----------------------------------------------------------------------------
  46. CMsvcMetaMakefile::CMsvcMetaMakefile(const string& file_path)
  47. {
  48.     CNcbiIfstream ifs(file_path.c_str(), IOS_BASE::in | IOS_BASE::binary);
  49.     if (ifs) {
  50.         //read registry
  51.         m_MakeFile.Read(ifs);
  52.         //and remember dir from where it was loaded
  53.         CDirEntry::SplitPath(file_path, &m_MakeFileBaseDir);
  54.     }
  55. }
  56. bool CMsvcMetaMakefile::IsEmpty(void) const
  57. {
  58.     return m_MakeFile.Empty();
  59. }
  60. string CMsvcMetaMakefile::GetCompilerOpt(const string& opt, 
  61.                                          const SConfigInfo& config) const
  62. {
  63.     return GetOpt(m_MakeFile, "Compiler", opt, config);
  64. }
  65. string CMsvcMetaMakefile::GetLinkerOpt(const string& opt, 
  66.                                        const SConfigInfo& config) const
  67. {
  68.     return GetOpt(m_MakeFile, "Linker", opt, config);
  69. }
  70. string CMsvcMetaMakefile::GetLibrarianOpt(const string& opt, 
  71.                                           const SConfigInfo& config) const
  72. {
  73.     return GetOpt(m_MakeFile, "Librarian", opt, config);
  74. }
  75. string CMsvcMetaMakefile::GetResourceCompilerOpt
  76.                           (const string& opt, const SConfigInfo& config) const
  77. {
  78.     return GetOpt(m_MakeFile, "ResourceCompiler", opt, config);
  79. }
  80. bool CMsvcMetaMakefile::IsPchEnabled(void) const
  81. {
  82.     return GetPchInfo().m_UsePch;
  83. }
  84. string CMsvcMetaMakefile::GetUsePchThroughHeader 
  85.                           (const string& project_id,
  86.                            const string& source_file_full_path,
  87.                            const string& tree_src_dir) const
  88. {
  89.     const SPchInfo& pch_info = GetPchInfo();
  90.     string source_file_dir;
  91.     CDirEntry::SplitPath(source_file_full_path, &source_file_dir);
  92.     source_file_dir = CDirEntry::AddTrailingPathSeparator(source_file_dir);
  93.     size_t max_match = 0;
  94.     string pch_file;
  95.     ITERATE(SPchInfo::TSubdirPchfile, p, pch_info.m_PchUsageMap) {
  96.         const string& branch_subdir = p->first;
  97.         string abs_branch_subdir = 
  98.             CDirEntry::ConcatPath(tree_src_dir, branch_subdir);
  99.         abs_branch_subdir = 
  100.             CDirEntry::AddTrailingPathSeparator(abs_branch_subdir);
  101.         if ( IsSubdir(abs_branch_subdir, source_file_dir) ) {
  102.             if ( branch_subdir.length() > max_match ) {
  103.                 max_match = branch_subdir.length();
  104.                 pch_file  = p->second;
  105.             }
  106.         }
  107.     }
  108.     if ( pch_file.empty() )
  109.         return "";
  110.     
  111.     if (find(pch_info.m_DontUsePchList.begin(),
  112.              pch_info.m_DontUsePchList.end(),
  113.              project_id) == pch_info.m_DontUsePchList.end())
  114.         return pch_file;
  115.     return "";
  116. }
  117. const CMsvcMetaMakefile::SPchInfo& CMsvcMetaMakefile::GetPchInfo(void) const
  118. {
  119.     if ( m_PchInfo.get() )
  120.         return *m_PchInfo;
  121.     (const_cast<CMsvcMetaMakefile&>(*this)).m_PchInfo.reset(new SPchInfo);
  122.     string use_pch_str = m_MakeFile.GetString("UsePch", "UsePch", "");
  123.     m_PchInfo->m_UsePch = (NStr::CompareNocase(use_pch_str, "TRUE") == 0);
  124.     list<string> projects_with_pch_dirs;
  125.     m_MakeFile.EnumerateEntries("UsePch", &projects_with_pch_dirs);
  126.     ITERATE(list<string>, p, projects_with_pch_dirs) {
  127.         const string& key = *p;
  128.         if (key == "DoNotUsePch")
  129.             continue;
  130.         string val = m_MakeFile.GetString("UsePch", key, "");
  131.         if ( !val.empty() )
  132.             m_PchInfo->m_PchUsageMap[key] = val;
  133.     }
  134.     string do_not_use_pch_str = 
  135.         m_MakeFile.GetString("UsePch", "DoNotUsePch", "");
  136.     NStr::Split(do_not_use_pch_str, LIST_SEPARATOR, m_PchInfo->m_DontUsePchList);
  137.     m_PchInfo->m_PchUsageDefine = 
  138.         m_MakeFile.GetString("UsePch", "PchUsageDefine", "");
  139.     return *m_PchInfo;
  140. }
  141. string CMsvcMetaMakefile::GetPchUsageDefine(void) const
  142. {
  143.     return GetPchInfo().m_PchUsageDefine;
  144. }
  145. //-----------------------------------------------------------------------------
  146. string CreateMsvcProjectMakefileName(const string&        project_name,
  147.                                      CProjItem::TProjType type)
  148. {
  149.     string name("Makefile.");
  150.     
  151.     name += project_name + '.';
  152.     
  153.     switch (type) {
  154.     case CProjKey::eApp:
  155.         name += "app.";
  156.         break;
  157.     case CProjKey::eLib:
  158.         name += "lib.";
  159.         break;
  160.     case CProjKey::eDll:
  161.         name += "dll.";
  162.         break;
  163.     case CProjKey::eMsvc:
  164.         name += "msvcproj.";
  165.         break;
  166.     default:
  167.         NCBI_THROW(CProjBulderAppException, 
  168.                    eProjectType, 
  169.                    NStr::IntToString(type));
  170.         break;
  171.     }
  172.     name += "msvc";
  173.     return name;
  174. }
  175. string CreateMsvcProjectMakefileName(const CProjItem& project)
  176. {
  177.     return CreateMsvcProjectMakefileName(project.m_Name, 
  178.                                          project.m_ProjType);
  179. }
  180. //-----------------------------------------------------------------------------
  181. CMsvcProjectMakefile::CMsvcProjectMakefile(const string& file_path)
  182.     :CMsvcMetaMakefile(file_path)
  183. {
  184.     CDirEntry::SplitPath(file_path, &m_ProjectBaseDir);
  185. }
  186. bool CMsvcProjectMakefile::IsExcludeProject(bool default_val) const
  187. {
  188.     string val = m_MakeFile.GetString("Common", "ExcludeProject", "");
  189.     if ( val.empty() )
  190.         return default_val;
  191.     return val != "FALSE";
  192. }
  193. void CMsvcProjectMakefile::GetAdditionalSourceFiles(const SConfigInfo& config,
  194.                                                     list<string>* files) const
  195. {
  196.     string files_string = 
  197.         GetOpt(m_MakeFile, "AddToProject", "SourceFiles", config);
  198.     
  199.     NStr::Split(files_string, LIST_SEPARATOR, *files);
  200. }
  201. void CMsvcProjectMakefile::GetAdditionalLIB(const SConfigInfo& config, 
  202.                                             list<string>*      lib_ids) const
  203. {
  204.     string lib_string = 
  205.         GetOpt(m_MakeFile, "AddToProject", "LIB", config);
  206.     
  207.     NStr::Split(lib_string, LIST_SEPARATOR, *lib_ids);
  208. }
  209. void CMsvcProjectMakefile::GetExcludedSourceFiles(const SConfigInfo& config,  
  210.                                                   list<string>* files) const
  211. {
  212.     string files_string = 
  213.         GetOpt(m_MakeFile, 
  214.                "ExcludedFromProject", "SourceFiles", config);
  215.     
  216.     NStr::Split(files_string, LIST_SEPARATOR, *files);
  217. }
  218. void CMsvcProjectMakefile::GetExcludedLIB(const SConfigInfo& config, 
  219.                                           list<string>*      lib_ids) const
  220. {
  221.     string lib_string = 
  222.         GetOpt(m_MakeFile, 
  223.                "ExcludedFromProject", "LIB", config);
  224.     
  225.     NStr::Split(lib_string, LIST_SEPARATOR, *lib_ids);
  226. }
  227. void CMsvcProjectMakefile::GetAdditionalIncludeDirs(const SConfigInfo& config,  
  228.                                                     list<string>* dirs) const
  229. {
  230.     string dirs_string = 
  231.         GetOpt(m_MakeFile, "AddToProject", "IncludeDirs", config);
  232.     
  233.     NStr::Split(dirs_string, LIST_SEPARATOR, *dirs);
  234. }
  235. void 
  236. CMsvcProjectMakefile::GetCustomBuildInfo(list<SCustomBuildInfo>* info) const
  237. {
  238.     info->clear();
  239.     string source_files_str = 
  240.         m_MakeFile.GetString("CustomBuild", "SourceFiles", "");
  241.     
  242.     list<string> source_files;
  243.     NStr::Split(source_files_str, LIST_SEPARATOR, source_files);
  244.     ITERATE(list<string>, p, source_files){
  245.         const string& source_file = *p;
  246.         
  247.         SCustomBuildInfo build_info;
  248.         string source_file_path_abs = 
  249.             CDirEntry::ConcatPath(m_MakeFileBaseDir, source_file);
  250.         build_info.m_SourceFile = 
  251.             CDirEntry::NormalizePath(source_file_path_abs);
  252.         build_info.m_CommandLine = 
  253.             m_MakeFile.GetString(source_file, "CommandLine", "");
  254.         build_info.m_Description = 
  255.             m_MakeFile.GetString(source_file, "Description", "");
  256.         build_info.m_Outputs = 
  257.             m_MakeFile.GetString(source_file, "Outputs", "");
  258.         build_info.m_AdditionalDependencies = 
  259.             m_MakeFile.GetString(source_file, "AdditionalDependencies", "");
  260.         if ( !build_info.IsEmpty() )
  261.             info->push_back(build_info);
  262.     }
  263. }
  264. void CMsvcProjectMakefile::GetResourceFiles(const SConfigInfo& config, 
  265.                                             list<string>*      files) const
  266. {
  267.     string files_string = 
  268.         GetOpt(m_MakeFile, "AddToProject", "ResourceFiles", config);
  269.     
  270.     NStr::Split(files_string, LIST_SEPARATOR, *files);
  271. }
  272. //-----------------------------------------------------------------------------
  273. CMsvcProjectRuleMakefile::CMsvcProjectRuleMakefile(const string& file_path)
  274.     :CMsvcProjectMakefile(file_path)
  275. {
  276. }
  277. int CMsvcProjectRuleMakefile::GetRulePriority(const SConfigInfo& config) const
  278. {
  279.     string priority_string = 
  280.         GetOpt(m_MakeFile, "Rule", "Priority", config);
  281.     
  282.     if ( priority_string.empty() )
  283.         return 0;
  284.     return NStr::StringToInt(priority_string);
  285. }
  286. //-----------------------------------------------------------------------------
  287. static string s_CreateRuleMakefileFilename(CProjItem::TProjType project_type,
  288.                                            const string& requires)
  289. {
  290.     string name = "Makefile." + requires;
  291.     switch (project_type) {
  292.     case CProjKey::eApp:
  293.         name += ".app";
  294.         break;
  295.     case CProjKey::eLib:
  296.         name += ".lib";
  297.         break;
  298.     case CProjKey::eDll:
  299.         name += ".dll";
  300.         break;
  301.     default:
  302.         break;
  303.     }
  304.     return name + ".msvc";
  305. }
  306. CMsvcCombinedProjectMakefile::CMsvcCombinedProjectMakefile
  307.                               (CProjItem::TProjType        project_type,
  308.                                const CMsvcProjectMakefile* project_makefile,
  309.                                const string&               rules_basedir,
  310.                                const list<string>          requires_list)
  311.     :m_ProjectMakefile(project_makefile)
  312. {
  313.     ITERATE(list<string>, p, requires_list) {
  314.         const string& requires = *p;
  315.         string rule_path = rules_basedir;
  316.         rule_path = 
  317.             CDirEntry::ConcatPath(rule_path, 
  318.                                   s_CreateRuleMakefileFilename(project_type, 
  319.                                                                requires));
  320.         
  321.         TRule rule(new CMsvcProjectRuleMakefile(rule_path));
  322.         if ( !rule->IsEmpty() )
  323.             m_Rules.push_back(rule);
  324.     }
  325. }
  326. CMsvcCombinedProjectMakefile::~CMsvcCombinedProjectMakefile(void)
  327. {
  328. }
  329. #define IMPLEMENT_COMBINED_MAKEFILE_OPT(X)  
  330. string CMsvcCombinedProjectMakefile::X(const string&       opt,               
  331.                                          const SConfigInfo&  config) const    
  332. {                                                                             
  333.     string prj_val = m_ProjectMakefile->X(opt, config);                       
  334.     if ( !prj_val.empty() )                                                   
  335.         return prj_val;                                                       
  336.     string val;                                                               
  337.     int priority = 0;                                                         
  338.     ITERATE(TRules, p, m_Rules) {                                             
  339.         const TRule& rule = *p;                                               
  340.         string rule_val = rule->X(opt, config);                               
  341.         if ( !rule_val.empty() && priority < rule->GetRulePriority(config)) { 
  342.             val      = rule_val;                                              
  343.             priority = rule->GetRulePriority(config);                         
  344.         }                                                                     
  345.     }                                                                         
  346.     return val;                                                               
  347. }                                                                          
  348. IMPLEMENT_COMBINED_MAKEFILE_OPT(GetCompilerOpt)
  349. IMPLEMENT_COMBINED_MAKEFILE_OPT(GetLinkerOpt)
  350. IMPLEMENT_COMBINED_MAKEFILE_OPT(GetLibrarianOpt)
  351. IMPLEMENT_COMBINED_MAKEFILE_OPT(GetResourceCompilerOpt)
  352. bool CMsvcCombinedProjectMakefile::IsExcludeProject(bool default_val) const
  353. {
  354.     return m_ProjectMakefile->IsExcludeProject(default_val);
  355. }
  356. static void s_ConvertRelativePaths(const string&       rule_base_dir,
  357.                                    const list<string>& rules_paths_list,
  358.                                    const string&       project_base_dir,
  359.                                    list<string>*       project_paths_list)
  360. {
  361.     project_paths_list->clear();
  362.     ITERATE(list<string>, p, rules_paths_list) {
  363.         const string& rules_path = *p;
  364.         string rules_abs_path = 
  365.             CDirEntry::ConcatPath(rule_base_dir, rules_path);
  366.         string project_path = 
  367.             CDirEntry::CreateRelativePath(project_base_dir, rules_abs_path);
  368.         project_paths_list->push_back(project_path);
  369.     }
  370. }
  371. #define IMPLEMENT_COMBINED_MAKEFILE_VALUES(X)  
  372. void CMsvcCombinedProjectMakefile::X(const SConfigInfo& config,               
  373.                                        list<string>*      values_list) const  
  374. {                                                                             
  375.     list<string> prj_val;                                                     
  376.     m_ProjectMakefile->X(config, &prj_val);                                   
  377.     if ( !prj_val.empty() ) {                                                 
  378.         *values_list = prj_val;                                               
  379.         return;                                                               
  380.     }                                                                         
  381.     list<string> val;                                                         
  382.     int priority = 0;                                                         
  383.     ITERATE(TRules, p, m_Rules) {                                             
  384.         const TRule& rule = *p;                                               
  385.         list<string> rule_val;                                                
  386.         rule->X(config, &rule_val);                                           
  387.         if ( !rule_val.empty() && priority < rule->GetRulePriority(config)) { 
  388.             val      = rule_val;                                              
  389.             priority = rule->GetRulePriority(config);                         
  390.         }                                                                     
  391.     }                                                                         
  392.     *values_list = val;                                                       
  393. }
  394. #define IMPLEMENT_COMBINED_MAKEFILE_FILESLIST(X)  
  395. void CMsvcCombinedProjectMakefile::X(const SConfigInfo& config,               
  396.                                        list<string>*      values_list) const  
  397. {                                                                             
  398.     list<string> prj_val;                                                     
  399.     m_ProjectMakefile->X(config, &prj_val);                                   
  400.     if ( !prj_val.empty() ) {                                                 
  401.         *values_list = prj_val;                                               
  402.         return;                                                               
  403.     }                                                                         
  404.     list<string> val;                                                         
  405.     int priority = 0;                                                         
  406.     string rule_base_dir;                                                     
  407.     ITERATE(TRules, p, m_Rules) {                                             
  408.         const TRule& rule = *p;                                               
  409.         list<string> rule_val;                                                
  410.         rule->X(config, &rule_val);                                           
  411.         if ( !rule_val.empty() && priority < rule->GetRulePriority(config)) { 
  412.             val      = rule_val;                                              
  413.             priority = rule->GetRulePriority(config);                         
  414.             rule_base_dir = rule->m_ProjectBaseDir;                           
  415.         }                                                                     
  416.     }                                                                         
  417.     s_ConvertRelativePaths(rule_base_dir,                                     
  418.                            val,                                               
  419.                            m_ProjectMakefile->m_ProjectBaseDir,               
  420.                            values_list);                                      
  421. }
  422. IMPLEMENT_COMBINED_MAKEFILE_FILESLIST(GetAdditionalSourceFiles)                                                                          
  423. IMPLEMENT_COMBINED_MAKEFILE_VALUES   (GetAdditionalLIB)
  424. IMPLEMENT_COMBINED_MAKEFILE_FILESLIST(GetExcludedSourceFiles)
  425. IMPLEMENT_COMBINED_MAKEFILE_VALUES   (GetExcludedLIB)
  426. IMPLEMENT_COMBINED_MAKEFILE_FILESLIST(GetAdditionalIncludeDirs)
  427. IMPLEMENT_COMBINED_MAKEFILE_FILESLIST(GetResourceFiles)
  428. void CMsvcCombinedProjectMakefile::GetCustomBuildInfo
  429.                                            (list<SCustomBuildInfo>* info) const
  430. {
  431.     m_ProjectMakefile->GetCustomBuildInfo(info);
  432. }
  433. //-----------------------------------------------------------------------------
  434. string GetCompilerOpt(const IMsvcMetaMakefile&    meta_file, 
  435.                       const IMsvcMetaMakefile& project_file,
  436.                       const string&               opt,
  437.                       const SConfigInfo&          config)
  438. {
  439.    string val = project_file.GetCompilerOpt(opt, config);
  440.    if ( !val.empty() )
  441.        return val;
  442.    
  443.    return meta_file.GetCompilerOpt(opt, config);
  444. }
  445. string GetLinkerOpt(const IMsvcMetaMakefile& meta_file, 
  446.                     const IMsvcMetaMakefile& project_file,
  447.                     const string&            opt,
  448.                     const SConfigInfo&       config)
  449. {
  450.    string val = project_file.GetLinkerOpt(opt, config);
  451.    if ( !val.empty() )
  452.        return val;
  453.    
  454.    return meta_file.GetLinkerOpt(opt, config);
  455. }
  456. string GetLibrarianOpt(const IMsvcMetaMakefile& meta_file, 
  457.                        const IMsvcMetaMakefile& project_file,
  458.                        const string&            opt,
  459.                        const SConfigInfo&       config)
  460. {
  461.    string val = project_file.GetLibrarianOpt(opt, config);
  462.    if ( !val.empty() )
  463.        return val;
  464.    
  465.    return meta_file.GetLibrarianOpt(opt, config);
  466. }
  467. string GetResourceCompilerOpt(const IMsvcMetaMakefile& meta_file, 
  468.                               const IMsvcMetaMakefile& project_file,
  469.                               const string&            opt,
  470.                               const SConfigInfo&       config)
  471. {
  472.    string val = project_file.GetResourceCompilerOpt(opt, config);
  473.    if ( !val.empty() )
  474.        return val;
  475.    
  476.    return meta_file.GetResourceCompilerOpt(opt, config);
  477. }
  478. END_NCBI_SCOPE
  479. /*
  480.  * ===========================================================================
  481.  * $Log: msvc_makefile.cpp,v $
  482.  * Revision 1000.2  2004/06/16 17:02:28  gouriano
  483.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.15
  484.  *
  485.  * Revision 1.15  2004/06/10 15:16:46  gorelenk
  486.  * Changed macrodefines to be comply with GCC 3.4.0 .
  487.  *
  488.  * Revision 1.14  2004/06/07 13:50:29  gorelenk
  489.  * Added implementation of classes
  490.  * CMsvcProjectRuleMakefile and CMsvcCombinedProjectMakefile.
  491.  *
  492.  * Revision 1.13  2004/05/21 21:41:41  gorelenk
  493.  * Added PCH ncbi_pch.hpp
  494.  *
  495.  * Revision 1.12  2004/05/17 14:36:20  gorelenk
  496.  * Implemented CMsvcMetaMakefile::GetPchUsageDefine .
  497.  *
  498.  * Revision 1.11  2004/05/10 19:52:52  gorelenk
  499.  * Changed CreateMsvcProjectMakefileName.
  500.  *
  501.  * Revision 1.10  2004/05/10 14:27:04  gorelenk
  502.  * Implemented IsPchEnabled and GetUsePchThroughHeader.
  503.  *
  504.  * Revision 1.9  2004/03/10 16:38:00  gorelenk
  505.  * Added dll processing to function CreateMsvcProjectMakefileName.
  506.  *
  507.  * Revision 1.8  2004/02/23 20:42:57  gorelenk
  508.  * Added support of MSVC ResourceCompiler tool.
  509.  *
  510.  * Revision 1.7  2004/02/23 18:50:31  gorelenk
  511.  * Added implementation of GetResourceFiles member-function
  512.  * of class CMsvcProjectMakefile.
  513.  *
  514.  * Revision 1.6  2004/02/20 22:53:25  gorelenk
  515.  * Added analysis of ASN projects depends.
  516.  *
  517.  * Revision 1.5  2004/02/12 16:27:56  gorelenk
  518.  * Changed generation of command line for datatool.
  519.  *
  520.  * Revision 1.4  2004/02/10 18:02:46  gorelenk
  521.  * + GetAdditionalLIB.
  522.  * + GetExcludedLIB - customization of depends.
  523.  *
  524.  * Revision 1.3  2004/02/06 23:14:59  gorelenk
  525.  * Implemented support of ASN projects, semi-auto configure,
  526.  * CPPFLAGS support. Second working version.
  527.  *
  528.  * Revision 1.2  2004/01/28 17:55:48  gorelenk
  529.  * += For msvc makefile support of :
  530.  *                 Requires tag, ExcludeProject tag,
  531.  *                 AddToProject section (SourceFiles and IncludeDirs),
  532.  *                 CustomBuild section.
  533.  * += For support of user local site.
  534.  *
  535.  * Revision 1.1  2004/01/26 19:27:28  gorelenk
  536.  * += MSVC meta makefile support
  537.  * += MSVC project makefile support
  538.  *
  539.  * ===========================================================================
  540.  */