17 #include "exception.h"
21 #define EXEPOSTFIX ".exe"
48 class AutomaticDependency
;
55 XMLElement
*node
, *head
;
59 std::vector
<Module
*> modules
;
60 std::vector
<Include
*> includes
;
61 std::vector
<Define
*> defines
;
62 std::vector
<LinkerFlag
*> linkerFlags
;
63 std::vector
<Property
*> properties
;
67 Project ( const std::string
& filename
);
69 void ProcessXML ( const std::string
& path
);
70 Module
* LocateModule ( const std::string
& name
);
71 const Module
* LocateModule ( const std::string
& name
) const;
74 void ProcessXMLSubElement ( const XMLElement
& e
,
75 const std::string
& path
,
78 // disable copy semantics
79 Project ( const Project
& );
80 Project
& operator = ( const Project
& );
104 const Project
& project
;
105 const XMLElement
& node
;
107 std::string extension
;
108 std::string entrypoint
;
111 ImportLibrary
* importLibrary
;
113 std::vector
<File
*> files
;
114 std::vector
<Library
*> libraries
;
115 std::vector
<Include
*> includes
;
116 std::vector
<Define
*> defines
;
117 std::vector
<Invoke
*> invocations
;
118 std::vector
<Dependency
*> dependencies
;
119 std::vector
<If
*> ifs
;
120 std::vector
<CompilerFlag
*> compilerFlags
;
121 std::vector
<LinkerFlag
*> linkerFlags
;
123 Module ( const Project
& project
,
124 const XMLElement
& moduleNode
,
125 const std::string
& modulePath
);
127 ModuleType
GetModuleType ( const std::string
& location
,
128 const XMLAttribute
& attribute
);
129 bool HasImportLibrary () const;
130 std::string
GetTargetName () const;
131 std::string
GetDependencyPath () const;
132 std::string
GetBasePath () const;
133 std::string
GetPath () const;
134 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
135 std::string
GetTargets () const;
136 std::string
GetInvocationTarget ( const int index
) const;
137 bool HasFileWithExtensions ( const std::string
& extension1
,
138 const std::string
& extension2
) const;
141 std::string
GetDefaultModuleExtension () const;
142 std::string
GetDefaultModuleEntrypoint () const;
143 void ProcessXMLSubElement ( const XMLElement
& e
,
144 const std::string
& path
,
152 const Project
& project
;
153 const Module
* module
;
154 const XMLElement
& node
;
155 std::string directory
;
156 std::string basePath
;
158 Include ( const Project
& project
,
159 const XMLElement
& includeNode
);
160 Include ( const Project
& project
,
161 const Module
* module
,
162 const XMLElement
& includeNode
);
173 const Project
& project
;
174 const Module
* module
;
175 const XMLElement
& node
;
179 Define ( const Project
& project
,
180 const XMLElement
& defineNode
);
181 Define ( const Project
& project
,
182 const Module
* module
,
183 const XMLElement
& defineNode
);
197 File ( const std::string
& _name
, bool _first
);
206 const XMLElement
& node
;
207 const Module
& module
;
210 Library ( const XMLElement
& _node
,
211 const Module
& _module
,
212 const std::string
& _name
);
221 const XMLElement
& node
;
222 const Module
& module
;
223 const Module
* invokeModule
;
224 std::vector
<InvokeFile
*> input
;
225 std::vector
<InvokeFile
*> output
;
227 Invoke ( const XMLElement
& _node
,
228 const Module
& _module
);
231 std::string
GetTargets () const;
233 void ProcessXMLSubElement ( const XMLElement
& e
);
234 void ProcessXMLSubElementInput ( const XMLElement
& e
);
235 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
242 const XMLElement
& node
;
244 std::string switches
;
246 InvokeFile ( const XMLElement
& _node
,
247 const std::string
& _name
);
256 const XMLElement
& node
;
257 const Module
& module
;
258 const Module
* dependencyModule
;
260 Dependency ( const XMLElement
& _node
,
261 const Module
& _module
);
270 const XMLElement
& node
;
271 const Module
& module
;
272 std::string basename
;
273 std::string definition
;
275 ImportLibrary ( const XMLElement
& _node
,
276 const Module
& module
);
285 const XMLElement
& node
;
286 const Project
& project
;
287 const Module
* module
;
288 std::string property
, value
;
289 std::vector
<File
*> files
;
290 std::vector
<Include
*> includes
;
291 std::vector
<Define
*> defines
;
292 std::vector
<Property
*> properties
;
293 std::vector
<If
*> ifs
;
295 If ( const XMLElement
& node_
,
296 const Project
& project_
,
297 const Module
* module_
);
307 const Project
& project
;
308 const Module
* module
;
309 const XMLElement
& node
;
312 CompilerFlag ( const Project
& project
,
313 const XMLElement
& compilerFlagNode
);
314 CompilerFlag ( const Project
& project
,
315 const Module
* module
,
316 const XMLElement
& compilerFlagNode
);
327 const Project
& project
;
328 const Module
* module
;
329 const XMLElement
& node
;
332 LinkerFlag ( const Project
& project
,
333 const XMLElement
& linkerFlagNode
);
334 LinkerFlag ( const Project
& project
,
335 const Module
* module
,
336 const XMLElement
& linkerFlagNode
);
347 const XMLElement
& node
;
348 const Project
& project
;
349 const Module
* module
;
350 std::string name
, value
;
352 Property ( const XMLElement
& node_
,
353 const Project
& project_
,
354 const Module
* module_
);
363 SourceFile ( AutomaticDependency
* automaticDependency
,
365 const std::string
& filename
,
367 bool isNonAutomaticDependency
);
368 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
370 std::string
Location () const;
371 std::vector
<SourceFile
*> files
;
372 AutomaticDependency
* automaticDependency
;
374 std::string filename
;
375 std::string filenamePart
;
376 std::string directoryPart
;
377 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
378 bool isNonAutomaticDependency
;
379 std::string cachedDependencies
;
380 time_t lastWriteTime
;
381 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
382 SourceFile
* youngestFile
;
384 void GetDirectoryAndFilenameParts ();
387 void SkipWhitespace ();
388 bool ReadInclude ( std::string
& filename
);
389 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
390 SourceFile
* GetParentSourceFile ();
391 bool IsParentOf ( const SourceFile
* parent
,
392 const SourceFile
* child
);
399 class AutomaticDependency
401 friend class SourceFileTest
;
403 const Project
& project
;
405 AutomaticDependency ( const Project
& project
);
406 ~AutomaticDependency ();
408 bool LocateIncludedFile ( const std::string
& directory
,
409 const std::string
& includedFilename
,
410 std::string
& resolvedFilename
);
411 bool LocateIncludedFile ( Module
& module
,
412 const std::string
& includedFilename
,
413 std::string
& resolvedFilename
);
414 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
415 const std::string
& filename
,
416 SourceFile
* parentSourceFile
);
417 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
418 void CheckAutomaticDependencies ();
419 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
421 void ProcessModule ( Module
& module
);
422 void ProcessFile ( Module
& module
,
424 std::map
<std::string
, SourceFile
*> sourcefile_map
;
429 FixSeparator ( const std::string
& s
);
432 GetExtension ( const std::string
& filename
);
435 NormalizeFilename ( const std::string
& filename
);
437 #endif /* __RBUILD_H */