home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / utils / makegen / makegen.cpp < prev   
C/C++ Source or Header  |  2001-11-23  |  6KB  |  234 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        utils/makegen/makegen.cpp
  3. // Purpose:     a tool to generate the makefiles for samples
  4. // Author:      Vadim Zeitlin
  5. // Modified by:
  6. // Created:     03.01.00
  7. // RCS-ID:      $Id: makegen.cpp,v 1.4 2001/11/22 22:03:26 GD Exp $
  8. // Copyright:   (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
  9. // Licence:     wxWindows license
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. /*
  13.  * TODO
  14.  *
  15.  *  1. support for programs with multiple object files
  16.  *  2. support for programs under utils and demos, not only samples
  17.  */
  18.  
  19. // ============================================================================
  20. // declarations
  21. // ============================================================================
  22.  
  23. #if wxUSE_GUI
  24.     #error "This is a console mode program and must be linked with wxBase."
  25. #endif
  26.  
  27. // ----------------------------------------------------------------------------
  28. // headers
  29. // ----------------------------------------------------------------------------
  30.  
  31. #include "wx/string.h"
  32. #include "wx/file.h"
  33. #include "wx/ffile.h"
  34. #include "wx/app.h"
  35. #include "wx/log.h"
  36. #include "wx/dir.h"
  37. #include "wx/textfile.h"
  38. #include "wx/datetime.h"
  39. #include "wx/cmdline.h"
  40.  
  41. // ----------------------------------------------------------------------------
  42. // the application class
  43. // ----------------------------------------------------------------------------
  44.  
  45. class MakeGenApp : public wxApp
  46. {
  47. public:
  48.     MakeGenApp() { m_quiet = FALSE; }
  49.  
  50.     virtual bool OnInit();
  51.  
  52.     virtual int OnRun();
  53.  
  54. private:
  55.     bool GenerateMakefile(const wxString& filename);
  56.  
  57.     wxString m_progname,        // the name of the sample
  58.              m_dirname,         // directory with the template files
  59.              m_outdir;          // directory to output files to
  60.  
  61.     bool m_quiet;               // don't give non essential messages
  62. };
  63.  
  64. IMPLEMENT_APP(MakeGenApp);
  65.  
  66. // ============================================================================
  67. // implementation
  68. // ============================================================================
  69.  
  70. // ----------------------------------------------------------------------------
  71. // MakeGenApp
  72. // ----------------------------------------------------------------------------
  73.  
  74. bool MakeGenApp::GenerateMakefile(const wxString& filename)
  75. {
  76.     wxTextFile fileIn(m_dirname + filename);
  77.     if ( !fileIn.Open() )
  78.     {
  79.         wxLogError(_T("Makefile '%s' couldn't be generated."), filename.c_str());
  80.  
  81.         return FALSE;
  82.     }
  83.  
  84.     wxString fileOutName;
  85.     fileOutName << m_outdir << _T('/') << filename;
  86.     wxFFile fileOut(fileOutName, "w");
  87.     if ( !fileOut.IsOpened() )
  88.     {
  89.         wxLogError(_T("Makefile '%s' couldn't be generated."), filename.c_str());
  90.  
  91.         return FALSE;
  92.     }
  93.  
  94.     wxLogVerbose(_T("Generating '%s' for '%s'..."),
  95.                  fileOutName.c_str(), m_progname.c_str());
  96.  
  97.     size_t count = fileIn.GetLineCount();
  98.     for ( size_t n = 0; n < count; n++ )
  99.     {
  100.         wxString line = fileIn[n];
  101.  
  102.         line.Replace(_T("#DATE"), wxDateTime::Now().FormatISODate());
  103.         line.Replace(_T("#NAME"), m_progname);
  104.  
  105.         fileOut.Write(line + _T('\n'));
  106.     }
  107.  
  108.     return TRUE;
  109. }
  110.  
  111. // parse the cmd line
  112. bool MakeGenApp::OnInit()
  113. {
  114.     static const wxCmdLineEntryDesc cmdLineDesc[] =
  115.     {
  116.         { wxCMD_LINE_SWITCH, _T("h"), _T("help"),    _T("give this usage message"),
  117.             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
  118.         { wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be more verbose") },
  119.         { wxCMD_LINE_SWITCH, _T("q"), _T("quiet"),   _T("be quiet") },
  120.  
  121.         { wxCMD_LINE_OPTION, _T("i"), _T("input"),   _T("directory with template files") },
  122.  
  123.         { wxCMD_LINE_PARAM,  NULL, NULL,     _T("output_directory") },
  124.  
  125.         { wxCMD_LINE_NONE }
  126.     };
  127.  
  128.     wxCmdLineParser parser(cmdLineDesc, argc, argv);
  129.     parser.SetLogo(_T("MakeGen: a makefile generator for wxWindows\n"
  130.                       "Copyright (c) 2000 Vadim Zeitlin"));
  131.  
  132.     if ( parser.Parse() != 0 )
  133.     {
  134.         // failed to parse the cmd line or help was requested (and given)
  135.         return FALSE;
  136.     }
  137.  
  138.     (void)parser.Found(_T("i"), &m_dirname);
  139.     if ( parser.Found(_T("q")) )
  140.     {
  141.         m_quiet = TRUE;
  142.  
  143.         wxLog::GetActiveTarget()->SetVerbose(FALSE);
  144.     }
  145.     else if ( parser.Found(_T("v")) )
  146.     {
  147.         wxLog::GetActiveTarget()->SetVerbose();
  148.     }
  149.  
  150.     m_outdir = parser.GetParam();
  151.  
  152. #ifdef __WINDOWS__
  153.     m_outdir.Replace(_T("\\"), _T("/"));
  154. #endif
  155.  
  156.     if ( !!m_outdir && m_outdir.Last() == _T('/') )
  157.     {
  158.         m_outdir.Truncate(m_outdir.length() - 1);
  159.     }
  160.  
  161.     m_progname = m_outdir.AfterLast(_T('/'));
  162.  
  163.     if ( !m_progname )
  164.     {
  165.         wxLogError(_T("Output directory should be specified."));
  166.  
  167.         parser.Usage();
  168.  
  169.         return FALSE;
  170.     }
  171.  
  172.     return TRUE;
  173. }
  174.  
  175. int MakeGenApp::OnRun()
  176. {
  177.     if ( !m_dirname )
  178.     {
  179.         m_dirname = wxGetenv(_T("MAKEGEN_PATH"));
  180.         if ( !m_dirname )
  181.         {
  182.             m_dirname = wxGetCwd();
  183.         }
  184.     }
  185.  
  186.     if ( !wxEndsWithPathSeparator(m_dirname) )
  187.     {
  188.         m_dirname += _T('/');
  189.     }
  190.  
  191.     m_dirname += _T("templates");
  192.  
  193.     wxDir dir(m_dirname);
  194.  
  195.     m_dirname += _T('/');
  196.  
  197.     if ( !dir.IsOpened() )
  198.     {
  199.         wxLogError(_T("Aborting generating the makefiles."));
  200.  
  201.         return 1;
  202.     }
  203.  
  204.     wxString filename;
  205.     size_t n = 0;
  206.     bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES);
  207.     while ( cont )
  208.     {
  209.         n++;
  210.  
  211.         if ( !GenerateMakefile(filename) )
  212.         {
  213.             wxLogError(_T("Error during makefile generation, aborting."));
  214.  
  215.             return 2;
  216.         }
  217.  
  218.         cont = dir.GetNext(&filename);
  219.     }
  220.  
  221.     if ( n )
  222.     {
  223.         wxLogVerbose(_T("Successfully generated %u makefiles in '%s'."),
  224.                      n, m_outdir.c_str());
  225.     }
  226.     else if ( !m_quiet )
  227.     {
  228.         wxLogWarning(_T("No makefiles found: either set MAKEGEN_PATH variable "
  229.                         "or run the program from its directory"));
  230.     }
  231.  
  232.     return 0;
  233. }
  234.