13 #include <sys/utime.h>
20 #include "exception.h"
25 #define EXEPOSTFIX ".exe"
31 #define EXEPREFIX "./"
53 class AutomaticDependency
;
62 XMLElement
*node
, *head
;
66 std::vector
<Module
*> modules
;
67 std::vector
<Include
*> includes
;
68 std::vector
<Define
*> defines
;
69 std::vector
<LinkerFlag
*> linkerFlags
;
70 std::vector
<Property
*> properties
;
72 std::vector
<CDFile
*> cdfiles
;
74 Project ( const std::string
& filename
);
76 void WriteConfigurationFile ();
77 void ExecuteInvocations ();
78 void ProcessXML ( const std::string
& path
);
79 Module
* LocateModule ( const std::string
& name
);
80 const Module
* LocateModule ( const std::string
& name
) const;
82 const Property
* LookupProperty ( const std::string
& name
) const;
83 void SetConfigurationOption ( char* s
,
85 std::string
* alternativeName
);
86 void SetConfigurationOption ( char* s
,
88 void WriteIfChanged ( char* outbuf
,
89 std::string filename
);
91 void ProcessXMLSubElement ( const XMLElement
& e
,
92 const std::string
& path
,
95 // disable copy semantics
96 Project ( const Project
& );
97 Project
& operator = ( const Project
& );
123 const Project
& project
;
124 const XMLElement
& node
;
126 std::string extension
;
127 std::string entrypoint
;
128 std::string baseaddress
;
131 ImportLibrary
* importLibrary
;
133 Bootstrap
* bootstrap
;
134 std::vector
<File
*> files
;
135 std::vector
<Library
*> libraries
;
136 std::vector
<Include
*> includes
;
137 std::vector
<Define
*> defines
;
138 std::vector
<Invoke
*> invocations
;
139 std::vector
<Dependency
*> dependencies
;
140 std::vector
<If
*> ifs
;
141 std::vector
<CompilerFlag
*> compilerFlags
;
142 std::vector
<LinkerFlag
*> linkerFlags
;
144 Module ( const Project
& project
,
145 const XMLElement
& moduleNode
,
146 const std::string
& modulePath
);
148 ModuleType
GetModuleType ( const std::string
& location
,
149 const XMLAttribute
& attribute
);
150 bool HasImportLibrary () const;
151 std::string
GetTargetName () const;
152 std::string
GetDependencyPath () const;
153 std::string
GetBasePath () const;
154 std::string
GetPath () const;
155 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
156 std::string
GetTargets () const;
157 std::string
GetInvocationTarget ( const int index
) const;
158 bool HasFileWithExtensions ( const std::string
& extension1
,
159 const std::string
& extension2
) const;
160 void InvokeModule () const;
163 std::string
GetDefaultModuleExtension () const;
164 std::string
GetDefaultModuleEntrypoint () const;
165 std::string
GetDefaultModuleBaseaddress () const;
166 void ProcessXMLSubElement ( const XMLElement
& e
,
167 const std::string
& path
,
175 const Project
& project
;
176 const Module
* module
;
177 const XMLElement
& node
;
178 std::string directory
;
179 std::string basePath
;
181 Include ( const Project
& project
,
182 const XMLElement
& includeNode
);
183 Include ( const Project
& project
,
184 const Module
* module
,
185 const XMLElement
& includeNode
);
196 const Project
& project
;
197 const Module
* module
;
198 const XMLElement
& node
;
202 Define ( const Project
& project
,
203 const XMLElement
& defineNode
);
204 Define ( const Project
& project
,
205 const Module
* module
,
206 const XMLElement
& defineNode
);
220 File ( const std::string
& _name
, bool _first
);
229 const XMLElement
& node
;
230 const Module
& module
;
233 Library ( const XMLElement
& _node
,
234 const Module
& _module
,
235 const std::string
& _name
);
244 const XMLElement
& node
;
245 const Module
& module
;
246 const Module
* invokeModule
;
247 std::vector
<InvokeFile
*> input
;
248 std::vector
<InvokeFile
*> output
;
250 Invoke ( const XMLElement
& _node
,
251 const Module
& _module
);
254 std::string
GetTargets () const;
255 std::string
GetParameters () const;
257 void ProcessXMLSubElement ( const XMLElement
& e
);
258 void ProcessXMLSubElementInput ( const XMLElement
& e
);
259 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
266 const XMLElement
& node
;
268 std::string switches
;
270 InvokeFile ( const XMLElement
& _node
,
271 const std::string
& _name
);
280 const XMLElement
& node
;
281 const Module
& module
;
282 const Module
* dependencyModule
;
284 Dependency ( const XMLElement
& _node
,
285 const Module
& _module
);
294 const XMLElement
& node
;
295 const Module
& module
;
296 std::string basename
;
297 std::string definition
;
299 ImportLibrary ( const XMLElement
& _node
,
300 const Module
& module
);
309 const XMLElement
& node
;
310 const Project
& project
;
311 const Module
* module
;
312 std::string property
, value
;
313 std::vector
<File
*> files
;
314 std::vector
<Include
*> includes
;
315 std::vector
<Define
*> defines
;
316 std::vector
<Property
*> properties
;
317 std::vector
<If
*> ifs
;
319 If ( const XMLElement
& node_
,
320 const Project
& project_
,
321 const Module
* module_
);
331 const Project
& project
;
332 const Module
* module
;
333 const XMLElement
& node
;
336 CompilerFlag ( const Project
& project
,
337 const XMLElement
& compilerFlagNode
);
338 CompilerFlag ( const Project
& project
,
339 const Module
* module
,
340 const XMLElement
& compilerFlagNode
);
351 const Project
& project
;
352 const Module
* module
;
353 const XMLElement
& node
;
356 LinkerFlag ( const Project
& project
,
357 const XMLElement
& linkerFlagNode
);
358 LinkerFlag ( const Project
& project
,
359 const Module
* module
,
360 const XMLElement
& linkerFlagNode
);
371 const XMLElement
& node
;
372 const Project
& project
;
373 const Module
* module
;
374 std::string name
, value
;
376 Property ( const XMLElement
& node_
,
377 const Project
& project_
,
378 const Module
* module_
);
387 SourceFile ( AutomaticDependency
* automaticDependency
,
389 const std::string
& filename
,
391 bool isNonAutomaticDependency
);
392 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
394 std::string
Location () const;
395 std::vector
<SourceFile
*> files
;
396 AutomaticDependency
* automaticDependency
;
398 std::string filename
;
399 std::string filenamePart
;
400 std::string directoryPart
;
401 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
402 bool isNonAutomaticDependency
;
403 std::string cachedDependencies
;
404 time_t lastWriteTime
;
405 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
406 SourceFile
* youngestFile
;
408 void GetDirectoryAndFilenameParts ();
411 void SkipWhitespace ();
412 bool ReadInclude ( std::string
& filename
,
414 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
415 SourceFile
* GetParentSourceFile ();
416 bool CanProcessFile ( const std::string
& extension
);
417 bool IsParentOf ( const SourceFile
* parent
,
418 const SourceFile
* child
);
425 class AutomaticDependency
427 friend class SourceFileTest
;
429 const Project
& project
;
431 AutomaticDependency ( const Project
& project
);
432 ~AutomaticDependency ();
434 std::string
GetFilename ( const std::string
& filename
);
435 bool LocateIncludedFile ( const std::string
& directory
,
436 const std::string
& includedFilename
,
437 std::string
& resolvedFilename
);
438 bool LocateIncludedFile ( SourceFile
* sourceFile
,
440 const std::string
& includedFilename
,
442 std::string
& resolvedFilename
);
443 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
444 const std::string
& filename
,
445 SourceFile
* parentSourceFile
);
446 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
447 void CheckAutomaticDependencies ();
448 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
450 void ProcessModule ( Module
& module
);
451 void ProcessFile ( Module
& module
,
453 std::map
<std::string
, SourceFile
*> sourcefile_map
;
460 const Project
& project
;
461 const Module
* module
;
462 const XMLElement
& node
;
464 std::string nameoncd
;
466 Bootstrap ( const Project
& project
,
467 const Module
* module
,
468 const XMLElement
& bootstrapNode
);
472 bool IsSupportedModuleType ( ModuleType type
);
480 const Project
& project
;
481 const XMLElement
& node
;
484 std::string nameoncd
;
487 CDFile ( const Project
& project
,
488 const XMLElement
& bootstrapNode
,
489 const std::string
& path
);
492 std::string
GetPath () const;
497 FixSeparator ( const std::string
& s
);
500 GetExtension ( const std::string
& filename
);
503 GetDirectory ( const std::string
& filename
);
506 NormalizeFilename ( const std::string
& filename
);
508 #endif /* __RBUILD_H */