git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5841 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			234 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			234 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        utils/makegen/makegen.cpp
 | |
| // Purpose:     a tool to generate the makefiles for samples
 | |
| // Author:      Vadim Zeitlin
 | |
| // Modified by:
 | |
| // Created:     03.01.00
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
 | |
| // Licence:     wxWindows license
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| /*
 | |
|  * TODO
 | |
|  *
 | |
|  *  1. support for programs with multiple object files
 | |
|  *  2. support for programs under utils and demos, not only samples
 | |
|  */
 | |
| 
 | |
| // ============================================================================
 | |
| // declarations
 | |
| // ============================================================================
 | |
| 
 | |
| #if wxUSE_GUI
 | |
|     #error "This is a console mode program and must be linked with wxBase."
 | |
| #endif
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // headers
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| #include <wx/string.h>
 | |
| #include <wx/file.h>
 | |
| #include <wx/ffile.h>
 | |
| #include <wx/app.h>
 | |
| #include <wx/log.h>
 | |
| #include <wx/dir.h>
 | |
| #include <wx/textfile.h>
 | |
| #include <wx/datetime.h>
 | |
| #include <wx/cmdline.h>
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // the application class
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| class MakeGenApp : public wxApp
 | |
| {
 | |
| public:
 | |
|     MakeGenApp() { m_quiet = FALSE; }
 | |
| 
 | |
|     virtual bool OnInit();
 | |
| 
 | |
|     virtual int OnRun();
 | |
| 
 | |
| private:
 | |
|     bool GenerateMakefile(const wxString& filename);
 | |
| 
 | |
|     wxString m_progname,        // the name of the sample
 | |
|              m_dirname,         // directory with the template files
 | |
|              m_outdir;          // directory to output files to
 | |
| 
 | |
|     bool m_quiet;               // don't give non essential messages
 | |
| };
 | |
| 
 | |
| IMPLEMENT_APP(MakeGenApp);
 | |
| 
 | |
| // ============================================================================
 | |
| // implementation
 | |
| // ============================================================================
 | |
| 
 | |
| // ----------------------------------------------------------------------------
 | |
| // MakeGenApp
 | |
| // ----------------------------------------------------------------------------
 | |
| 
 | |
| bool MakeGenApp::GenerateMakefile(const wxString& filename)
 | |
| {
 | |
|     wxTextFile fileIn(m_dirname + filename);
 | |
|     if ( !fileIn.Open() )
 | |
|     {
 | |
|         wxLogError(_T("Makefile '%s' couldn't be generated."), filename.c_str());
 | |
| 
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     wxString fileOutName;
 | |
|     fileOutName << m_outdir << _T('/') << filename;
 | |
|     wxFFile fileOut(fileOutName, "w");
 | |
|     if ( !fileOut.IsOpened() )
 | |
|     {
 | |
|         wxLogError(_T("Makefile '%s' couldn't be generated."), filename.c_str());
 | |
| 
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     wxLogVerbose(_T("Generating '%s' for '%s'..."),
 | |
|                  fileOutName.c_str(), m_progname.c_str());
 | |
| 
 | |
|     size_t count = fileIn.GetLineCount();
 | |
|     for ( size_t n = 0; n < count; n++ )
 | |
|     {
 | |
|         wxString line = fileIn[n];
 | |
| 
 | |
|         line.Replace(_T("#DATE"), wxDateTime::Now().FormatISODate());
 | |
|         line.Replace(_T("#NAME"), m_progname);
 | |
| 
 | |
|         fileOut.Write(line + _T('\n'));
 | |
|     }
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| // parse the cmd line
 | |
| bool MakeGenApp::OnInit()
 | |
| {
 | |
|     static const wxCmdLineEntryDesc cmdLineDesc[] =
 | |
|     {
 | |
|         { wxCMD_LINE_SWITCH, _T("h"), _T("help"),    _T("give this usage message"),
 | |
|             wxCMD_LINE_VAL_NONE, wxCMD_LINE_OPTION_HELP },
 | |
|         { wxCMD_LINE_SWITCH, _T("v"), _T("verbose"), _T("be more verbose") },
 | |
|         { wxCMD_LINE_SWITCH, _T("q"), _T("quiet"),   _T("be quiet") },
 | |
| 
 | |
|         { wxCMD_LINE_OPTION, _T("i"), _T("input"),   _T("directory with template files") },
 | |
| 
 | |
|         { wxCMD_LINE_PARAM,  NULL, NULL,     _T("output_directory") },
 | |
| 
 | |
|         { wxCMD_LINE_NONE }
 | |
|     };
 | |
| 
 | |
|     wxCmdLineParser parser(cmdLineDesc, argc, argv);
 | |
|     parser.SetLogo(_T("MakeGen: a makefile generator for wxWindows\n"
 | |
|                       "Copyright (c) 2000 Vadim Zeitlin"));
 | |
| 
 | |
|     if ( parser.Parse() != 0 )
 | |
|     {
 | |
|         // failed to parse the cmd line or help was requested (and given)
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     (void)parser.Found(_T("i"), &m_dirname);
 | |
|     if ( parser.Found(_T("q")) )
 | |
|     {
 | |
|         m_quiet = TRUE;
 | |
| 
 | |
|         wxLog::GetActiveTarget()->SetVerbose(FALSE);
 | |
|     }
 | |
|     else if ( parser.Found(_T("v")) )
 | |
|     {
 | |
|         wxLog::GetActiveTarget()->SetVerbose();
 | |
|     }
 | |
| 
 | |
|     m_outdir = parser.GetParam();
 | |
| 
 | |
| #ifdef __WINDOWS__
 | |
|     m_outdir.Replace(_T("\\"), _T("/"));
 | |
| #endif
 | |
| 
 | |
|     if ( !!m_outdir && m_outdir.Last() == _T('/') )
 | |
|     {
 | |
|         m_outdir.Truncate(m_outdir.length() - 1);
 | |
|     }
 | |
| 
 | |
|     m_progname = m_outdir.AfterLast(_T('/'));
 | |
| 
 | |
|     if ( !m_progname )
 | |
|     {
 | |
|         wxLogError(_T("Output directory should be specified."));
 | |
| 
 | |
|         parser.Usage();
 | |
| 
 | |
|         return FALSE;
 | |
|     }
 | |
| 
 | |
|     return TRUE;
 | |
| }
 | |
| 
 | |
| int MakeGenApp::OnRun()
 | |
| {
 | |
|     if ( !m_dirname )
 | |
|     {
 | |
|         m_dirname = wxGetenv(_T("MAKEGEN_PATH"));
 | |
|         if ( !m_dirname )
 | |
|         {
 | |
|             m_dirname = wxGetCwd();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if ( !wxEndsWithPathSeparator(m_dirname) )
 | |
|     {
 | |
|         m_dirname += _T('/');
 | |
|     }
 | |
| 
 | |
|     m_dirname += _T("templates");
 | |
| 
 | |
|     wxDir dir(m_dirname);
 | |
| 
 | |
|     m_dirname += _T('/');
 | |
| 
 | |
|     if ( !dir.IsOpened() )
 | |
|     {
 | |
|         wxLogError(_T("Aborting generating the makefiles."));
 | |
| 
 | |
|         return 1;
 | |
|     }
 | |
| 
 | |
|     wxString filename;
 | |
|     size_t n = 0;
 | |
|     bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES);
 | |
|     while ( cont )
 | |
|     {
 | |
|         n++;
 | |
| 
 | |
|         if ( !GenerateMakefile(filename) )
 | |
|         {
 | |
|             wxLogError(_T("Error during makefile generation, aborting."));
 | |
| 
 | |
|             return 2;
 | |
|         }
 | |
| 
 | |
|         cont = dir.GetNext(&filename);
 | |
|     }
 | |
| 
 | |
|     if ( n )
 | |
|     {
 | |
|         wxLogVerbose(_T("Successfully generated %u makefiles in '%s'."),
 | |
|                      n, m_outdir.c_str());
 | |
|     }
 | |
|     else if ( !m_quiet )
 | |
|     {
 | |
|         wxLogWarning(_T("No makefiles found: either set MAKEGEN_PATH variable "
 | |
|                         "or run the program from its directory"));
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 |