]> git.saurik.com Git - wxWidgets.git/blob - utils/makegen/makegen.cpp
No change
[wxWidgets.git] / utils / makegen / makegen.cpp
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$
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 }