2 * Copyright (C) 2005 Casper S. Hornstrup
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 #include <sys/utime.h>
41 #include "exception.h"
44 class Backend
; // forward declaration
46 typedef std::vector
<std::string
> string_list
;
48 extern std::string ExePrefix
;
49 extern std::string ExePostfix
;
50 extern std::string sSep
;
51 extern std::string sBadSep
;
56 #define DEF_EXEPREFIX ""
57 #define DEF_EXEPOSTFIX ".exe"
59 #define DEF_CBAD_SEP '/'
61 #define DEF_SBAD_SEP "/"
63 #define DEF_EXEPREFIX "./"
64 #define DEF_EXEPOSTFIX ""
66 #define DEF_CBAD_SEP '\\'
68 #define DEF_SBAD_SEP "\\"
71 #define MS_VS_DEF_VERSION "7.10"
90 class TestSupportCode
;
92 class AutomaticDependency
;
97 class StubbedComponent
;
99 class CompilationUnit
;
103 class SourceFileTest
;
106 typedef std::map
<std::string
,Directory
*> directory_map
;
112 directory_map subdirs
;
113 Directory ( const std::string
& name
);
114 void Add ( const char* subdir
);
115 void GenerateTree ( const std::string
& parent
,
117 std::string
EscapeSpaces ( std::string path
);
118 void CreateRule ( FILE* f
,
119 const std::string
& parent
);
121 bool mkdir_p ( const char* path
);
122 std::string
ReplaceVariable ( std::string name
,
125 std::string
GetEnvironmentVariable ( const std::string
& name
);
126 void ResolveVariablesInPath ( char* buf
,
128 bool CreateDirectory ( std::string path
);
139 bool AutomaticDependencies
;
140 bool CheckDependenciesForModuleOnly
;
141 bool CompilationUnitsEnabled
;
142 std::string CheckDependenciesForModuleOnlyModule
;
143 std::string VSProjectVersion
;
144 bool MakeHandlesInstallDirectories
;
145 bool GenerateProxyMakefilesInSourceTree
;
151 static std::string
GetVariable ( const std::string
& name
);
152 static std::string
GetIntermediatePath ();
153 static std::string
GetOutputPath ();
154 static std::string
GetInstallPath ();
155 static std::string
GetEnvironmentVariablePathOrDefault ( const std::string
& name
,
156 const std::string
& defaultValue
);
160 class FileSupportCode
163 static void WriteIfChanged ( char* outbuf
,
164 std::string filename
);
172 CompilationUnit
* compilationUnit
;
180 std::vector
<CompilationUnit
*> compilationUnits
;
181 std::vector
<File
*> files
;
182 std::vector
<Include
*> includes
;
183 std::vector
<Define
*> defines
;
184 std::vector
<Library
*> libraries
;
185 std::vector
<Property
*> properties
;
186 std::vector
<CompilerFlag
*> compilerFlags
;
187 std::vector
<If
*> ifs
;
196 XMLElement
*node
, *head
;
199 const Configuration
& configuration
;
201 std::string makefile
;
202 XMLIncludes xmlbuildfiles
;
203 std::vector
<Module
*> modules
;
204 std::vector
<LinkerFlag
*> linkerFlags
;
205 std::vector
<CDFile
*> cdfiles
;
206 std::vector
<InstallFile
*> installfiles
;
207 IfableData non_if_data
;
209 Project ( const Configuration
& configuration
,
210 const std::string
& filename
);
212 void SetBackend ( Backend
* backend
) { _backend
= backend
; }
213 Backend
& GetBackend() { return *_backend
; }
214 void WriteConfigurationFile ();
215 void ExecuteInvocations ();
217 void ProcessXML ( const std::string
& path
);
218 Module
* LocateModule ( const std::string
& name
);
219 const Module
* LocateModule ( const std::string
& name
) const;
220 std::string
GetProjectFilename () const;
221 std::string
ResolveProperties ( const std::string
& s
) const;
223 std::string
ResolveNextProperty ( std::string
& s
) const;
224 const Property
* LookupProperty ( const std::string
& name
) const;
225 void SetConfigurationOption ( char* s
,
227 std::string
* alternativeName
);
228 void SetConfigurationOption ( char* s
,
231 void ProcessXMLSubElement ( const XMLElement
& e
,
232 const std::string
& path
,
233 ParseContext
& parseContext
);
235 // disable copy semantics
236 Project ( const Project
& );
237 Project
& operator = ( const Project
& );
248 KernelModeDriver
= 5,
274 const Project
& project
;
275 const XMLElement
& node
;
276 std::string xmlbuildFile
;
279 std::string extension
;
280 std::string entrypoint
;
281 std::string baseaddress
;
284 ImportLibrary
* importLibrary
;
287 Bootstrap
* bootstrap
;
288 AutoRegister
* autoRegister
;
289 IfableData non_if_data
;
290 std::vector
<Invoke
*> invocations
;
291 std::vector
<Dependency
*> dependencies
;
292 std::vector
<CompilerFlag
*> compilerFlags
;
293 std::vector
<LinkerFlag
*> linkerFlags
;
294 std::vector
<StubbedComponent
*> stubbedComponents
;
295 LinkerScript
* linkerScript
;
300 std::string installBase
;
301 std::string installName
;
302 std::string aliasedModuleName
;
307 Module ( const Project
& project
,
308 const XMLElement
& moduleNode
,
309 const std::string
& modulePath
);
311 ModuleType
GetModuleType ( const std::string
& location
,
312 const XMLAttribute
& attribute
);
313 bool HasImportLibrary () const;
315 bool GenerateInOutputTree () const;
316 std::string
GetTargetName () const; // "foo.exe"
317 std::string
GetDependencyPath () const; // "path/foo.exe" or "path/libfoo.a"
318 std::string
GetBasePath () const; // "path"
319 std::string
GetPath () const; // "path/foo.exe"
320 std::string
GetPathWithPrefix ( const std::string
& prefix
) const; // "path/prefixfoo.exe"
321 void GetTargets ( string_list
& ) const;
322 std::string
GetInvocationTarget ( const int index
) const;
323 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
324 void InvokeModule () const;
326 void GetSourceFilenames ( string_list
& list
,
327 bool includeGeneratedFiles
) const;
329 std::string
GetDefaultModuleExtension () const;
330 std::string
GetDefaultModuleEntrypoint () const;
331 std::string
GetDefaultModuleBaseaddress () const;
332 void ProcessXMLSubElement ( const XMLElement
& e
,
333 const std::string
& path
,
334 ParseContext
& parseContext
);
341 const Project
& project
;
342 const Module
* module
;
343 const XMLElement
* node
;
344 const Module
* baseModule
;
345 std::string directory
;
346 std::string basePath
;
348 Include ( const Project
& project
,
349 const XMLElement
* includeNode
);
350 Include ( const Project
& project
,
351 const Module
* module
,
352 const XMLElement
* includeNode
);
353 Include ( const Project
& project
,
354 std::string directory
,
355 std::string basePath
);
365 const Project
& project
;
366 const Module
* module
;
367 const XMLElement
& node
;
371 Define ( const Project
& project
,
372 const XMLElement
& defineNode
);
373 Define ( const Project
& project
,
374 const Module
* module
,
375 const XMLElement
& defineNode
);
388 std::string switches
;
389 bool isPreCompiledHeader
;
391 File ( const std::string
& _name
,
393 std::string _switches
,
394 bool _isPreCompiledHeader
);
403 const XMLElement
& node
;
404 const Module
& module
;
406 const Module
* importedModule
;
408 Library ( const XMLElement
& _node
,
409 const Module
& _module
,
410 const std::string
& _name
);
419 const XMLElement
& node
;
420 const Module
& module
;
421 const Module
* invokeModule
;
422 std::vector
<InvokeFile
*> input
;
423 std::vector
<InvokeFile
*> output
;
425 Invoke ( const XMLElement
& _node
,
426 const Module
& _module
);
429 void GetTargets ( string_list
& targets
) const;
430 std::string
GetParameters () const;
432 void ProcessXMLSubElement ( const XMLElement
& e
);
433 void ProcessXMLSubElementInput ( const XMLElement
& e
);
434 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
441 const XMLElement
& node
;
443 std::string switches
;
445 InvokeFile ( const XMLElement
& _node
,
446 const std::string
& _name
);
455 const XMLElement
& node
;
456 const Module
& module
;
457 const Module
* dependencyModule
;
459 Dependency ( const XMLElement
& _node
,
460 const Module
& _module
);
469 const XMLElement
& node
;
470 const Module
& module
;
471 std::string basename
;
472 std::string definition
;
474 ImportLibrary ( const XMLElement
& _node
,
475 const Module
& module
);
484 const XMLElement
& node
;
485 const Project
& project
;
486 const Module
* module
;
488 std::string property
, value
;
491 If ( const XMLElement
& node_
,
492 const Project
& project_
,
493 const Module
* module_
,
494 const bool negated_
= false );
504 const Project
& project
;
505 const Module
* module
;
506 const XMLElement
& node
;
509 CompilerFlag ( const Project
& project
,
510 const XMLElement
& compilerFlagNode
);
511 CompilerFlag ( const Project
& project
,
512 const Module
* module
,
513 const XMLElement
& compilerFlagNode
);
524 const Project
& project
;
525 const Module
* module
;
526 const XMLElement
& node
;
529 LinkerFlag ( const Project
& project
,
530 const XMLElement
& linkerFlagNode
);
531 LinkerFlag ( const Project
& project
,
532 const Module
* module
,
533 const XMLElement
& linkerFlagNode
);
544 const Project
& project
;
545 const Module
* module
;
546 const XMLElement
& node
;
547 const Module
* baseModule
;
548 std::string directory
;
549 std::string basePath
;
551 LinkerScript ( const Project
& project
,
552 const Module
* module
,
553 const XMLElement
& node
);
562 const XMLElement
& node
;
563 const Project
& project
;
564 const Module
* module
;
565 std::string name
, value
;
567 Property ( const XMLElement
& node_
,
568 const Project
& project_
,
569 const Module
* module_
);
575 class TestSupportCode
578 const Project
& project
;
580 TestSupportCode ( const Project
& project
);
582 void GenerateTestSupportCode ( bool verbose
);
584 bool IsTestModule ( const Module
& module
);
585 void GenerateTestSupportCodeForModule ( Module
& module
,
587 std::string
GetHooksFilename ( Module
& module
);
588 char* WriteStubbedSymbolToHooksFile ( char* buffer
,
589 const StubbedComponent
& component
,
590 const StubbedSymbol
& symbol
);
591 char* WriteStubbedComponentToHooksFile ( char* buffer
,
592 const StubbedComponent
& component
);
593 void WriteHooksFile ( Module
& module
);
594 std::string
GetStubsFilename ( Module
& module
);
595 char* WriteStubbedSymbolToStubsFile ( char* buffer
,
596 const StubbedComponent
& component
,
597 const StubbedSymbol
& symbol
,
599 char* WriteStubbedComponentToStubsFile ( char* buffer
,
600 const StubbedComponent
& component
,
602 void WriteStubsFile ( Module
& module
);
603 std::string
GetStartupFilename ( Module
& module
);
604 bool IsUnknownCharacter ( char ch
);
605 std::string
GetTestDispatcherName ( std::string filename
);
606 bool IsTestFile ( std::string
& filename
) const;
607 void GetSourceFilenames ( string_list
& list
,
608 Module
& module
) const;
609 char* WriteTestDispatcherPrototypesToStartupFile ( char* buffer
,
611 char* WriteRegisterTestsFunctionToStartupFile ( char* buffer
,
613 void WriteStartupFile ( Module
& module
);
620 const Project
& project
;
623 WineResource ( const Project
& project
,
624 std::string bin2res
);
626 void UnpackResources ( bool verbose
);
628 bool IsSpecFile ( const File
& file
);
629 bool IsWineModule ( const Module
& module
);
630 bool IsResourceFile ( const File
& file
);
631 std::string
GetResourceFilename ( const Module
& module
);
632 void UnpackResourcesInModule ( Module
& module
,
640 SourceFile ( AutomaticDependency
* automaticDependency
,
641 const Module
& module
,
642 const std::string
& filename
,
644 bool isNonAutomaticDependency
);
645 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
647 std::string
Location () const;
648 std::vector
<SourceFile
*> files
;
649 AutomaticDependency
* automaticDependency
;
650 const Module
& module
;
651 std::string filename
;
652 std::string filenamePart
;
653 std::string directoryPart
;
654 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
655 bool isNonAutomaticDependency
;
656 std::string cachedDependencies
;
657 time_t lastWriteTime
;
658 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
659 SourceFile
* youngestFile
;
661 void GetDirectoryAndFilenameParts ();
664 void SkipWhitespace ();
665 bool ReadInclude ( std::string
& filename
,
666 bool& searchCurrentDirectory
,
668 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
669 SourceFile
* GetParentSourceFile ();
670 bool CanProcessFile ( const std::string
& extension
);
671 bool IsParentOf ( const SourceFile
* parent
,
672 const SourceFile
* child
);
679 class AutomaticDependency
681 friend class SourceFileTest
;
683 const Project
& project
;
685 AutomaticDependency ( const Project
& project
);
686 ~AutomaticDependency ();
687 std::string
GetFilename ( const std::string
& filename
);
688 bool LocateIncludedFile ( const std::string
& directory
,
689 const std::string
& includedFilename
,
690 std::string
& resolvedFilename
);
691 bool LocateIncludedFile ( SourceFile
* sourceFile
,
692 const Module
& module
,
693 const std::string
& includedFilename
,
694 bool searchCurrentDirectory
,
696 std::string
& resolvedFilename
);
697 SourceFile
* RetrieveFromCacheOrParse ( const Module
& module
,
698 const std::string
& filename
,
699 SourceFile
* parentSourceFile
);
700 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
701 void CheckAutomaticDependencies ( bool verbose
);
702 void CheckAutomaticDependenciesForModule ( Module
& module
,
705 void GetModulesToCheck ( Module
& module
, std::vector
<const Module
*>& modules
);
706 void CheckAutomaticDependencies ( const Module
& module
,
708 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
709 void GetIncludeDirectories ( std::vector
<Include
*>& includes
,
710 const Module
& module
,
711 Include
& currentDirectory
,
712 bool searchCurrentDirectory
);
713 void GetModuleFiles ( const Module
& module
,
714 std::vector
<File
*>& files
) const;
716 void ParseFiles ( const Module
& module
);
717 void ParseFile ( const Module
& module
,
719 std::map
<std::string
, SourceFile
*> sourcefile_map
;
726 const Project
& project
;
727 const Module
* module
;
728 const XMLElement
& node
;
730 std::string nameoncd
;
732 Bootstrap ( const Project
& project
,
733 const Module
* module
,
734 const XMLElement
& bootstrapNode
);
738 bool IsSupportedModuleType ( ModuleType type
);
746 const Project
& project
;
747 const XMLElement
& node
;
750 std::string nameoncd
;
753 CDFile ( const Project
& project
,
754 const XMLElement
& bootstrapNode
,
755 const std::string
& path
);
758 std::string
GetPath () const;
765 const Project
& project
;
766 const XMLElement
& node
;
772 InstallFile ( const Project
& project
,
773 const XMLElement
& bootstrapNode
,
774 const std::string
& path
);
777 std::string
GetPath () const;
784 const XMLElement
& node
;
785 const Module
& module
;
789 const XMLElement
& node
,
790 const Module
& module
,
796 class StubbedComponent
799 const Module
* module
;
800 const XMLElement
& node
;
802 std::vector
<StubbedSymbol
*> symbols
;
804 StubbedComponent ( const Module
* module_
,
805 const XMLElement
& stubbedComponentNode
);
806 ~StubbedComponent ();
808 void ProcessXMLSubElement ( const XMLElement
& e
);
815 const XMLElement
& node
;
818 std::string strippedName
;
820 StubbedSymbol ( const XMLElement
& stubbedSymbolNode
);
824 std::string
StripSymbol ( std::string symbol
);
828 class CompilationUnit
831 const Project
* project
;
832 const Module
* module
;
833 const XMLElement
* node
;
835 std::vector
<File
*> files
;
837 CompilationUnit ( File
* file
);
838 CompilationUnit ( const Project
* project
,
839 const Module
* module
,
840 const XMLElement
* node
);
843 bool IsGeneratedFile () const;
844 bool HasFileWithExtension ( const std::string
& extension
) const;
845 bool IsFirstFile () const;
846 FileLocation
* GetFilename ( Directory
* intermediateDirectory
) const;
847 std::string
GetSwitches () const;
851 class CompilationUnitSupportCode
854 const Project
& project
;
856 CompilationUnitSupportCode ( const Project
& project
);
857 ~CompilationUnitSupportCode ();
858 void Generate ( bool verbose
);
860 void GenerateForModule ( Module
& module
,
862 std::string
GetCompilationUnitFilename ( Module
& module
,
863 CompilationUnit
& compilationUnit
);
864 void WriteCompilationUnitFile ( Module
& module
,
865 CompilationUnit
& compilationUnit
);
872 Directory
* directory
;
873 std::string filename
;
874 FileLocation ( Directory
* directory
,
875 std::string filename
);
879 enum AutoRegisterType
889 const Project
& project
;
890 const Module
* module
;
891 const XMLElement
& node
;
892 std::string infSection
;
893 AutoRegisterType type
;
894 AutoRegister ( const Project
& project_
,
895 const Module
* module_
,
896 const XMLElement
& node_
);
900 bool IsSupportedModuleType ( ModuleType type
);
901 AutoRegisterType
GetAutoRegisterType( std::string type
);
906 class SysSetupGenerator
909 const Project
& project
;
910 SysSetupGenerator ( const Project
& project
);
911 ~SysSetupGenerator ();
914 std::string
GetDirectoryId ( const Module
& module
);
915 std::string
GetFlags ( const Module
& module
);
916 void Generate ( HINF inf
,
917 const Module
& module
);
922 InitializeEnvironment ();
925 Right ( const std::string
& s
, size_t n
);
928 Replace ( const std::string
& s
, const std::string
& find
, const std::string
& with
);
931 ChangeSeparator ( const std::string
& s
,
932 const char fromSeparator
,
933 const char toSeparator
);
936 FixSeparator ( const std::string
& s
);
939 FixSeparatorForSystemCommand ( const std::string
& s
);
942 DosSeparator ( const std::string
& s
);
946 const std::string
& filename
,
947 const std::string
& newExtension
);
951 const std::string
& location
,
952 const std::string
& path
,
953 const std::string
& att_value
);
956 GetExtension ( const std::string
& filename
);
959 GetDirectory ( const std::string
& filename
);
962 GetFilename ( const std::string
& filename
);
965 NormalizeFilename ( const std::string
& filename
);
968 ToLower ( std::string filename
);
970 #endif /* __RBUILD_H */