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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_site.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:31:10  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: msvc_site.cpp,v 1000.2 2004/06/01 18:31:10 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_site.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. CMsvcSite::CMsvcSite(const CNcbiRegistry& registry)
  47.     :m_Registry(registry)
  48. {
  49.     // Not provided requests
  50.     string not_provided_requests_str = 
  51.         m_Registry.GetString("Configure", "NotProvidedRequests", "");
  52.     
  53.     list<string> not_provided_requests_list;
  54.     NStr::Split(not_provided_requests_str, LIST_SEPARATOR, 
  55.                 not_provided_requests_list);
  56.     copy(not_provided_requests_list.begin(),
  57.          not_provided_requests_list.end(),
  58.          inserter(m_NotProvidedThing, m_NotProvidedThing.end()));
  59.     // Lib choices
  60.     string lib_choices_str = 
  61.         m_Registry.GetString("Configure", "LibChoices", "");
  62.     list<string> lib_choices_list;
  63.     NStr::Split(lib_choices_str, LIST_SEPARATOR, 
  64.                 lib_choices_list);
  65.     ITERATE(list<string>, p, lib_choices_list) {
  66.         const string& choice_str = *p;
  67.         string lib_id;
  68.         string lib_3party_id;
  69.         if ( NStr::SplitInTwo(choice_str, "/", lib_id, lib_3party_id) ) {
  70.             m_LibChoices.push_back(SLibChoice(*this, lib_id, lib_3party_id));
  71.         }
  72.     }
  73. }
  74. bool CMsvcSite::IsProvided(const string& thing) const
  75. {
  76.     return m_NotProvidedThing.find(thing) == m_NotProvidedThing.end();
  77. }
  78. bool CMsvcSite::IsDescribed(const string& section) const
  79. {
  80.     list<string> sections;
  81.     m_Registry.EnumerateSections(&sections);
  82.     return find(sections.begin(), sections.end(), section) != sections.end();
  83. }
  84. void CMsvcSite::GetComponents(const string& entry, 
  85.                               list<string>* components) const
  86. {
  87.     components->clear();
  88.     string comp_str = m_Registry.GetString(entry, "Component", "");
  89.     NStr::Split(comp_str, " ,t", *components);
  90. }
  91. void CMsvcSite::GetLibInfo(const string& lib, 
  92.                            const SConfigInfo& config, SLibInfo* libinfo) const
  93. {
  94.     libinfo->Clear();
  95.     libinfo->m_IncludeDir = GetOpt(m_Registry, lib, "INCLUDE", config);
  96.     
  97.     string defines_str    = GetOpt(m_Registry, lib, "DEFINES", config);
  98.     NStr::Split(defines_str, LIST_SEPARATOR, libinfo->m_LibDefines);
  99.     libinfo->m_LibPath    = GetOpt(m_Registry, lib, "LIBPATH", config);
  100.     string libs_str = GetOpt(m_Registry, lib, "LIB", config);
  101.     NStr::Split(libs_str, LIST_SEPARATOR, libinfo->m_Libs); //TODO
  102. }
  103. bool CMsvcSite::IsLibEnabledInConfig(const string&      lib, 
  104.                                      const SConfigInfo& config) const
  105. {
  106.     string enabled_configs_str = m_Registry.GetString(lib, "CONFS", "");
  107.     list<string> enabled_configs;
  108.     NStr::Split(enabled_configs_str, 
  109.                 LIST_SEPARATOR, enabled_configs);
  110.     return find(enabled_configs.begin(), 
  111.                 enabled_configs.end(), 
  112.                 config.m_Name) != enabled_configs.end();
  113. }
  114. string CMsvcSite::ResolveDefine(const string& define) const
  115. {
  116.     return m_Registry.GetString("Defines", define, "");
  117. }
  118. string CMsvcSite::GetConfigureDefinesPath(void) const
  119. {
  120.     return m_Registry.GetString("Configure", "DefinesPath", "");
  121. }
  122. void CMsvcSite::GetConfigureDefines(list<string>* defines) const
  123. {
  124.     defines->clear();
  125.     string defines_str = m_Registry.GetString("Configure", "Defines", "");
  126.     NStr::Split(defines_str, LIST_SEPARATOR, *defines);
  127. }
  128. bool CMsvcSite::IsLibWithChoice(const string& lib_id) const
  129. {
  130.     ITERATE(list<SLibChoice>, p, m_LibChoices) {
  131.         const SLibChoice& choice = *p;
  132.         if (lib_id == choice.m_LibId)
  133.             return true;
  134.     }
  135.     return false;
  136. }
  137. bool CMsvcSite::Is3PartyLibWithChoice(const string& lib3party_id) const
  138. {
  139.     ITERATE(list<SLibChoice>, p, m_LibChoices) {
  140.         const SLibChoice& choice = *p;
  141.         if (lib3party_id == choice.m_3PartyLib)
  142.             return true;
  143.     }
  144.     return false;
  145. }
  146. CMsvcSite::SLibChoice::SLibChoice(void)
  147.  :m_Choice(eUnknown)
  148. {
  149. }
  150. CMsvcSite::SLibChoice::SLibChoice(const CMsvcSite& site,
  151.                                   const string&    lib,
  152.                                   const string&    lib_3party)
  153.  :m_LibId    (lib),
  154.   m_3PartyLib(lib_3party)
  155. {
  156.     m_Choice = e3PartyLib;
  157.     ITERATE(list<SConfigInfo>, p, GetApp().GetRegSettings().m_ConfigInfo) {
  158.         const SConfigInfo& config = *p;
  159.         SLibInfo lib_info;
  160.         site.GetLibInfo(m_3PartyLib, config, &lib_info);
  161.         if ( !IsLibOk(lib_info) ) {
  162.             m_Choice = eLib;
  163.             break;
  164.         }
  165.     }
  166. }
  167. CMsvcSite::ELibChoice CMsvcSite::GetChoiceForLib(const string& lib_id) const
  168. {
  169.     ITERATE(list<SLibChoice>, p, m_LibChoices) {
  170.         const SLibChoice& choice = *p;
  171.         if (choice.m_LibId == lib_id) 
  172.             return choice.m_Choice;
  173.     }
  174.     return eUnknown;
  175. }
  176. CMsvcSite::ELibChoice CMsvcSite::GetChoiceFor3PartyLib(const string& lib3party_id) const
  177. {
  178.     ITERATE(list<SLibChoice>, p, m_LibChoices) {
  179.         const SLibChoice& choice = *p;
  180.         if (choice.m_3PartyLib == lib3party_id) 
  181.             return choice.m_Choice;
  182.     }
  183.     return eUnknown;
  184. }
  185. void CMsvcSite::GetLibChoiceIncludes (const string& cpp_flags_define, 
  186.                                       list<string>* abs_includes) const
  187. {
  188.     abs_includes->clear();
  189.     string include_str = m_Registry.GetString("LibChoicesIncludes", 
  190.                                               cpp_flags_define, "");
  191.     //split on parts
  192.     list<string> parts;
  193.     NStr::Split(include_str, LIST_SEPARATOR, parts);
  194.     string lib_id;
  195.     ITERATE(list<string>, p, parts) {
  196.         if ( lib_id.empty() )
  197.             lib_id = *p;
  198.         else  {
  199.             
  200.             ELibChoice choice = GetChoiceForLib(lib_id);
  201.             if (choice == eLib) {
  202.                 const string& rel_include_path = *p;
  203.                 string abs_include_path = 
  204.                     GetApp().GetProjectTreeInfo().m_Include;
  205.                 abs_include_path = 
  206.                     CDirEntry::ConcatPath(abs_include_path, rel_include_path);
  207.                 abs_include_path = CDirEntry::NormalizePath(abs_include_path);
  208.                 abs_includes->push_back(abs_include_path);
  209.             }
  210.             if (choice == e3PartyLib) {
  211.                 ITERATE(list<SLibChoice>, n, m_LibChoices) {
  212.                     const SLibChoice& choice = *n;
  213.                     if (choice.m_LibId == lib_id) {
  214.                         SLibInfo lib_info;
  215.                         GetLibInfo(choice.m_3PartyLib, SConfigInfo(), &lib_info);
  216.                         if ( !lib_info.m_IncludeDir.empty() ) {
  217.                             abs_includes->push_back(lib_info.m_IncludeDir);
  218.                         }
  219.                     }
  220.                 }
  221.             }
  222.             //
  223.             lib_id.erase();
  224.         }
  225.     }
  226. }
  227. CMsvcSite::SLibChoice CMsvcSite::GetLibChoiceForLib(const string& lib_id) const
  228. {
  229.     ITERATE(list<SLibChoice>, p, m_LibChoices) {
  230.         const SLibChoice& choice = *p;
  231.         if (choice.m_LibId == lib_id) 
  232.             return choice;
  233.     }
  234.     return SLibChoice();
  235. }
  236. string CMsvcSite::GetAppDefaultResource(void) const
  237. {
  238.     return m_Registry.GetString("DefaultResource", "app", "");
  239. }
  240. void CMsvcSite::GetThirdPartyLibsToInstall(list<string>* libs) const
  241. {
  242.     libs->clear();
  243.     string libs_str = m_Registry.GetString("Configure", 
  244.                                            "ThirdPartyLibsToInstall", "");
  245.     NStr::Split(libs_str, LIST_SEPARATOR, *libs);
  246. }
  247. string CMsvcSite::GetThirdPartyLibsBinPathSuffix(void) const
  248. {
  249.     return m_Registry.GetString("Configure", 
  250.                                 "ThirdPartyLibsBinPathSuffix", "");
  251. }
  252. string CMsvcSite::GetThirdPartyLibsBinSubDir(void) const
  253. {
  254.     return m_Registry.GetString("Configure", 
  255.                                 "ThirdPartyLibsBinSubDir", "");
  256. }
  257. //-----------------------------------------------------------------------------
  258. bool IsLibOk(const SLibInfo& lib_info)
  259. {
  260.     if ( lib_info.IsEmpty() )
  261.         return false;
  262.     if ( !lib_info.m_IncludeDir.empty() &&
  263.          !CDirEntry(lib_info.m_IncludeDir).Exists() ) {
  264.         LOG_POST(Warning << "No LIB INCLUDE dir : " + lib_info.m_IncludeDir);
  265.         return false;
  266.     }
  267.     if ( !lib_info.m_LibPath.empty() &&
  268.          !CDirEntry(lib_info.m_LibPath).Exists() ) {
  269.         LOG_POST(Warning << "No LIBPATH : " + lib_info.m_LibPath);
  270.         return false;
  271.     }
  272.     ITERATE(list<string>, p, lib_info.m_Libs) {
  273.         const string& lib = *p;
  274.         string lib_path_abs = CDirEntry::ConcatPath(lib_info.m_LibPath, lib);
  275.         if ( !lib_path_abs.empty() &&
  276.              !CDirEntry(lib_path_abs).Exists() ) {
  277.             LOG_POST(Warning << "No LIB : " + lib_path_abs);
  278.             return false;
  279.         }
  280.     }
  281.     return true;
  282. }
  283. END_NCBI_SCOPE
  284. /*
  285.  * ===========================================================================
  286.  * $Log: msvc_site.cpp,v $
  287.  * Revision 1000.2  2004/06/01 18:31:10  gouriano
  288.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.16
  289.  *
  290.  * Revision 1.16  2004/06/01 16:03:54  gorelenk
  291.  * Implemented CMsvcSite::GetLibChoiceForLib and SLibChoice::SLibChoice .
  292.  *
  293.  * Revision 1.15  2004/05/24 14:41:59  gorelenk
  294.  * Implemented member-functions supporting auto-install of third-party libs:
  295.  * CMsvcSite::GetThirdPartyLibsToInstall,
  296.  * CMsvcSite::GetThirdPartyLibsBinPathSuffix,
  297.  * CMsvcSite::GetThirdPartyLibsBinSubDir .
  298.  *
  299.  * Revision 1.14  2004/05/21 21:41:41  gorelenk
  300.  * Added PCH ncbi_pch.hpp
  301.  *
  302.  * Revision 1.13  2004/05/17 14:41:10  gorelenk
  303.  * Implemented CMsvcSite::GetAppDefaultResource .
  304.  *
  305.  * Revision 1.12  2004/05/13 14:55:00  gorelenk
  306.  * Implemented CMsvcSite::GetLibChoiceIncludes .
  307.  *
  308.  * Revision 1.11  2004/04/20 22:09:00  gorelenk
  309.  * Changed implementation of struct SLibChoice constructor.
  310.  *
  311.  * Revision 1.10  2004/04/19 15:39:43  gorelenk
  312.  * Implemeted choice related members of class CMsvcSite:
  313.  * struct SLibChoice constructor,functions IsLibWithChoice,
  314.  * Is3PartyLibWithChoice, GetChoiceForLib and GetChoiceFor3PartyLib .
  315.  *
  316.  * Revision 1.9  2004/03/22 14:48:38  gorelenk
  317.  * Changed implementation of CMsvcSite::GetLibInfo .
  318.  *
  319.  * Revision 1.8  2004/02/24 20:53:16  gorelenk
  320.  * Added implementation of member function IsLibEnabledInConfig
  321.  * of class  CMsvcSite.
  322.  *
  323.  * Revision 1.7  2004/02/06 23:14:59  gorelenk
  324.  * Implemented support of ASN projects, semi-auto configure,
  325.  * CPPFLAGS support. Second working version.
  326.  *
  327.  * Revision 1.6  2004/02/05 16:31:19  gorelenk
  328.  * Added definition of function GetComponents.
  329.  *
  330.  * Revision 1.5  2004/02/05 15:29:06  gorelenk
  331.  * + Configuration information provision.
  332.  *
  333.  * Revision 1.4  2004/02/05 00:02:09  gorelenk
  334.  * Added support of user site and  Makefile defines.
  335.  *
  336.  * Revision 1.3  2004/02/03 17:16:43  gorelenk
  337.  * Removed implementation of method IsExplicitExclude from class CMsvcSite.
  338.  *
  339.  * Revision 1.2  2004/01/28 17:55:49  gorelenk
  340.  * += For msvc makefile support of :
  341.  *                 Requires tag, ExcludeProject tag,
  342.  *                 AddToProject section (SourceFiles and IncludeDirs),
  343.  *                 CustomBuild section.
  344.  * += For support of user local site.
  345.  *
  346.  * Revision 1.1  2004/01/26 19:27:29  gorelenk
  347.  * += MSVC meta makefile support
  348.  * += MSVC project makefile support
  349.  *
  350.  * ===========================================================================
  351.  */