]>
Commit | Line | Data |
---|---|---|
1 | ///////////////////////////////////////////////////////////////////////////// | |
2 | // Name: projgen.h | |
3 | // Purpose: Project generator classes. | |
4 | // Author: Julian Smart | |
5 | // Modified by: | |
6 | // Created: 04/12/98 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) Julian Smart | |
9 | // Licence: wxWindows licence | |
10 | ///////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | /* | |
13 | ||
14 | Description | |
15 | ----------- | |
16 | ||
17 | The top-level object is wxProjectDatabase, which maintains a list of wxProjectGenerator | |
18 | objects. Each wxProjectGenerator object contains a list of wxGeneratorConfiguration objects, | |
19 | and each of these in turn stores a list of variants which represent compiler-specific options in that | |
20 | configuration. wxProjectDatabase also stores a list of generic options (again variants), | |
21 | which may cause compiler-specific options to be stored in configurations. | |
22 | ||
23 | The usage is like this. The IDE (or other calling application) adds a number of project generators | |
24 | at initialization, one for each kind of compiler. For a new project, the app should call InitializeGenerators | |
25 | in order to call OnInitializeDefaults for each generator, which will call back into the wxProjectDatabase | |
26 | to get user-settable defaults. | |
27 | ||
28 | The app can then set generic options. When a generic option (such as 'use debug info') | |
29 | is set for a particular configuration, all generator objects are notified via OnSetGenericOption and they | |
30 | translate the generic option into a specific one (for that configuration). | |
31 | ||
32 | The wxProjectDatabase object can also be used to set compiler-specific options directly if required, | |
33 | but normally this would not be required. Each wxProjectGenerator should also have the opportunity | |
34 | to set initial defaults. These defaults should be editable by the user. | |
35 | ||
36 | Each wxProjectGenerator can access the parent wxProjectDatabase object at any time, since it | |
37 | may need to make a judgement about several generic settings in order to know what specific | |
38 | compiler options should be set. | |
39 | ||
40 | TODO: make a list of generic compiler options that each generator should recognise. | |
41 | ||
42 | */ | |
43 | ||
44 | #ifndef _PROJGEN_H_ | |
45 | #define _PROJGEN_H_ | |
46 | ||
47 | #ifdef __GNUG__ | |
48 | #pragma interface "projgen.h" | |
49 | #endif | |
50 | ||
51 | #include "wx/defs.h" | |
52 | #include "wx/string.h" | |
53 | #include "wx/hash.h" | |
54 | #include "wx/variant.h" | |
55 | ||
56 | typedef enum { | |
57 | wxPROJECT_CAP_NONE = 0, | |
58 | wxPROJECT_CAP_MAKEFILE = 1, | |
59 | wxPROJECT_CAP_PROJECT = 2, | |
60 | } wxProjectCapability; | |
61 | ||
62 | class wxProjectGenerator; | |
63 | class wxGeneratorConfiguration; | |
64 | ||
65 | /* | |
66 | * wxProjectDatabase | |
67 | * This class maintains a list to all wxProjectGenerator objects, one for | |
68 | * each compiler. | |
69 | * Setting a generic option in wxProjectDatabase causes the individual wxProjectGenerator | |
70 | * objects to set their compiler-specific options for later generation. | |
71 | */ | |
72 | ||
73 | class wxProjectDatabase: public wxObject | |
74 | { | |
75 | DECLARE_CLASS(wxProjectDatabase) | |
76 | public: | |
77 | wxProjectDatabase(); | |
78 | ~wxProjectDatabase(); | |
79 | ||
80 | // Operations | |
81 | // Generate project or makefile for a named compiler. Give an optional compiler version. | |
82 | virtual bool GenerateProject(const wxString& compiler, const wxString& filename, bool isMakefile, int compilerVersion = 0); | |
83 | ||
84 | // This calls each wxProjectGenerator's OnInitializeDefaults function to fill out the | |
85 | // defaults for each configuration. The generators will probably call back into the wxProjectDatabase | |
86 | // to get the defaults from a file (see GetDefaultCompilerOptions below). | |
87 | virtual bool InitializeGenerators(); | |
88 | ||
89 | // Accessors | |
90 | // Get the capability: can it generate projects, or makefiles, or neither? | |
91 | virtual wxProjectCapability GetCapability(const wxString& compiler) const ; | |
92 | ||
93 | // Override this for your app so that when the wxProjectGenerator initializes its defaults, it | |
94 | // can call this to get specific option values that may be setup by the user. | |
95 | virtual wxVariant GetDefaultCompilerOption(const wxString& compiler, const wxString& config, const wxString& option) const ; | |
96 | ||
97 | // Gets all the default options for the named compiler/config. Likewise, override this to provide | |
98 | // a list of defaults to the calling wxProjectGenerator. | |
99 | virtual wxStringList GetDefaultCompilerOptionList(const wxString& compiler, const wxString& config) const ; | |
100 | ||
101 | // Compiler/configuration-specific options | |
102 | // Get a compiler-specific option value from the name. | |
103 | virtual wxVariant GetCompilerOption(const wxString& compiler, const wxString& config, const wxString& name) const; | |
104 | ||
105 | // Set the compiler-specific option | |
106 | virtual void SetCompilerOption(const wxString& compiler, const wxString& config, const wxString& name, const wxVariant& value); | |
107 | ||
108 | // Removes the compiler-specific option | |
109 | virtual void RemoveCompilerOption(const wxString& compiler, const wxString& config, const wxString& name); | |
110 | ||
111 | // Does this option exist? | |
112 | virtual bool HasCompilerOption(const wxString& compiler, const wxString& config, const wxString& name) const; | |
113 | ||
114 | // Generic options | |
115 | // Get a generic option value from the name. | |
116 | virtual wxVariant GetGenericOption(const wxString& config, const wxString& name) const; | |
117 | ||
118 | // Set the generic option value. This calls SetGenericOption for each wxProjectGenerator, | |
119 | // which will cause compiler-specific values to be placed in the relevant config | |
120 | virtual void SetGenericOption(const wxString& config, const wxString& name, const wxVariant& value); | |
121 | ||
122 | // Removes the generic option. | |
123 | virtual void RemoveGenericOption(const wxString& config, const wxString& name); | |
124 | ||
125 | // Does this option exist? | |
126 | virtual bool HasGenericOption(const wxString& config, const wxString& name) const; | |
127 | ||
128 | // Project path | |
129 | inline void SetProjectPath(const wxString& path) { m_projectPath = path; }; | |
130 | inline wxString GetProjectPath() const { return m_projectPath; }; | |
131 | ||
132 | // Project name | |
133 | inline void SetProjectName(const wxString& name) { m_projectName = name; }; | |
134 | inline wxString GetProjectName() const { return m_projectName; }; | |
135 | ||
136 | // The source files in the project | |
137 | // Add a file to the project. Normally this will be relative to the project path. | |
138 | // TODO: Files are managed within the wxProjectDatabase, but what about extra files | |
139 | // for specific platforms? Well, let's assume that even on Unix, you'd create a .rc | |
140 | // file, even if this isn't used in the resulting project/makefile on Unix. | |
141 | virtual void AddFile(const wxString& filename); | |
142 | virtual void RemoveFile(const wxString& filename); | |
143 | virtual bool FileExists(const wxString& filename) const; | |
144 | ||
145 | // TODO: management of include paths, library paths, libraries | |
146 | ||
147 | // Generator management | |
148 | virtual void AddGenerator(wxProjectGenerator* generator) ; | |
149 | virtual void RemoveGenerator(wxProjectGenerator* generator) ; // Doesn't delete it, just removes it | |
150 | virtual wxProjectGenerator* FindGenerator(const wxString& compiler) const ; | |
151 | virtual void ClearGenerators(); | |
152 | ||
153 | protected: | |
154 | // List of wxProjectGenerator objects | |
155 | wxList m_generators; | |
156 | ||
157 | // List of compiler-independent configurations, such as "debug". | |
158 | wxList m_genericConfigurations; | |
159 | ||
160 | // List of source files | |
161 | wxStringList m_sourceFiles; | |
162 | ||
163 | // List of library paths | |
164 | wxStringList m_libraryPaths; | |
165 | ||
166 | // List of libraries: TODO this should be compiler-specific, surely? | |
167 | wxStringList m_libraries; | |
168 | ||
169 | // List of include paths | |
170 | wxStringList m_includePaths; | |
171 | ||
172 | // Project path | |
173 | wxString m_projectPath; | |
174 | ||
175 | // Project name | |
176 | wxString m_projectName; | |
177 | }; | |
178 | ||
179 | /* | |
180 | * wxGeneratorConfiguration | |
181 | * A configuration, e.g. "debug", "release" | |
182 | */ | |
183 | ||
184 | class wxGeneratorConfiguration: public wxObject | |
185 | { | |
186 | DECLARE_CLASS(wxGeneratorConfiguration) | |
187 | public: | |
188 | wxGeneratorConfiguration(const wxString& name); | |
189 | ~wxGeneratorConfiguration(); | |
190 | ||
191 | // Does this option exist? | |
192 | virtual bool HasOption(const wxString& name) const; | |
193 | ||
194 | // Find option: returns NULL if there is no such option. | |
195 | wxVariant* FindOption(const wxString& name) const; | |
196 | ||
197 | // Get an option value | |
198 | virtual wxVariant GetOption(const wxString& name) const; | |
199 | ||
200 | // Set the option | |
201 | virtual void SetOption(const wxString& name, const wxVariant& value); | |
202 | ||
203 | // Remove the option | |
204 | virtual void RemoveOption(const wxString& name); | |
205 | ||
206 | // Does this option exist? | |
207 | virtual bool HasOption(const wxString& name) const; | |
208 | ||
209 | // Get the list of options | |
210 | inline const wxList& GetOptions() const { return m_options; } | |
211 | ||
212 | inline void SetName(const wxString& name) { m_name = name; } | |
213 | inline wxString GetName() const { return m_name; } | |
214 | ||
215 | protected: | |
216 | // Configuration name | |
217 | wxString m_name; | |
218 | ||
219 | // List of wxVariants | |
220 | wxList m_options; | |
221 | }; | |
222 | ||
223 | /* | |
224 | * wxProjectGenerator. | |
225 | * Only derived classes can be instantiated. | |
226 | */ | |
227 | ||
228 | class wxProjectGenerator: public wxObject | |
229 | { | |
230 | DECLARE_CLASS(wxProjectGenerator) | |
231 | public: | |
232 | wxProjectGenerator(const wxString& name, wxProjectDatabase* topLevel); | |
233 | ~wxProjectGenerator(); | |
234 | ||
235 | // Operations | |
236 | // Generate project or makefile. Give an optional compiler version. | |
237 | virtual bool GenerateProject(bool isMakefile, int compilerVersion = 0) = 0; | |
238 | ||
239 | // Called when the defaults should be initialized. | |
240 | // It would recognise e.g. the "Debug" configuration name and set specific defaults, possibly | |
241 | // reading them from a database to allow for tailoring. | |
242 | // It is likely to call wxProjectDatabase::GetDefaultCompilerOption. | |
243 | virtual bool OnInitializeDefaults(const wxString& config) = 0; | |
244 | ||
245 | // This is called by wxProjectDatabase::SetGenericOption, and it tells this object | |
246 | // to translate it to a specific option. Then this object will (probably) call SetOption. | |
247 | virtual bool OnSetGenericOption(const wxString& config, const wxString& name, const wxVariant& value) = 0; | |
248 | ||
249 | // Accessors | |
250 | // Get the capability: can it generate projects, or makefiles, or neither? | |
251 | virtual wxProjectCapability GetCapability() const = 0; | |
252 | ||
253 | // Name | |
254 | inline void SetName(const wxString& name) { m_name = name; } | |
255 | inline wxString GetName() const { return m_name; } | |
256 | ||
257 | // Top-level wxProjectDatabase object | |
258 | inline void SetTopLevel(wxProjectDatabase* topLevel) { m_topLevel = topLevel; } | |
259 | inline wxProjectDatabase* GetTopLevel() const { return m_topLevel; } | |
260 | ||
261 | // Options | |
262 | // Get an option value | |
263 | virtual wxVariant GetOption(const wxString& config, const wxString& name) const; | |
264 | ||
265 | // Set the option | |
266 | virtual void SetOption(const wxString& config, const wxString& name, const wxVariant& value); | |
267 | ||
268 | // Remove the option | |
269 | virtual void RemoveOption(const wxString& config, const wxString& name); | |
270 | ||
271 | // Does this option exist? | |
272 | virtual bool HasOption(const wxString& name) const; | |
273 | ||
274 | // Get the list of options | |
275 | inline const wxList& GetConfigurations() const { return m_configs; } | |
276 | ||
277 | // Configuration management | |
278 | wxGeneratorConfiguation* FindConfiguration(const wxString& config) const ; | |
279 | void AddConfiguration(wxGeneratorConfiguration* config) ; | |
280 | void RemoveConfiguration(wxGeneratorConfiguration* config) ; | |
281 | void ClearConfigurations() ; | |
282 | ||
283 | protected: | |
284 | // List of wxGeneratorConfiguration objects | |
285 | wxList m_configs; | |
286 | ||
287 | // Compiler name | |
288 | wxString m_name; | |
289 | ||
290 | // Top-level object | |
291 | wxProjectDatabase* m_topLevel; | |
292 | }; | |
293 | ||
294 | #endif | |
295 | // projgen.h | |
296 |