13 #include <sys/utime.h>
20 #include "exception.h"
25 #define EXEPOSTFIX ".exe"
31 #define EXEPREFIX "./"
54 class AutomaticDependency
;
64 std::vector
<File
*> files
;
65 std::vector
<Include
*> includes
;
66 std::vector
<Define
*> defines
;
67 std::vector
<Library
*> libraries
;
68 std::vector
<Property
*> properties
;
78 XMLElement
*node
, *head
;
82 XMLIncludes xmlbuildfiles
;
83 std::vector
<Module
*> modules
;
84 std::vector
<LinkerFlag
*> linkerFlags
;
85 std::vector
<CDFile
*> cdfiles
;
86 IfableData non_if_data
;
88 Project ( const std::string
& filename
);
90 void WriteConfigurationFile ();
91 void ExecuteInvocations ();
92 void ProcessXML ( const std::string
& path
);
93 Module
* LocateModule ( const std::string
& name
);
94 const Module
* LocateModule ( const std::string
& name
) const;
95 std::string
GetProjectFilename () const;
97 const Property
* LookupProperty ( const std::string
& name
) const;
98 void SetConfigurationOption ( char* s
,
100 std::string
* alternativeName
);
101 void SetConfigurationOption ( char* s
,
103 void WriteIfChanged ( char* outbuf
,
104 std::string filename
);
106 void ProcessXMLSubElement ( const XMLElement
& e
,
107 const std::string
& path
,
110 // disable copy semantics
111 Project ( const Project
& );
112 Project
& operator = ( const Project
& );
144 const Project
& project
;
145 const XMLElement
& node
;
147 std::string extension
;
148 std::string entrypoint
;
149 std::string baseaddress
;
152 ImportLibrary
* importLibrary
;
154 Bootstrap
* bootstrap
;
155 IfableData non_if_data
;
156 std::vector
<Invoke
*> invocations
;
157 std::vector
<Dependency
*> dependencies
;
158 std::vector
<CompilerFlag
*> compilerFlags
;
159 std::vector
<LinkerFlag
*> linkerFlags
;
165 Module ( const Project
& project
,
166 const XMLElement
& moduleNode
,
167 const std::string
& modulePath
);
169 ModuleType
GetModuleType ( const std::string
& location
,
170 const XMLAttribute
& attribute
);
171 bool HasImportLibrary () const;
172 std::string
GetTargetName () const;
173 std::string
GetDependencyPath () const;
174 std::string
GetBasePath () const;
175 std::string
GetPath () const;
176 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
177 std::string
GetTargets () const;
178 std::string
GetInvocationTarget ( const int index
) const;
179 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
180 void InvokeModule () const;
183 std::string
GetDefaultModuleExtension () const;
184 std::string
GetDefaultModuleEntrypoint () const;
185 std::string
GetDefaultModuleBaseaddress () const;
186 void ProcessXMLSubElement ( const XMLElement
& e
,
187 const std::string
& path
,
195 const Project
& project
;
196 const Module
* module
;
197 const XMLElement
& node
;
198 std::string directory
;
199 std::string basePath
;
201 Include ( const Project
& project
,
202 const XMLElement
& includeNode
);
203 Include ( const Project
& project
,
204 const Module
* module
,
205 const XMLElement
& includeNode
);
216 const Project
& project
;
217 const Module
* module
;
218 const XMLElement
& node
;
222 Define ( const Project
& project
,
223 const XMLElement
& defineNode
);
224 Define ( const Project
& project
,
225 const Module
* module
,
226 const XMLElement
& defineNode
);
240 File ( const std::string
& _name
, bool _first
);
249 const XMLElement
& node
;
250 const Module
& module
;
252 const Module
* imported_module
;
254 Library ( const XMLElement
& _node
,
255 const Module
& _module
,
256 const std::string
& _name
);
265 const XMLElement
& node
;
266 const Module
& module
;
267 const Module
* invokeModule
;
268 std::vector
<InvokeFile
*> input
;
269 std::vector
<InvokeFile
*> output
;
271 Invoke ( const XMLElement
& _node
,
272 const Module
& _module
);
275 std::string
GetTargets () const;
276 std::string
GetParameters () const;
278 void ProcessXMLSubElement ( const XMLElement
& e
);
279 void ProcessXMLSubElementInput ( const XMLElement
& e
);
280 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
287 const XMLElement
& node
;
289 std::string switches
;
291 InvokeFile ( const XMLElement
& _node
,
292 const std::string
& _name
);
301 const XMLElement
& node
;
302 const Module
& module
;
303 const Module
* dependencyModule
;
305 Dependency ( const XMLElement
& _node
,
306 const Module
& _module
);
315 const XMLElement
& node
;
316 const Module
& module
;
317 std::string basename
;
318 std::string definition
;
320 ImportLibrary ( const XMLElement
& _node
,
321 const Module
& module
);
330 const XMLElement
& node
;
331 const Project
& project
;
332 const Module
* module
;
333 std::string property
, value
;
336 If ( const XMLElement
& node_
,
337 const Project
& project_
,
338 const Module
* module_
);
348 const Project
& project
;
349 const Module
* module
;
350 const XMLElement
& node
;
353 CompilerFlag ( const Project
& project
,
354 const XMLElement
& compilerFlagNode
);
355 CompilerFlag ( const Project
& project
,
356 const Module
* module
,
357 const XMLElement
& compilerFlagNode
);
368 const Project
& project
;
369 const Module
* module
;
370 const XMLElement
& node
;
373 LinkerFlag ( const Project
& project
,
374 const XMLElement
& linkerFlagNode
);
375 LinkerFlag ( const Project
& project
,
376 const Module
* module
,
377 const XMLElement
& linkerFlagNode
);
388 const XMLElement
& node
;
389 const Project
& project
;
390 const Module
* module
;
391 std::string name
, value
;
393 Property ( const XMLElement
& node_
,
394 const Project
& project_
,
395 const Module
* module_
);
404 SourceFile ( AutomaticDependency
* automaticDependency
,
406 const std::string
& filename
,
408 bool isNonAutomaticDependency
);
409 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
411 std::string
Location () const;
412 std::vector
<SourceFile
*> files
;
413 AutomaticDependency
* automaticDependency
;
415 std::string filename
;
416 std::string filenamePart
;
417 std::string directoryPart
;
418 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
419 bool isNonAutomaticDependency
;
420 std::string cachedDependencies
;
421 time_t lastWriteTime
;
422 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
423 SourceFile
* youngestFile
;
425 void GetDirectoryAndFilenameParts ();
428 void SkipWhitespace ();
429 bool ReadInclude ( std::string
& filename
,
431 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
432 SourceFile
* GetParentSourceFile ();
433 bool CanProcessFile ( const std::string
& extension
);
434 bool IsParentOf ( const SourceFile
* parent
,
435 const SourceFile
* child
);
442 class AutomaticDependency
444 friend class SourceFileTest
;
446 const Project
& project
;
448 AutomaticDependency ( const Project
& project
);
449 ~AutomaticDependency ();
451 std::string
GetFilename ( const std::string
& filename
);
452 bool LocateIncludedFile ( const std::string
& directory
,
453 const std::string
& includedFilename
,
454 std::string
& resolvedFilename
);
455 bool LocateIncludedFile ( SourceFile
* sourceFile
,
457 const std::string
& includedFilename
,
459 std::string
& resolvedFilename
);
460 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
461 const std::string
& filename
,
462 SourceFile
* parentSourceFile
);
463 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
464 void CheckAutomaticDependencies ();
465 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
467 void ProcessModule ( Module
& module
);
468 void ProcessFile ( Module
& module
,
470 std::map
<std::string
, SourceFile
*> sourcefile_map
;
477 const Project
& project
;
478 const Module
* module
;
479 const XMLElement
& node
;
481 std::string nameoncd
;
483 Bootstrap ( const Project
& project
,
484 const Module
* module
,
485 const XMLElement
& bootstrapNode
);
489 bool IsSupportedModuleType ( ModuleType type
);
497 const Project
& project
;
498 const XMLElement
& node
;
501 std::string nameoncd
;
504 CDFile ( const Project
& project
,
505 const XMLElement
& bootstrapNode
,
506 const std::string
& path
);
509 std::string
GetPath () const;
516 const XMLElement
& node
;
517 const Module
& module
;
521 const XMLElement
& node
,
522 const Module
& module
,
523 const std::string
& header
);
529 FixSeparator ( const std::string
& s
);
532 GetExtension ( const std::string
& filename
);
535 GetDirectory ( const std::string
& filename
);
538 NormalizeFilename ( const std::string
& filename
);
540 #endif /* __RBUILD_H */