1 /////////////////////////////////////////////////////////////////////////////
2 // Name: utils/makegen/makegen.cpp
3 // Purpose: a tool to generate the makefiles for samples
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
15 * 1. support for programs with multiple object files
16 * 2. support for programs under utils and demos, not only samples
19 // ============================================================================
21 // ============================================================================
24 #error "This is a console mode program and must be linked with wxBase."
27 // ----------------------------------------------------------------------------
29 // ----------------------------------------------------------------------------
31 #include <wx/string.h>
37 #include <wx/textfile.h>
38 #include <wx/datetime.h>
39 #include <wx/cmdline.h>
41 // ----------------------------------------------------------------------------
42 // the application class
43 // ----------------------------------------------------------------------------
45 class MakeGenApp
: public wxApp
48 MakeGenApp() { m_quiet
= FALSE
; }
50 virtual bool OnInit();
55 bool GenerateMakefile(const wxString
& filename
);
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
61 bool m_quiet
; // don't give non essential messages
64 IMPLEMENT_APP(MakeGenApp
);
66 // ============================================================================
68 // ============================================================================
70 // ----------------------------------------------------------------------------
72 // ----------------------------------------------------------------------------
74 bool MakeGenApp::GenerateMakefile(const wxString
& filename
)
76 wxTextFile
fileIn(m_dirname
+ filename
);
79 wxLogError(_T("Makefile '%s' couldn't be generated."), filename
.c_str());
84 wxFFile
fileOut(m_outdir
+ filename
, "w");
85 if ( !fileOut
.IsOpened() )
87 wxLogError(_T("Makefile '%s' couldn't be generated."), filename
.c_str());
92 wxLogVerbose(_T("Generating '%s' for '%s'..."),
93 (m_outdir
+ filename
).c_str(), m_progname
.c_str());
95 size_t count
= fileIn
.GetLineCount();
96 for ( size_t n
= 0; n
< count
; n
++ )
98 wxString line
= fileIn
[n
];
100 line
.Replace(_T("#DATE"), wxDateTime::Now().FormatISODate());
101 line
.Replace(_T("#NAME"), m_progname
);
103 fileOut
.Write(line
+ _T('\n'));
109 // parse the cmd line
110 bool MakeGenApp::OnInit()
112 static const wxCmdLineEntryDesc cmdLineDesc
[] =
114 { wxCMD_LINE_SWITCH
, _T("h"), _T("help"), _T("give this usage message"),
115 wxCMD_LINE_VAL_NONE
, wxCMD_LINE_OPTION_HELP
},
116 { wxCMD_LINE_SWITCH
, _T("v"), _T("verbose"), _T("be more verbose") },
117 { wxCMD_LINE_SWITCH
, _T("q"), _T("quiet"), _T("be quiet") },
119 { wxCMD_LINE_OPTION
, _T("i"), _T("input"), _T("directory with template files") },
121 { wxCMD_LINE_PARAM
, NULL
, NULL
, _T("output_directory") },
126 wxCmdLineParser
parser(cmdLineDesc
, argc
, argv
);
127 parser
.SetLogo(_T("MakeGen: a makefile generator for wxWindows\n"
128 "Copyright (c) 2000 Vadim Zeitlin"));
130 if ( parser
.Parse() != 0 )
132 // failed to parse the cmd line or help was requested (and given)
136 (void)parser
.Found(_T("i"), &m_dirname
);
137 if ( parser
.Found(_T("q")) )
141 wxLog::GetActiveTarget()->SetVerbose(FALSE
);
143 else if ( parser
.Found(_T("v")) )
145 wxLog::GetActiveTarget()->SetVerbose();
148 m_outdir
= parser
.GetParam();
151 m_outdir
.Replace(_T("\\"), _T("/"));
154 if ( !!m_outdir
&& m_outdir
.Last() == _T('/') )
156 m_outdir
.Truncate(m_outdir
.length() - 1);
159 m_progname
= m_outdir
.AfterLast(_T('/'));
163 wxLogError(_T("Output directory should be specified."));
173 int MakeGenApp::OnRun()
177 m_dirname
= wxGetenv(_T("MAKEGEN_PATH"));
180 m_dirname
= wxGetCwd();
184 if ( !wxEndsWithPathSeparator(m_dirname
) )
186 m_dirname
+= _T('/');
189 m_dirname
+= _T("templates");
191 wxDir
dir(m_dirname
);
193 m_dirname
+= _T('/');
195 if ( !dir
.IsOpened() )
197 wxLogError(_T("Aborting generating the makefiles."));
204 bool cont
= dir
.GetFirst(&filename
, wxEmptyString
, wxDIR_FILES
);
209 if ( !GenerateMakefile(filename
) )
211 wxLogError(_T("Error during makefile generation, aborting."));
216 cont
= dir
.GetNext(&filename
);
221 wxLogVerbose(_T("Successfully generated %u makefiles in '%s'."),
222 n
, m_outdir
.c_str());
226 wxLogWarning(_T("No makefiles found: either set MAKEGEN_PATH variable "
227 "or run the program from its directory"));