13 #include <sys/utime.h>
20 #include "exception.h"
25 #define EXEPOSTFIX ".exe"
31 #define EXEPREFIX "./"
53 class AutomaticDependency
;
60 XMLElement
*node
, *head
;
64 std::vector
<Module
*> modules
;
65 std::vector
<Include
*> includes
;
66 std::vector
<Define
*> defines
;
67 std::vector
<LinkerFlag
*> linkerFlags
;
68 std::vector
<Property
*> properties
;
71 Project ( const std::string
& filename
);
73 void WriteConfigurationFile ();
74 void ExecuteInvocations ();
75 void ProcessXML ( const std::string
& path
);
76 Module
* LocateModule ( const std::string
& name
);
77 const Module
* LocateModule ( const std::string
& name
) const;
79 const Property
* LookupProperty ( const std::string
& name
) const;
80 void SetConfigurationOption ( char* s
,
82 std::string
* alternativeName
);
83 void SetConfigurationOption ( char* s
,
85 void WriteIfChanged ( char* outbuf
,
86 std::string filename
);
88 void ProcessXMLSubElement ( const XMLElement
& e
,
89 const std::string
& path
,
92 // disable copy semantics
93 Project ( const Project
& );
94 Project
& operator = ( const Project
& );
120 const Project
& project
;
121 const XMLElement
& node
;
123 std::string extension
;
124 std::string entrypoint
;
125 std::string baseaddress
;
128 ImportLibrary
* importLibrary
;
130 std::vector
<File
*> files
;
131 std::vector
<Library
*> libraries
;
132 std::vector
<Include
*> includes
;
133 std::vector
<Define
*> defines
;
134 std::vector
<Invoke
*> invocations
;
135 std::vector
<Dependency
*> dependencies
;
136 std::vector
<If
*> ifs
;
137 std::vector
<CompilerFlag
*> compilerFlags
;
138 std::vector
<LinkerFlag
*> linkerFlags
;
140 Module ( const Project
& project
,
141 const XMLElement
& moduleNode
,
142 const std::string
& modulePath
);
144 ModuleType
GetModuleType ( const std::string
& location
,
145 const XMLAttribute
& attribute
);
146 bool HasImportLibrary () const;
147 std::string
GetTargetName () const;
148 std::string
GetDependencyPath () const;
149 std::string
GetBasePath () const;
150 std::string
GetPath () const;
151 std::string
GetPathWithPrefix ( const std::string
& prefix
) const;
152 std::string
GetTargets () const;
153 std::string
GetInvocationTarget ( const int index
) const;
154 bool HasFileWithExtensions ( const std::string
& extension1
,
155 const std::string
& extension2
) const;
156 void InvokeModule () const;
159 std::string
GetDefaultModuleExtension () const;
160 std::string
GetDefaultModuleEntrypoint () const;
161 std::string
GetDefaultModuleBaseaddress () const;
162 void ProcessXMLSubElement ( const XMLElement
& e
,
163 const std::string
& path
,
171 const Project
& project
;
172 const Module
* module
;
173 const XMLElement
& node
;
174 std::string directory
;
175 std::string basePath
;
177 Include ( const Project
& project
,
178 const XMLElement
& includeNode
);
179 Include ( const Project
& project
,
180 const Module
* module
,
181 const XMLElement
& includeNode
);
192 const Project
& project
;
193 const Module
* module
;
194 const XMLElement
& node
;
198 Define ( const Project
& project
,
199 const XMLElement
& defineNode
);
200 Define ( const Project
& project
,
201 const Module
* module
,
202 const XMLElement
& defineNode
);
216 File ( const std::string
& _name
, bool _first
);
225 const XMLElement
& node
;
226 const Module
& module
;
229 Library ( const XMLElement
& _node
,
230 const Module
& _module
,
231 const std::string
& _name
);
240 const XMLElement
& node
;
241 const Module
& module
;
242 const Module
* invokeModule
;
243 std::vector
<InvokeFile
*> input
;
244 std::vector
<InvokeFile
*> output
;
246 Invoke ( const XMLElement
& _node
,
247 const Module
& _module
);
250 std::string
GetTargets () const;
251 std::string
GetParameters () const;
253 void ProcessXMLSubElement ( const XMLElement
& e
);
254 void ProcessXMLSubElementInput ( const XMLElement
& e
);
255 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
262 const XMLElement
& node
;
264 std::string switches
;
266 InvokeFile ( const XMLElement
& _node
,
267 const std::string
& _name
);
276 const XMLElement
& node
;
277 const Module
& module
;
278 const Module
* dependencyModule
;
280 Dependency ( const XMLElement
& _node
,
281 const Module
& _module
);
290 const XMLElement
& node
;
291 const Module
& module
;
292 std::string basename
;
293 std::string definition
;
295 ImportLibrary ( const XMLElement
& _node
,
296 const Module
& module
);
305 const XMLElement
& node
;
306 const Project
& project
;
307 const Module
* module
;
308 std::string property
, value
;
309 std::vector
<File
*> files
;
310 std::vector
<Include
*> includes
;
311 std::vector
<Define
*> defines
;
312 std::vector
<Property
*> properties
;
313 std::vector
<If
*> ifs
;
315 If ( const XMLElement
& node_
,
316 const Project
& project_
,
317 const Module
* module_
);
327 const Project
& project
;
328 const Module
* module
;
329 const XMLElement
& node
;
332 CompilerFlag ( const Project
& project
,
333 const XMLElement
& compilerFlagNode
);
334 CompilerFlag ( const Project
& project
,
335 const Module
* module
,
336 const XMLElement
& compilerFlagNode
);
347 const Project
& project
;
348 const Module
* module
;
349 const XMLElement
& node
;
352 LinkerFlag ( const Project
& project
,
353 const XMLElement
& linkerFlagNode
);
354 LinkerFlag ( const Project
& project
,
355 const Module
* module
,
356 const XMLElement
& linkerFlagNode
);
367 const XMLElement
& node
;
368 const Project
& project
;
369 const Module
* module
;
370 std::string name
, value
;
372 Property ( const XMLElement
& node_
,
373 const Project
& project_
,
374 const Module
* module_
);
383 SourceFile ( AutomaticDependency
* automaticDependency
,
385 const std::string
& filename
,
387 bool isNonAutomaticDependency
);
388 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
390 std::string
Location () const;
391 std::vector
<SourceFile
*> files
;
392 AutomaticDependency
* automaticDependency
;
394 std::string filename
;
395 std::string filenamePart
;
396 std::string directoryPart
;
397 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
398 bool isNonAutomaticDependency
;
399 std::string cachedDependencies
;
400 time_t lastWriteTime
;
401 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
402 SourceFile
* youngestFile
;
404 void GetDirectoryAndFilenameParts ();
407 void SkipWhitespace ();
408 bool ReadInclude ( std::string
& filename
,
410 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
411 SourceFile
* GetParentSourceFile ();
412 bool CanProcessFile ( const std::string
& extension
);
413 bool IsParentOf ( const SourceFile
* parent
,
414 const SourceFile
* child
);
421 class AutomaticDependency
423 friend class SourceFileTest
;
425 const Project
& project
;
427 AutomaticDependency ( const Project
& project
);
428 ~AutomaticDependency ();
430 std::string
GetFilename ( const std::string
& filename
);
431 bool LocateIncludedFile ( const std::string
& directory
,
432 const std::string
& includedFilename
,
433 std::string
& resolvedFilename
);
434 bool LocateIncludedFile ( SourceFile
* sourceFile
,
436 const std::string
& includedFilename
,
438 std::string
& resolvedFilename
);
439 SourceFile
* RetrieveFromCacheOrParse ( Module
& module
,
440 const std::string
& filename
,
441 SourceFile
* parentSourceFile
);
442 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
443 void CheckAutomaticDependencies ();
444 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
446 void ProcessModule ( Module
& module
);
447 void ProcessFile ( Module
& module
,
449 std::map
<std::string
, SourceFile
*> sourcefile_map
;
454 FixSeparator ( const std::string
& s
);
457 GetExtension ( const std::string
& filename
);
460 GetDirectory ( const std::string
& filename
);
463 NormalizeFilename ( const std::string
& filename
);
465 #endif /* __RBUILD_H */