13 #include <sys/utime.h>
22 #include "exception.h"
25 typedef std::vector
<std::string
> string_list
;
29 #define EXEPOSTFIX ".exe"
35 #define EXEPREFIX "./"
58 class AutomaticDependency
;
62 class StubbedComponent
;
70 std::vector
<File
*> files
;
71 std::vector
<Include
*> includes
;
72 std::vector
<Define
*> defines
;
73 std::vector
<Library
*> libraries
;
74 std::vector
<Property
*> properties
;
84 XMLElement
*node
, *head
;
88 XMLIncludes xmlbuildfiles
;
89 std::vector
<Module
*> modules
;
90 std::vector
<LinkerFlag
*> linkerFlags
;
91 std::vector
<CDFile
*> cdfiles
;
92 IfableData non_if_data
;
94 Project ( const std::string
& filename
);
96 void WriteConfigurationFile ();
97 void ExecuteInvocations ();
98 void ProcessXML ( const std::string
& path
);
99 Module
* LocateModule ( const std::string
& name
);
100 const Module
* LocateModule ( const std::string
& name
) const;
101 std::string
GetProjectFilename () const;
103 const Property
* LookupProperty ( const std::string
& name
) const;
104 void SetConfigurationOption ( char* s
,
106 std::string
* alternativeName
);
107 void SetConfigurationOption ( char* s
,
109 void WriteIfChanged ( char* outbuf
,
110 std::string filename
);
112 void ProcessXMLSubElement ( const XMLElement
& e
,
113 const std::string
& path
,
116 // disable copy semantics
117 Project ( const Project
& );
118 Project
& operator = ( const Project
& );
151 const Project
& project
;
152 const XMLElement
& node
;
154 std::string extension
;
155 std::string entrypoint
;
156 std::string baseaddress
;
159 ImportLibrary
* importLibrary
;
161 Bootstrap
* bootstrap
;
162 IfableData non_if_data
;
163 std::vector
<Invoke
*> invocations
;
164 std::vector
<Dependency
*> dependencies
;
165 std::vector
<CompilerFlag
*> compilerFlags
;
166 std::vector
<LinkerFlag
*> linkerFlags
;
167 std::vector
<StubbedComponent
*> stubbedComponents
;
173 Module ( const Project
& project
,
174 const XMLElement
& moduleNode
,
175 const std::string
& modulePath
);
177 ModuleType
GetModuleType ( const std::string
& location
,
178 const XMLAttribute
& attribute
);
179 bool HasImportLibrary () const;
180 std::string
GetTargetName () const;
181 std::string
GetDependencyPath () const;
182 std::string
GetBasePath () const;
183 std::string
GetPath () const;
184 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
185 void GetTargets ( string_list
& ) const;
186 std::string
GetInvocationTarget ( const int index
) const;
187 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
188 void InvokeModule () const;
191 std::string
GetDefaultModuleExtension () const;
192 std::string
GetDefaultModuleEntrypoint () const;
193 std::string
GetDefaultModuleBaseaddress () const;
194 void ProcessXMLSubElement ( const XMLElement
& e
,
195 const std::string
& path
,
203 const Project
& project
;
204 const Module
* module
;
205 const XMLElement
& node
;
206 std::string directory
;
207 std::string basePath
;
209 Include ( const Project
& project
,
210 const XMLElement
& includeNode
);
211 Include ( const Project
& project
,
212 const Module
* module
,
213 const XMLElement
& includeNode
);
224 const Project
& project
;
225 const Module
* module
;
226 const XMLElement
& node
;
230 Define ( const Project
& project
,
231 const XMLElement
& defineNode
);
232 Define ( const Project
& project
,
233 const Module
* module
,
234 const XMLElement
& defineNode
);
248 File ( const std::string
& _name
, bool _first
);
257 const XMLElement
& node
;
258 const Module
& module
;
260 const Module
* imported_module
;
262 Library ( const XMLElement
& _node
,
263 const Module
& _module
,
264 const std::string
& _name
);
273 const XMLElement
& node
;
274 const Module
& module
;
275 const Module
* invokeModule
;
276 std::vector
<InvokeFile
*> input
;
277 std::vector
<InvokeFile
*> output
;
279 Invoke ( const XMLElement
& _node
,
280 const Module
& _module
);
283 void GetTargets ( string_list
& targets
) const;
284 std::string
GetParameters () const;
286 void ProcessXMLSubElement ( const XMLElement
& e
);
287 void ProcessXMLSubElementInput ( const XMLElement
& e
);
288 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
295 const XMLElement
& node
;
297 std::string switches
;
299 InvokeFile ( const XMLElement
& _node
,
300 const std::string
& _name
);
309 const XMLElement
& node
;
310 const Module
& module
;
311 const Module
* dependencyModule
;
313 Dependency ( const XMLElement
& _node
,
314 const Module
& _module
);
323 const XMLElement
& node
;
324 const Module
& module
;
325 std::string basename
;
326 std::string definition
;
328 ImportLibrary ( const XMLElement
& _node
,
329 const Module
& module
);
338 const XMLElement
& node
;
339 const Project
& project
;
340 const Module
* module
;
341 std::string property
, value
;
344 If ( const XMLElement
& node_
,
345 const Project
& project_
,
346 const Module
* module_
);
356 const Project
& project
;
357 const Module
* module
;
358 const XMLElement
& node
;
361 CompilerFlag ( const Project
& project
,
362 const XMLElement
& compilerFlagNode
);
363 CompilerFlag ( const Project
& project
,
364 const Module
* module
,
365 const XMLElement
& compilerFlagNode
);
376 const Project
& project
;
377 const Module
* module
;
378 const XMLElement
& node
;
381 LinkerFlag ( const Project
& project
,
382 const XMLElement
& linkerFlagNode
);
383 LinkerFlag ( const Project
& project
,
384 const Module
* module
,
385 const XMLElement
& linkerFlagNode
);
396 const XMLElement
& node
;
397 const Project
& project
;
398 const Module
* module
;
399 std::string name
, value
;
401 Property ( const XMLElement
& node_
,
402 const Project
& project_
,
403 const Module
* module_
);
412 SourceFile ( AutomaticDependency
* automaticDependency
,
414 const std::string
& filename
,
416 bool isNonAutomaticDependency
);
417 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
419 std::string
Location () const;
420 std::vector
<SourceFile
*> files
;
421 AutomaticDependency
* automaticDependency
;
423 std::string filename
;
424 std::string filenamePart
;
425 std::string directoryPart
;
426 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
427 bool isNonAutomaticDependency
;
428 std::string cachedDependencies
;
429 time_t lastWriteTime
;
430 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
431 SourceFile
* youngestFile
;
433 void GetDirectoryAndFilenameParts ();
436 void SkipWhitespace ();
437 bool ReadInclude ( std::string
& filename
,
439 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
440 SourceFile
* GetParentSourceFile ();
441 bool CanProcessFile ( const std::string
& extension
);
442 bool IsParentOf ( const SourceFile
* parent
,
443 const SourceFile
* child
);
450 class AutomaticDependency
452 friend class SourceFileTest
;
454 const Project
& project
;
456 AutomaticDependency ( const Project
& project
);
457 ~AutomaticDependency ();
459 std::string
GetFilename ( const std::string
& filename
);
460 bool LocateIncludedFile ( const std::string
& directory
,
461 const std::string
& includedFilename
,
462 std::string
& resolvedFilename
);
463 bool LocateIncludedFile ( SourceFile
* sourceFile
,
465 const std::string
& includedFilename
,
467 std::string
& resolvedFilename
);
468 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
469 const std::string
& filename
,
470 SourceFile
* parentSourceFile
);
471 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
472 void CheckAutomaticDependencies ( bool verbose
);
473 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
475 void ProcessModule ( Module
& module
);
476 void ProcessFile ( Module
& module
,
478 std::map
<std::string
, SourceFile
*> sourcefile_map
;
485 const Project
& project
;
486 const Module
* module
;
487 const XMLElement
& node
;
489 std::string nameoncd
;
491 Bootstrap ( const Project
& project
,
492 const Module
* module
,
493 const XMLElement
& bootstrapNode
);
497 bool IsSupportedModuleType ( ModuleType type
);
505 const Project
& project
;
506 const XMLElement
& node
;
509 std::string nameoncd
;
512 CDFile ( const Project
& project
,
513 const XMLElement
& bootstrapNode
,
514 const std::string
& path
);
517 std::string
GetPath () const;
524 const XMLElement
& node
;
525 const Module
& module
;
529 const XMLElement
& node
,
530 const Module
& module
,
531 const std::string
& header
);
536 class StubbedComponent
539 const Module
* module
;
540 const XMLElement
& node
;
542 std::vector
<StubbedSymbol
*> symbols
;
544 StubbedComponent ( const Module
* module_
,
545 const XMLElement
& stubbedComponentNode
);
546 ~StubbedComponent ();
548 void ProcessXMLSubElement ( const XMLElement
& e
);
555 const XMLElement
& node
;
559 StubbedSymbol ( const XMLElement
& stubbedSymbolNode
);
565 FixSeparator ( const std::string
& s
);
569 const std::string
& filename
,
570 const std::string
& newExtension
);
574 const std::string
& location
,
575 const std::string
& path
,
576 const std::string
& att_value
);
579 GetExtension ( const std::string
& filename
);
582 GetDirectory ( const std::string
& filename
);
585 NormalizeFilename ( const std::string
& filename
);
587 #endif /* __RBUILD_H */