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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: msvc_configure.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/16 17:02:24  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: msvc_configure.cpp,v 1000.3 2004/06/16 17:02:24 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_configure.hpp>
  39. #include <app/project_tree_builder/proj_builder_app.hpp>
  40. BEGIN_NCBI_SCOPE
  41. CMsvcConfigure::CMsvcConfigure(void)
  42. {
  43. }
  44. CMsvcConfigure::~CMsvcConfigure(void)
  45. {
  46. }
  47. void s_ResetLibInstallKey(const string& dir, 
  48.                           const string& lib)
  49. {
  50.     string key_file_name(lib);
  51.     NStr::ToLower(key_file_name);
  52.     key_file_name += ".installed";
  53.     string key_file_path = CDirEntry::ConcatPath(dir, key_file_name);
  54.     if ( CDirEntry(key_file_path).Exists() ) {
  55.         CDirEntry(key_file_path).Remove();
  56.     }
  57. }
  58. static void s_CreateThirdPartyLibsInstallMakefile
  59.                                             (const CMsvcSite&   site, 
  60.                                              const list<string> libs_to_install,
  61.                                              const SConfigInfo& config,
  62.                                              const CBuildType&  build_type)
  63. {
  64.     // Create makefile path
  65.     string makefile_path = GetApp().GetProjectTreeInfo().m_Compilers;
  66.     makefile_path = 
  67.         CDirEntry::ConcatPath(makefile_path, 
  68.                               GetApp().GetRegSettings().m_CompilersSubdir);
  69.     makefile_path = CDirEntry::ConcatPath(makefile_path, build_type.GetTypeStr());
  70.     makefile_path = CDirEntry::ConcatPath(makefile_path, config.m_Name);
  71.     makefile_path = CDirEntry::ConcatPath(makefile_path, 
  72.                                           "Makefile.third_party.mk");
  73.     // Create dir if no such dir...
  74.     string dir;
  75.     CDirEntry::SplitPath(makefile_path, &dir);
  76.     CDir makefile_dir(dir);
  77.     if ( !makefile_dir.Exists() ) {
  78.         CDir(dir).CreatePath();
  79.     }
  80.     CNcbiOfstream ofs(makefile_path.c_str(), 
  81.                       IOS_BASE::out | IOS_BASE::trunc );
  82.     if ( !ofs )
  83.         NCBI_THROW(CProjBulderAppException, eFileCreation, makefile_path);
  84.     
  85.     ITERATE(list<string>, n, libs_to_install) {
  86.         const string& lib = *n;
  87.         SLibInfo lib_info;
  88.         site.GetLibInfo(lib, config, &lib_info);
  89.         if ( !lib_info.m_LibPath.empty() ) {
  90.             string bin_dir = lib_info.m_LibPath;
  91.             bin_dir = 
  92.                 CDirEntry::ConcatPath(bin_dir, 
  93.                                       site.GetThirdPartyLibsBinSubDir());
  94.             bin_dir = CDirEntry::NormalizePath(bin_dir);
  95.             if ( CDirEntry(bin_dir).Exists() ) {
  96.                 //
  97.                 string key(lib);
  98.                 NStr::ToUpper(key);
  99.                 key += site.GetThirdPartyLibsBinPathSuffix();
  100.                 ofs << key << " = " << bin_dir << "n";
  101.                 s_ResetLibInstallKey(dir, lib);
  102.             }
  103.         }
  104.     }
  105. }
  106. void CMsvcConfigure::operator() (const CMsvcSite&         site, 
  107.                                  const list<SConfigInfo>& configs,
  108.                                  const string&            root_dir)
  109. {
  110.     LOG_POST(Info << "Starting configure.");
  111.     
  112.     InitializeFrom(site);
  113.     
  114.     ITERATE(list<string>, p, m_ConfigureDefines) {
  115.         const string& define = *p;
  116.         if( ProcessDefine(define, site, configs) ) {
  117.             LOG_POST(Info << "Configure define enabled : "  + define);
  118.             m_ConfigSite[define] = '1';
  119.         } else {
  120.             LOG_POST(Info << "Configure define disabled : " + define);
  121.             m_ConfigSite[define] = '0';
  122.         }
  123.     }
  124.     // Write ncbi_conf_msvc_site.h:
  125.     string ncbi_conf_msvc_site_path = 
  126.         CDirEntry::ConcatPath(root_dir, m_ConfigureDefinesPath);
  127.     LOG_POST(Info << "MSVC site configuration will be in file : " 
  128.                       + ncbi_conf_msvc_site_path);
  129.     string candidate_path = ncbi_conf_msvc_site_path + ".candidate";
  130.     WriteNcbiconfMsvcSite(candidate_path);
  131.     PromoteIfDifferent(ncbi_conf_msvc_site_path, candidate_path);
  132.     LOG_POST(Info << "Configure finished.");
  133.     // Write makefile uses to install 3-rd party dlls
  134.     list<string> third_party_to_install;
  135.     site.GetThirdPartyLibsToInstall(&third_party_to_install);
  136.     // For static buid
  137.     ITERATE(list<SConfigInfo>, p, configs) {
  138.         const SConfigInfo& config = *p;
  139.         const CBuildType static_build(false);
  140.         s_CreateThirdPartyLibsInstallMakefile(site, 
  141.                                               third_party_to_install, 
  142.                                               config, 
  143.                                               static_build);
  144.     }
  145.     // For dll build
  146.     list<SConfigInfo> dll_configs;
  147.     GetApp().GetDllsInfo().GetBuildConfigs(&dll_configs);
  148.     ITERATE(list<SConfigInfo>, p, dll_configs) {
  149.         const SConfigInfo& config = *p;
  150.         const CBuildType dll_build(true);
  151.         s_CreateThirdPartyLibsInstallMakefile(site, 
  152.                                               third_party_to_install, 
  153.                                               config, 
  154.                                               dll_build);
  155.     }
  156. }
  157. void CMsvcConfigure::InitializeFrom(const CMsvcSite& site)
  158. {
  159.     m_ConfigSite.clear();
  160.     m_ConfigureDefinesPath = site.GetConfigureDefinesPath();
  161.     if ( m_ConfigureDefinesPath.empty() )
  162.         NCBI_THROW(CProjBulderAppException, 
  163.            eConfigureDefinesPath, ""); //TODO - message
  164.     else
  165.         LOG_POST(Info  << "Path to configure defines file is: " +
  166.                            m_ConfigureDefinesPath);
  167.     site.GetConfigureDefines(&m_ConfigureDefines);
  168.     if( m_ConfigureDefines.empty() )
  169.         LOG_POST(Warning << "No configure defines.");
  170.     else
  171.         LOG_POST(Info    << "Configure defines: " + 
  172.                             NStr::Join(m_ConfigureDefines, ", ") );
  173. }
  174. bool CMsvcConfigure::ProcessDefine(const string& define, 
  175.                                    const CMsvcSite& site, 
  176.                                    const list<SConfigInfo>& configs) const
  177. {
  178.     if ( !site.IsDescribed(define) ) {
  179.         LOG_POST(Info << "Not defined in site: " + define);
  180.         return false;
  181.     }
  182.     list<string> components;
  183.     site.GetComponents(define, &components);
  184.     ITERATE(list<string>, p, components) {
  185.         const string& component = *p;
  186.         ITERATE(list<SConfigInfo>, n, configs) {
  187.             const SConfigInfo& config = *n;
  188.             SLibInfo lib_info;
  189.             site.GetLibInfo(component, config, &lib_info);
  190.             if ( !IsLibOk(lib_info) )
  191.                 return false;
  192.         }
  193.     }
  194.     return true;
  195. }
  196. void CMsvcConfigure::WriteNcbiconfMsvcSite(const string& full_path) const
  197. {
  198.     CNcbiOfstream  ofs(full_path.c_str(), 
  199.                        IOS_BASE::out | IOS_BASE::trunc );
  200.     if ( !ofs )
  201.     NCBI_THROW(CProjBulderAppException, eFileCreation, full_path);
  202.     ofs << "#ifndef CORELIB_CONFIG___NCBICONF_MSVC_SITE__H" << endl;
  203.     ofs << "#define CORELIB_CONFIG___NCBICONF_MSVC_SITE__H" << endl;
  204.     ofs << endl;
  205.     ofs << endl;
  206.     ofs <<"/* $Id: msvc_configure.cpp,v 1000.3 2004/06/16 17:02:24 gouriano Exp $" << endl;
  207.     ofs <<"* ===========================================================================" << endl;
  208.     ofs <<"*" << endl;
  209.     ofs <<"*                            PUBLIC DOMAIN NOTICE" << endl;
  210.     ofs <<"*               National Center for Biotechnology Information" << endl;
  211.     ofs <<"*" << endl;
  212.     ofs <<"*  This software/database is a "United States Government Work" under the" << endl;
  213.     ofs <<"*  terms of the United States Copyright Act.  It was written as part of" << endl;
  214.     ofs <<"*  the author's official duties as a United States Government employee and" << endl;
  215.     ofs <<"*  thus cannot be copyrighted.  This software/database is freely available" << endl;
  216.     ofs <<"*  to the public for use. The National Library of Medicine and the U.S." << endl;
  217.     ofs <<"*  Government have not placed any restriction on its use or reproduction." << endl;
  218.     ofs <<"*" << endl;
  219.     ofs <<"*  Although all reasonable efforts have been taken to ensure the accuracy" << endl;
  220.     ofs <<"*  and reliability of the software and data, the NLM and the U.S." << endl;
  221.     ofs <<"*  Government do not and cannot warrant the performance or results that" << endl;
  222.     ofs <<"*  may be obtained by using this software or data. The NLM and the U.S." << endl;
  223.     ofs <<"*  Government disclaim all warranties, express or implied, including" << endl;
  224.     ofs <<"*  warranties of performance, merchantability or fitness for any particular" << endl;
  225.     ofs <<"*  purpose." << endl;
  226.     ofs <<"*" << endl;
  227.     ofs <<"*  Please cite the author in any work or product based on this material." << endl;
  228.     ofs <<"*" << endl;
  229.     ofs <<"* ===========================================================================" << endl;
  230.     ofs <<"*" << endl;
  231.     ofs <<"* Author:  ......." << endl;
  232.     ofs <<"*" << endl;
  233.     ofs <<"* File Description:" << endl;
  234.     ofs <<"*   ......." << endl;
  235.     ofs <<"*" << endl;
  236.     ofs <<"* Remark:" << endl;
  237.     ofs <<"*   This code was originally generated by application proj_tree_builder" << endl;
  238.     ofs <<"*/" << endl;
  239.     ofs << endl;
  240.     ofs << endl;
  241.     ITERATE(TConfigSite, p, m_ConfigSite) {
  242.         ofs << "#define " << p->first << " " << p->second << endl;
  243.     }
  244.     ofs << endl;
  245.     ofs << "#endif // CORELIB_CONFIG___NCBICONF_MSVC_SITE__H" << endl;
  246. }
  247. END_NCBI_SCOPE
  248. /*
  249.  * ===========================================================================
  250.  * $Log: msvc_configure.cpp,v $
  251.  * Revision 1000.3  2004/06/16 17:02:24  gouriano
  252.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  253.  *
  254.  * Revision 1.13  2004/06/15 15:04:41  gorelenk
  255.  * Changed CMsvcConfigure::operator() to be correctly compiled on GCC295 and
  256.  * GCC333 .
  257.  *
  258.  * Revision 1.12  2004/06/09 14:14:45  gorelenk
  259.  * Added static helper function s_CreateThirdPartyLibsInstallMakefile.
  260.  * Changed implementation of CMsvcConfigure::operator() to use helper above.
  261.  * Also added generation of installation makefiles for static builds.
  262.  *
  263.  * Revision 1.11  2004/06/03 14:04:38  gorelenk
  264.  * Changed CMsvcConfigure::operator() :
  265.  * added third party libraries install key support.
  266.  *
  267.  * Revision 1.10  2004/05/27 13:43:52  gorelenk
  268.  * Changed name of generated makefile for auto third-parties install to
  269.  * 'Makefile.third_party.mk'.
  270.  *
  271.  * Revision 1.9  2004/05/24 15:14:07  gorelenk
  272.  * Changed implementation of CMsvcConfigure::operator().
  273.  *
  274.  * Revision 1.8  2004/05/24 14:43:19  gorelenk
  275.  * Changed implementation of CMsvcConfigure::operator() - added code section
  276.  * for generation of makefile to install third-party libs.
  277.  *
  278.  * Revision 1.7  2004/05/21 21:41:41  gorelenk
  279.  * Added PCH ncbi_pch.hpp
  280.  *
  281.  * Revision 1.6  2004/05/07 15:22:17  gorelenk
  282.  * Changed implementation of CMsvcConfigure::WriteNcbiconfMsvcSite .
  283.  *
  284.  * Revision 1.5  2004/04/19 15:41:50  gorelenk
  285.  * Static helper function s_LibOk changed to function IsLibOk.
  286.  *
  287.  * Revision 1.4  2004/02/24 20:51:59  gorelenk
  288.  * Changed implementation of function s_LibOk
  289.  * and member-function ProcessDefine of class CMsvcConfigure.
  290.  *
  291.  * Revision 1.3  2004/02/10 18:23:33  gorelenk
  292.  * Implemented overwriting of site defines file *.h only when new file is
  293.  * different from already present one.
  294.  *
  295.  * Revision 1.2  2004/02/06 23:14:59  gorelenk
  296.  * Implemented support of ASN projects, semi-auto configure,
  297.  * CPPFLAGS support. Second working version.
  298.  *
  299.  * Revision 1.1  2004/02/04 23:19:22  gorelenk
  300.  * Initial revision.
  301.  *
  302.  * ===========================================================================
  303.  */