13 #include <sys/utime.h>
20 #include "exception.h"
25 #define EXEPOSTFIX ".exe"
31 #define EXEPREFIX "./"
53 class AutomaticDependency
;
61 XMLElement
*node
, *head
;
65 std::vector
<Module
*> modules
;
66 std::vector
<Include
*> includes
;
67 std::vector
<Define
*> defines
;
68 std::vector
<LinkerFlag
*> linkerFlags
;
69 std::vector
<Property
*> properties
;
72 Project ( const std::string
& filename
);
74 void WriteConfigurationFile ();
75 void ExecuteInvocations ();
76 void ProcessXML ( const std::string
& path
);
77 Module
* LocateModule ( const std::string
& name
);
78 const Module
* LocateModule ( const std::string
& name
) const;
80 const Property
* LookupProperty ( const std::string
& name
) const;
81 void SetConfigurationOption ( char* s
,
83 std::string
* alternativeName
);
84 void SetConfigurationOption ( char* s
,
86 void WriteIfChanged ( char* outbuf
,
87 std::string filename
);
89 void ProcessXMLSubElement ( const XMLElement
& e
,
90 const std::string
& path
,
93 // disable copy semantics
94 Project ( const Project
& );
95 Project
& operator = ( const Project
& );
121 const Project
& project
;
122 const XMLElement
& node
;
124 std::string extension
;
125 std::string entrypoint
;
126 std::string baseaddress
;
129 ImportLibrary
* importLibrary
;
131 Bootstrap
* bootstrap
;
132 std::vector
<File
*> files
;
133 std::vector
<Library
*> libraries
;
134 std::vector
<Include
*> includes
;
135 std::vector
<Define
*> defines
;
136 std::vector
<Invoke
*> invocations
;
137 std::vector
<Dependency
*> dependencies
;
138 std::vector
<If
*> ifs
;
139 std::vector
<CompilerFlag
*> compilerFlags
;
140 std::vector
<LinkerFlag
*> linkerFlags
;
142 Module ( const Project
& project
,
143 const XMLElement
& moduleNode
,
144 const std::string
& modulePath
);
146 ModuleType
GetModuleType ( const std::string
& location
,
147 const XMLAttribute
& attribute
);
148 bool HasImportLibrary () const;
149 std::string
GetTargetName () const;
150 std::string
GetDependencyPath () const;
151 std::string
GetBasePath () const;
152 std::string
GetPath () const;
153 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
154 std::string
GetTargets () const;
155 std::string
GetInvocationTarget ( const int index
) const;
156 bool HasFileWithExtensions ( const std::string
& extension1
,
157 const std::string
& extension2
) const;
158 void InvokeModule () const;
161 std::string
GetDefaultModuleExtension () const;
162 std::string
GetDefaultModuleEntrypoint () const;
163 std::string
GetDefaultModuleBaseaddress () const;
164 void ProcessXMLSubElement ( const XMLElement
& e
,
165 const std::string
& path
,
173 const Project
& project
;
174 const Module
* module
;
175 const XMLElement
& node
;
176 std::string directory
;
177 std::string basePath
;
179 Include ( const Project
& project
,
180 const XMLElement
& includeNode
);
181 Include ( const Project
& project
,
182 const Module
* module
,
183 const XMLElement
& includeNode
);
194 const Project
& project
;
195 const Module
* module
;
196 const XMLElement
& node
;
200 Define ( const Project
& project
,
201 const XMLElement
& defineNode
);
202 Define ( const Project
& project
,
203 const Module
* module
,
204 const XMLElement
& defineNode
);
218 File ( const std::string
& _name
, bool _first
);
227 const XMLElement
& node
;
228 const Module
& module
;
231 Library ( const XMLElement
& _node
,
232 const Module
& _module
,
233 const std::string
& _name
);
242 const XMLElement
& node
;
243 const Module
& module
;
244 const Module
* invokeModule
;
245 std::vector
<InvokeFile
*> input
;
246 std::vector
<InvokeFile
*> output
;
248 Invoke ( const XMLElement
& _node
,
249 const Module
& _module
);
252 std::string
GetTargets () const;
253 std::string
GetParameters () const;
255 void ProcessXMLSubElement ( const XMLElement
& e
);
256 void ProcessXMLSubElementInput ( const XMLElement
& e
);
257 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
264 const XMLElement
& node
;
266 std::string switches
;
268 InvokeFile ( const XMLElement
& _node
,
269 const std::string
& _name
);
278 const XMLElement
& node
;
279 const Module
& module
;
280 const Module
* dependencyModule
;
282 Dependency ( const XMLElement
& _node
,
283 const Module
& _module
);
292 const XMLElement
& node
;
293 const Module
& module
;
294 std::string basename
;
295 std::string definition
;
297 ImportLibrary ( const XMLElement
& _node
,
298 const Module
& module
);
307 const XMLElement
& node
;
308 const Project
& project
;
309 const Module
* module
;
310 std::string property
, value
;
311 std::vector
<File
*> files
;
312 std::vector
<Include
*> includes
;
313 std::vector
<Define
*> defines
;
314 std::vector
<Property
*> properties
;
315 std::vector
<If
*> ifs
;
317 If ( const XMLElement
& node_
,
318 const Project
& project_
,
319 const Module
* module_
);
329 const Project
& project
;
330 const Module
* module
;
331 const XMLElement
& node
;
334 CompilerFlag ( const Project
& project
,
335 const XMLElement
& compilerFlagNode
);
336 CompilerFlag ( const Project
& project
,
337 const Module
* module
,
338 const XMLElement
& compilerFlagNode
);
349 const Project
& project
;
350 const Module
* module
;
351 const XMLElement
& node
;
354 LinkerFlag ( const Project
& project
,
355 const XMLElement
& linkerFlagNode
);
356 LinkerFlag ( const Project
& project
,
357 const Module
* module
,
358 const XMLElement
& linkerFlagNode
);
369 const XMLElement
& node
;
370 const Project
& project
;
371 const Module
* module
;
372 std::string name
, value
;
374 Property ( const XMLElement
& node_
,
375 const Project
& project_
,
376 const Module
* module_
);
385 SourceFile ( AutomaticDependency
* automaticDependency
,
387 const std::string
& filename
,
389 bool isNonAutomaticDependency
);
390 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
392 std::string
Location () const;
393 std::vector
<SourceFile
*> files
;
394 AutomaticDependency
* automaticDependency
;
396 std::string filename
;
397 std::string filenamePart
;
398 std::string directoryPart
;
399 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
400 bool isNonAutomaticDependency
;
401 std::string cachedDependencies
;
402 time_t lastWriteTime
;
403 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
404 SourceFile
* youngestFile
;
406 void GetDirectoryAndFilenameParts ();
409 void SkipWhitespace ();
410 bool ReadInclude ( std::string
& filename
,
412 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
413 SourceFile
* GetParentSourceFile ();
414 bool CanProcessFile ( const std::string
& extension
);
415 bool IsParentOf ( const SourceFile
* parent
,
416 const SourceFile
* child
);
423 class AutomaticDependency
425 friend class SourceFileTest
;
427 const Project
& project
;
429 AutomaticDependency ( const Project
& project
);
430 ~AutomaticDependency ();
432 std::string
GetFilename ( const std::string
& filename
);
433 bool LocateIncludedFile ( const std::string
& directory
,
434 const std::string
& includedFilename
,
435 std::string
& resolvedFilename
);
436 bool LocateIncludedFile ( SourceFile
* sourceFile
,
438 const std::string
& includedFilename
,
440 std::string
& resolvedFilename
);
441 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
442 const std::string
& filename
,
443 SourceFile
* parentSourceFile
);
444 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
445 void CheckAutomaticDependencies ();
446 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
448 void ProcessModule ( Module
& module
);
449 void ProcessFile ( Module
& module
,
451 std::map
<std::string
, SourceFile
*> sourcefile_map
;
458 const Project
& project
;
459 const Module
* module
;
460 const XMLElement
& node
;
462 std::string nameoncd
;
464 Bootstrap ( const Project
& project
,
465 const Module
* module
,
466 const XMLElement
& bootstrapNode
);
470 bool IsSupportedModuleType ( ModuleType type
);
476 FixSeparator ( const std::string
& s
);
479 GetExtension ( const std::string
& filename
);
482 GetDirectory ( const std::string
& filename
);
485 NormalizeFilename ( const std::string
& filename
);
487 #endif /* __RBUILD_H */