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
& );
138 const Project
& project
;
139 const XMLElement
& node
;
141 std::string extension
;
142 std::string entrypoint
;
143 std::string baseaddress
;
146 ImportLibrary
* importLibrary
;
148 Bootstrap
* bootstrap
;
149 IfableData non_if_data
;
150 std::vector
<Invoke
*> invocations
;
151 std::vector
<Dependency
*> dependencies
;
152 std::vector
<CompilerFlag
*> compilerFlags
;
153 std::vector
<LinkerFlag
*> linkerFlags
;
156 Module ( const Project
& project
,
157 const XMLElement
& moduleNode
,
158 const std::string
& modulePath
);
160 ModuleType
GetModuleType ( const std::string
& location
,
161 const XMLAttribute
& attribute
);
162 bool HasImportLibrary () const;
163 std::string
GetTargetName () const;
164 std::string
GetDependencyPath () const;
165 std::string
GetBasePath () const;
166 std::string
GetPath () const;
167 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
168 std::string
GetTargets () const;
169 std::string
GetInvocationTarget ( const int index
) const;
170 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
171 void InvokeModule () const;
174 std::string
GetDefaultModuleExtension () const;
175 std::string
GetDefaultModuleEntrypoint () const;
176 std::string
GetDefaultModuleBaseaddress () const;
177 void ProcessXMLSubElement ( const XMLElement
& e
,
178 const std::string
& path
,
186 const Project
& project
;
187 const Module
* module
;
188 const XMLElement
& node
;
189 std::string directory
;
190 std::string basePath
;
192 Include ( const Project
& project
,
193 const XMLElement
& includeNode
);
194 Include ( const Project
& project
,
195 const Module
* module
,
196 const XMLElement
& includeNode
);
207 const Project
& project
;
208 const Module
* module
;
209 const XMLElement
& node
;
213 Define ( const Project
& project
,
214 const XMLElement
& defineNode
);
215 Define ( const Project
& project
,
216 const Module
* module
,
217 const XMLElement
& defineNode
);
231 File ( const std::string
& _name
, bool _first
);
240 const XMLElement
& node
;
241 const Module
& module
;
243 const Module
* imported_module
;
245 Library ( const XMLElement
& _node
,
246 const Module
& _module
,
247 const std::string
& _name
);
256 const XMLElement
& node
;
257 const Module
& module
;
258 const Module
* invokeModule
;
259 std::vector
<InvokeFile
*> input
;
260 std::vector
<InvokeFile
*> output
;
262 Invoke ( const XMLElement
& _node
,
263 const Module
& _module
);
266 std::string
GetTargets () const;
267 std::string
GetParameters () const;
269 void ProcessXMLSubElement ( const XMLElement
& e
);
270 void ProcessXMLSubElementInput ( const XMLElement
& e
);
271 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
278 const XMLElement
& node
;
280 std::string switches
;
282 InvokeFile ( const XMLElement
& _node
,
283 const std::string
& _name
);
292 const XMLElement
& node
;
293 const Module
& module
;
294 const Module
* dependencyModule
;
296 Dependency ( const XMLElement
& _node
,
297 const Module
& _module
);
306 const XMLElement
& node
;
307 const Module
& module
;
308 std::string basename
;
309 std::string definition
;
311 ImportLibrary ( const XMLElement
& _node
,
312 const Module
& module
);
321 const XMLElement
& node
;
322 const Project
& project
;
323 const Module
* module
;
324 std::string property
, value
;
327 If ( const XMLElement
& node_
,
328 const Project
& project_
,
329 const Module
* module_
);
339 const Project
& project
;
340 const Module
* module
;
341 const XMLElement
& node
;
344 CompilerFlag ( const Project
& project
,
345 const XMLElement
& compilerFlagNode
);
346 CompilerFlag ( const Project
& project
,
347 const Module
* module
,
348 const XMLElement
& compilerFlagNode
);
359 const Project
& project
;
360 const Module
* module
;
361 const XMLElement
& node
;
364 LinkerFlag ( const Project
& project
,
365 const XMLElement
& linkerFlagNode
);
366 LinkerFlag ( const Project
& project
,
367 const Module
* module
,
368 const XMLElement
& linkerFlagNode
);
379 const XMLElement
& node
;
380 const Project
& project
;
381 const Module
* module
;
382 std::string name
, value
;
384 Property ( const XMLElement
& node_
,
385 const Project
& project_
,
386 const Module
* module_
);
395 SourceFile ( AutomaticDependency
* automaticDependency
,
397 const std::string
& filename
,
399 bool isNonAutomaticDependency
);
400 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
402 std::string
Location () const;
403 std::vector
<SourceFile
*> files
;
404 AutomaticDependency
* automaticDependency
;
406 std::string filename
;
407 std::string filenamePart
;
408 std::string directoryPart
;
409 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
410 bool isNonAutomaticDependency
;
411 std::string cachedDependencies
;
412 time_t lastWriteTime
;
413 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
414 SourceFile
* youngestFile
;
416 void GetDirectoryAndFilenameParts ();
419 void SkipWhitespace ();
420 bool ReadInclude ( std::string
& filename
,
422 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
423 SourceFile
* GetParentSourceFile ();
424 bool CanProcessFile ( const std::string
& extension
);
425 bool IsParentOf ( const SourceFile
* parent
,
426 const SourceFile
* child
);
433 class AutomaticDependency
435 friend class SourceFileTest
;
437 const Project
& project
;
439 AutomaticDependency ( const Project
& project
);
440 ~AutomaticDependency ();
442 std::string
GetFilename ( const std::string
& filename
);
443 bool LocateIncludedFile ( const std::string
& directory
,
444 const std::string
& includedFilename
,
445 std::string
& resolvedFilename
);
446 bool LocateIncludedFile ( SourceFile
* sourceFile
,
448 const std::string
& includedFilename
,
450 std::string
& resolvedFilename
);
451 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
452 const std::string
& filename
,
453 SourceFile
* parentSourceFile
);
454 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
455 void CheckAutomaticDependencies ();
456 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
458 void ProcessModule ( Module
& module
);
459 void ProcessFile ( Module
& module
,
461 std::map
<std::string
, SourceFile
*> sourcefile_map
;
468 const Project
& project
;
469 const Module
* module
;
470 const XMLElement
& node
;
472 std::string nameoncd
;
474 Bootstrap ( const Project
& project
,
475 const Module
* module
,
476 const XMLElement
& bootstrapNode
);
480 bool IsSupportedModuleType ( ModuleType type
);
488 const Project
& project
;
489 const XMLElement
& node
;
492 std::string nameoncd
;
495 CDFile ( const Project
& project
,
496 const XMLElement
& bootstrapNode
,
497 const std::string
& path
);
500 std::string
GetPath () const;
507 const XMLElement
& node
;
508 const Module
& module
;
512 const XMLElement
& node
,
513 const Module
& module
,
514 const std::string
& header
);
520 FixSeparator ( const std::string
& s
);
523 GetExtension ( const std::string
& filename
);
526 GetDirectory ( const std::string
& filename
);
529 NormalizeFilename ( const std::string
& filename
);
531 #endif /* __RBUILD_H */