]>
Commit | Line | Data |
---|---|---|
6809ee4b VZ |
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 | ||
e612f101 VZ |
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 | ||
6809ee4b VZ |
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> | |
e612f101 | 39 | #include <wx/cmdline.h> |
6809ee4b VZ |
40 | |
41 | // ---------------------------------------------------------------------------- | |
42 | // the application class | |
43 | // ---------------------------------------------------------------------------- | |
44 | ||
45 | class MakeGenApp : public wxApp | |
46 | { | |
47 | public: | |
e612f101 VZ |
48 | MakeGenApp() { m_quiet = FALSE; } |
49 | ||
6809ee4b VZ |
50 | virtual bool OnInit(); |
51 | ||
52 | virtual int OnRun(); | |
53 | ||
54 | private: | |
6809ee4b VZ |
55 | bool GenerateMakefile(const wxString& filename); |
56 | ||
e612f101 | 57 | wxString m_progname, // the name of the sample |
6809ee4b | 58 | m_dirname, // directory with the template files |
e612f101 VZ |
59 | m_outdir; // directory to output files to |
60 | ||
61 | bool m_quiet; // don't give non essential messages | |
6809ee4b VZ |
62 | }; |
63 | ||
64 | IMPLEMENT_APP(MakeGenApp); | |
65 | ||
66 | // ============================================================================ | |
67 | // implementation | |
68 | // ============================================================================ | |
69 | ||
70 | // ---------------------------------------------------------------------------- | |
71 | // MakeGenApp | |
72 | // ---------------------------------------------------------------------------- | |
73 | ||
6809ee4b VZ |
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 | ||
e612f101 | 84 | wxFFile fileOut(m_outdir + filename, "w"); |
6809ee4b VZ |
85 | if ( !fileOut.IsOpened() ) |
86 | { | |
87 | wxLogError(_T("Makefile '%s' couldn't be generated."), filename.c_str()); | |
88 | ||
89 | return FALSE; | |
90 | } | |
91 | ||
e612f101 VZ |
92 | wxLogVerbose(_T("Generating '%s' for '%s'..."), |
93 | (m_outdir + filename).c_str(), m_progname.c_str()); | |
94 | ||
6809ee4b VZ |
95 | size_t count = fileIn.GetLineCount(); |
96 | for ( size_t n = 0; n < count; n++ ) | |
97 | { | |
98 | wxString line = fileIn[n]; | |
99 | ||
100 | line.Replace(_T("#DATE"), wxDateTime::Now().FormatISODate()); | |
e612f101 | 101 | line.Replace(_T("#NAME"), m_progname); |
6809ee4b VZ |
102 | |
103 | fileOut.Write(line + _T('\n')); | |
104 | } | |
105 | ||
106 | return TRUE; | |
107 | } | |
108 | ||
e612f101 | 109 | // parse the cmd line |
6809ee4b VZ |
110 | bool MakeGenApp::OnInit() |
111 | { | |
e612f101 | 112 | static const wxCmdLineEntryDesc cmdLineDesc[] = |
6809ee4b | 113 | { |
e612f101 VZ |
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") }, | |
6809ee4b | 118 | |
e612f101 VZ |
119 | { wxCMD_LINE_OPTION, _T("i"), _T("input"), _T("directory with template files") }, |
120 | ||
121 | { wxCMD_LINE_PARAM, NULL, NULL, _T("output_directory") }, | |
122 | ||
123 | { wxCMD_LINE_NONE } | |
124 | }; | |
125 | ||
126 | wxCmdLineParser parser(cmdLineDesc, argc, argv); | |
127 | parser.SetLogo(_T("MakeGen: a makefile generator for wxWindows\n" | |
128 | "Copyright (c) 2000 Vadim Zeitlin")); | |
129 | ||
130 | if ( parser.Parse() != 0 ) | |
131 | { | |
132 | // failed to parse the cmd line or help was requested (and given) | |
6809ee4b VZ |
133 | return FALSE; |
134 | } | |
135 | ||
e612f101 VZ |
136 | (void)parser.Found(_T("i"), &m_dirname); |
137 | if ( parser.Found(_T("q")) ) | |
6809ee4b | 138 | { |
e612f101 VZ |
139 | m_quiet = TRUE; |
140 | ||
141 | wxLog::GetActiveTarget()->SetVerbose(FALSE); | |
142 | } | |
143 | else if ( parser.Found(_T("v")) ) | |
144 | { | |
145 | wxLog::GetActiveTarget()->SetVerbose(); | |
146 | } | |
147 | ||
148 | m_outdir = parser.GetParam(); | |
149 | ||
150 | #ifdef __WINDOWS__ | |
151 | m_outdir.Replace(_T("\\"), _T("/")); | |
152 | #endif | |
153 | ||
154 | if ( !!m_outdir && m_outdir.Last() == _T('/') ) | |
155 | { | |
156 | m_outdir.Truncate(m_outdir.length() - 1); | |
157 | } | |
158 | ||
159 | m_progname = m_outdir.AfterLast(_T('/')); | |
160 | ||
161 | if ( !m_progname ) | |
162 | { | |
163 | wxLogError(_T("Output directory should be specified.")); | |
6809ee4b | 164 | |
e612f101 VZ |
165 | parser.Usage(); |
166 | ||
167 | return FALSE; | |
6809ee4b VZ |
168 | } |
169 | ||
170 | return TRUE; | |
171 | } | |
172 | ||
173 | int MakeGenApp::OnRun() | |
174 | { | |
6809ee4b VZ |
175 | if ( !m_dirname ) |
176 | { | |
e612f101 VZ |
177 | m_dirname = wxGetenv(_T("MAKEGEN_PATH")); |
178 | if ( !m_dirname ) | |
179 | { | |
180 | m_dirname = wxGetCwd(); | |
181 | } | |
6809ee4b VZ |
182 | } |
183 | ||
184 | if ( !wxEndsWithPathSeparator(m_dirname) ) | |
185 | { | |
186 | m_dirname += _T('/'); | |
187 | } | |
188 | ||
189 | m_dirname += _T("templates"); | |
190 | ||
191 | wxDir dir(m_dirname); | |
192 | ||
193 | m_dirname += _T('/'); | |
194 | ||
195 | if ( !dir.IsOpened() ) | |
196 | { | |
197 | wxLogError(_T("Aborting generating the makefiles.")); | |
198 | ||
199 | return 1; | |
200 | } | |
201 | ||
202 | wxString filename; | |
203 | size_t n = 0; | |
e612f101 | 204 | bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES); |
6809ee4b VZ |
205 | while ( cont ) |
206 | { | |
207 | n++; | |
208 | ||
209 | if ( !GenerateMakefile(filename) ) | |
210 | { | |
211 | wxLogError(_T("Error during makefile generation, aborting.")); | |
212 | ||
213 | return 2; | |
214 | } | |
215 | ||
216 | cont = dir.GetNext(&filename); | |
217 | } | |
218 | ||
219 | if ( n ) | |
220 | { | |
221 | wxLogVerbose(_T("Successfully generated %u makefiles in '%s'."), | |
e612f101 | 222 | n, m_outdir.c_str()); |
6809ee4b | 223 | } |
e612f101 | 224 | else if ( !m_quiet ) |
6809ee4b VZ |
225 | { |
226 | wxLogWarning(_T("No makefiles found: either set MAKEGEN_PATH variable " | |
227 | "or run the program from its directory")); | |
228 | } | |
229 | ||
230 | return 0; | |
231 | } |