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 std::string VSConfigurationType
;
145 bool MakeHandlesInstallDirectories
;
146 bool GenerateProxyMakefilesInSourceTree
;
153 static std::string
GetVariable ( const std::string
& name
);
154 static std::string
GetIntermediatePath ();
155 static std::string
GetOutputPath ();
156 static std::string
GetInstallPath ();
157 static std::string
GetEnvironmentVariablePathOrDefault ( const std::string
& name
,
158 const std::string
& defaultValue
);
162 class FileSupportCode
165 static void WriteIfChanged ( char* outbuf
,
166 std::string filename
);
174 CompilationUnit
* compilationUnit
;
182 std::vector
<CompilationUnit
*> compilationUnits
;
183 std::vector
<File
*> files
;
184 std::vector
<Include
*> includes
;
185 std::vector
<Define
*> defines
;
186 std::vector
<Library
*> libraries
;
187 std::vector
<Property
*> properties
;
188 std::vector
<Module
*> modules
;
189 std::vector
<CompilerFlag
*> compilerFlags
;
190 std::vector
<If
*> ifs
;
194 void ExtractModules( std::vector
<Module
*> &modules
);
200 XMLElement
*node
, *head
;
203 const Configuration
& configuration
;
205 std::string makefile
;
206 XMLIncludes xmlbuildfiles
;
207 std::vector
<LinkerFlag
*> linkerFlags
;
208 std::vector
<CDFile
*> cdfiles
;
209 std::vector
<InstallFile
*> installfiles
;
210 std::vector
<Module
*> modules
;
211 IfableData non_if_data
;
213 Project ( const Configuration
& configuration
,
214 const std::string
& filename
);
216 void SetBackend ( Backend
* backend
) { _backend
= backend
; }
217 Backend
& GetBackend() { return *_backend
; }
218 void WriteConfigurationFile ();
219 void ExecuteInvocations ();
221 void ProcessXML ( const std::string
& path
);
222 Module
* LocateModule ( const std::string
& name
);
223 const Module
* LocateModule ( const std::string
& name
) const;
224 std::string
GetProjectFilename () const;
225 std::string
ResolveProperties ( const std::string
& s
) const;
227 std::string
ResolveNextProperty ( std::string
& s
) const;
228 const Property
* LookupProperty ( const std::string
& name
) const;
229 void SetConfigurationOption ( char* s
,
231 std::string
* alternativeName
);
232 void SetConfigurationOption ( char* s
,
235 void ProcessXMLSubElement ( const XMLElement
& e
,
236 const std::string
& path
,
237 ParseContext
& parseContext
);
239 // disable copy semantics
240 Project ( const Project
& );
241 Project
& operator = ( const Project
& );
252 KernelModeDriver
= 5,
281 const Project
& project
;
282 const XMLElement
& node
;
283 std::string xmlbuildFile
;
286 std::string extension
;
287 std::string entrypoint
;
288 std::string baseaddress
;
292 ImportLibrary
* importLibrary
;
295 Bootstrap
* bootstrap
;
296 AutoRegister
* autoRegister
;
297 IfableData non_if_data
;
298 std::vector
<Invoke
*> invocations
;
299 std::vector
<Dependency
*> dependencies
;
300 std::vector
<CompilerFlag
*> compilerFlags
;
301 std::vector
<LinkerFlag
*> linkerFlags
;
302 std::vector
<StubbedComponent
*> stubbedComponents
;
303 LinkerScript
* linkerScript
;
308 std::string installBase
;
309 std::string installName
;
310 std::string aliasedModuleName
;
315 Module ( const Project
& project
,
316 const XMLElement
& moduleNode
,
317 const std::string
& modulePath
);
319 ModuleType
GetModuleType ( const std::string
& location
,
320 const XMLAttribute
& attribute
);
321 bool HasImportLibrary () const;
323 bool GenerateInOutputTree () const;
324 std::string
GetTargetName () const; // "foo.exe"
325 std::string
GetDependencyPath () const; // "path/foo.exe" or "path/libfoo.a"
326 std::string
GetBasePath () const; // "path"
327 std::string
GetPath () const; // "path/foo.exe"
328 std::string
GetPathWithPrefix ( const std::string
& prefix
) const; // "path/prefixfoo.exe"
329 std::string
GetPathToBaseDir() const; // "../" offset to rootdirectory
330 void GetTargets ( string_list
& ) const;
331 std::string
GetInvocationTarget ( const int index
) const;
332 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
333 void InvokeModule () const;
335 void GetSourceFilenames ( string_list
& list
,
336 bool includeGeneratedFiles
) const;
338 std::string
GetDefaultModuleExtension () const;
339 std::string
GetDefaultModuleEntrypoint () const;
340 std::string
GetDefaultModuleBaseaddress () const;
341 void ProcessXMLSubElement ( const XMLElement
& e
,
342 const std::string
& path
,
343 ParseContext
& parseContext
);
350 const Project
& project
;
351 const Module
* module
;
352 const XMLElement
* node
;
353 const Module
* baseModule
;
354 std::string directory
;
355 std::string basePath
;
357 Include ( const Project
& project
,
358 const XMLElement
* includeNode
);
359 Include ( const Project
& project
,
360 const Module
* module
,
361 const XMLElement
* includeNode
);
362 Include ( const Project
& project
,
363 std::string directory
,
364 std::string basePath
);
374 const Project
& project
;
375 const Module
* module
;
376 const XMLElement
& node
;
380 Define ( const Project
& project
,
381 const XMLElement
& defineNode
);
382 Define ( const Project
& project
,
383 const Module
* module
,
384 const XMLElement
& defineNode
);
397 std::string switches
;
398 bool isPreCompiledHeader
;
400 File ( const std::string
& _name
,
402 std::string _switches
,
403 bool _isPreCompiledHeader
);
412 const XMLElement
& node
;
413 const Module
& module
;
415 const Module
* importedModule
;
417 Library ( const XMLElement
& _node
,
418 const Module
& _module
,
419 const std::string
& _name
);
428 const XMLElement
& node
;
429 const Module
& module
;
430 const Module
* invokeModule
;
431 std::vector
<InvokeFile
*> input
;
432 std::vector
<InvokeFile
*> output
;
434 Invoke ( const XMLElement
& _node
,
435 const Module
& _module
);
438 void GetTargets ( string_list
& targets
) const;
439 std::string
GetParameters () const;
441 void ProcessXMLSubElement ( const XMLElement
& e
);
442 void ProcessXMLSubElementInput ( const XMLElement
& e
);
443 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
450 const XMLElement
& node
;
452 std::string switches
;
454 InvokeFile ( const XMLElement
& _node
,
455 const std::string
& _name
);
464 const XMLElement
& node
;
465 const Module
& module
;
466 const Module
* dependencyModule
;
468 Dependency ( const XMLElement
& _node
,
469 const Module
& _module
);
478 const XMLElement
& node
;
479 const Module
& module
;
480 std::string basename
;
481 std::string definition
;
483 ImportLibrary ( const XMLElement
& _node
,
484 const Module
& module
);
493 const XMLElement
& node
;
494 const Project
& project
;
495 const Module
* module
;
497 std::string property
, value
;
500 If ( const XMLElement
& node_
,
501 const Project
& project_
,
502 const Module
* module_
,
503 const bool negated_
= false );
513 const Project
& project
;
514 const Module
* module
;
515 const XMLElement
& node
;
518 CompilerFlag ( const Project
& project
,
519 const XMLElement
& compilerFlagNode
);
520 CompilerFlag ( const Project
& project
,
521 const Module
* module
,
522 const XMLElement
& compilerFlagNode
);
533 const Project
& project
;
534 const Module
* module
;
535 const XMLElement
& node
;
538 LinkerFlag ( const Project
& project
,
539 const XMLElement
& linkerFlagNode
);
540 LinkerFlag ( const Project
& project
,
541 const Module
* module
,
542 const XMLElement
& linkerFlagNode
);
553 const Project
& project
;
554 const Module
* module
;
555 const XMLElement
& node
;
556 const Module
* baseModule
;
557 std::string directory
;
558 std::string basePath
;
560 LinkerScript ( const Project
& project
,
561 const Module
* module
,
562 const XMLElement
& node
);
571 const XMLElement
& node
;
572 const Project
& project
;
573 const Module
* module
;
574 std::string name
, value
;
576 Property ( const XMLElement
& node_
,
577 const Project
& project_
,
578 const Module
* module_
);
584 class TestSupportCode
587 const Project
& project
;
589 TestSupportCode ( const Project
& project
);
591 void GenerateTestSupportCode ( bool verbose
);
593 bool IsTestModule ( const Module
& module
);
594 void GenerateTestSupportCodeForModule ( Module
& module
,
596 std::string
GetHooksFilename ( Module
& module
);
597 char* WriteStubbedSymbolToHooksFile ( char* buffer
,
598 const StubbedComponent
& component
,
599 const StubbedSymbol
& symbol
);
600 char* WriteStubbedComponentToHooksFile ( char* buffer
,
601 const StubbedComponent
& component
);
602 void WriteHooksFile ( Module
& module
);
603 std::string
GetStubsFilename ( Module
& module
);
604 char* WriteStubbedSymbolToStubsFile ( char* buffer
,
605 const StubbedComponent
& component
,
606 const StubbedSymbol
& symbol
,
608 char* WriteStubbedComponentToStubsFile ( char* buffer
,
609 const StubbedComponent
& component
,
611 void WriteStubsFile ( Module
& module
);
612 std::string
GetStartupFilename ( Module
& module
);
613 bool IsUnknownCharacter ( char ch
);
614 std::string
GetTestDispatcherName ( std::string filename
);
615 bool IsTestFile ( std::string
& filename
) const;
616 void GetSourceFilenames ( string_list
& list
,
617 Module
& module
) const;
618 char* WriteTestDispatcherPrototypesToStartupFile ( char* buffer
,
620 char* WriteRegisterTestsFunctionToStartupFile ( char* buffer
,
622 void WriteStartupFile ( Module
& module
);
629 const Project
& project
;
632 WineResource ( const Project
& project
,
633 std::string bin2res
);
635 void UnpackResources ( bool verbose
);
637 bool IsSpecFile ( const File
& file
);
638 bool IsWineModule ( const Module
& module
);
639 bool IsResourceFile ( const File
& file
);
640 std::string
GetResourceFilename ( const Module
& module
);
641 void UnpackResourcesInModule ( Module
& module
,
649 SourceFile ( AutomaticDependency
* automaticDependency
,
650 const Module
& module
,
651 const std::string
& filename
,
653 bool isNonAutomaticDependency
);
654 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
656 std::string
Location () const;
657 std::vector
<SourceFile
*> files
;
658 AutomaticDependency
* automaticDependency
;
659 const Module
& module
;
660 std::string filename
;
661 std::string filenamePart
;
662 std::string directoryPart
;
663 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
664 bool isNonAutomaticDependency
;
665 std::string cachedDependencies
;
666 time_t lastWriteTime
;
667 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
668 SourceFile
* youngestFile
;
670 void GetDirectoryAndFilenameParts ();
673 void SkipWhitespace ();
674 bool ReadInclude ( std::string
& filename
,
675 bool& searchCurrentDirectory
,
677 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
678 SourceFile
* GetParentSourceFile ();
679 bool CanProcessFile ( const std::string
& extension
);
680 bool IsParentOf ( const SourceFile
* parent
,
681 const SourceFile
* child
);
688 class AutomaticDependency
690 friend class SourceFileTest
;
692 const Project
& project
;
694 AutomaticDependency ( const Project
& project
);
695 ~AutomaticDependency ();
696 std::string
GetFilename ( const std::string
& filename
);
697 bool LocateIncludedFile ( const std::string
& directory
,
698 const std::string
& includedFilename
,
699 std::string
& resolvedFilename
);
700 bool LocateIncludedFile ( SourceFile
* sourceFile
,
701 const Module
& module
,
702 const std::string
& includedFilename
,
703 bool searchCurrentDirectory
,
705 std::string
& resolvedFilename
);
706 SourceFile
* RetrieveFromCacheOrParse ( const Module
& module
,
707 const std::string
& filename
,
708 SourceFile
* parentSourceFile
);
709 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
710 void CheckAutomaticDependencies ( bool verbose
);
711 void CheckAutomaticDependenciesForModule ( Module
& module
,
714 void GetModulesToCheck ( Module
& module
, std::vector
<const Module
*>& modules
);
715 void CheckAutomaticDependencies ( const Module
& module
,
717 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
718 void GetIncludeDirectories ( std::vector
<Include
*>& includes
,
719 const Module
& module
,
720 Include
& currentDirectory
,
721 bool searchCurrentDirectory
);
722 void GetModuleFiles ( const Module
& module
,
723 std::vector
<File
*>& files
) const;
725 void ParseFiles ( const Module
& module
);
726 void ParseFile ( const Module
& module
,
728 std::map
<std::string
, SourceFile
*> sourcefile_map
;
735 const Project
& project
;
736 const Module
* module
;
737 const XMLElement
& node
;
739 std::string nameoncd
;
741 Bootstrap ( const Project
& project
,
742 const Module
* module
,
743 const XMLElement
& bootstrapNode
);
747 bool IsSupportedModuleType ( ModuleType type
);
755 const Project
& project
;
756 const XMLElement
& node
;
759 std::string nameoncd
;
762 CDFile ( const Project
& project
,
763 const XMLElement
& bootstrapNode
,
764 const std::string
& path
);
767 std::string
GetPath () const;
774 const Project
& project
;
775 const XMLElement
& node
;
781 InstallFile ( const Project
& project
,
782 const XMLElement
& bootstrapNode
,
783 const std::string
& path
);
786 std::string
GetPath () const;
793 const XMLElement
& node
;
794 const Module
& module
;
798 const XMLElement
& node
,
799 const Module
& module
,
805 class StubbedComponent
808 const Module
* module
;
809 const XMLElement
& node
;
811 std::vector
<StubbedSymbol
*> symbols
;
813 StubbedComponent ( const Module
* module_
,
814 const XMLElement
& stubbedComponentNode
);
815 ~StubbedComponent ();
817 void ProcessXMLSubElement ( const XMLElement
& e
);
824 const XMLElement
& node
;
827 std::string strippedName
;
829 StubbedSymbol ( const XMLElement
& stubbedSymbolNode
);
833 std::string
StripSymbol ( std::string symbol
);
837 class CompilationUnit
840 const Project
* project
;
841 const Module
* module
;
842 const XMLElement
* node
;
844 std::vector
<File
*> files
;
846 CompilationUnit ( File
* file
);
847 CompilationUnit ( const Project
* project
,
848 const Module
* module
,
849 const XMLElement
* node
);
852 bool IsGeneratedFile () const;
853 bool HasFileWithExtension ( const std::string
& extension
) const;
854 bool IsFirstFile () const;
855 FileLocation
* GetFilename ( Directory
* intermediateDirectory
) const;
856 std::string
GetSwitches () const;
860 class CompilationUnitSupportCode
863 const Project
& project
;
865 CompilationUnitSupportCode ( const Project
& project
);
866 ~CompilationUnitSupportCode ();
867 void Generate ( bool verbose
);
869 void GenerateForModule ( Module
& module
,
871 std::string
GetCompilationUnitFilename ( Module
& module
,
872 CompilationUnit
& compilationUnit
);
873 void WriteCompilationUnitFile ( Module
& module
,
874 CompilationUnit
& compilationUnit
);
881 Directory
* directory
;
882 std::string filename
;
883 FileLocation ( Directory
* directory
,
884 std::string filename
);
888 enum AutoRegisterType
898 const Project
& project
;
899 const Module
* module
;
900 const XMLElement
& node
;
901 std::string infSection
;
902 AutoRegisterType type
;
903 AutoRegister ( const Project
& project_
,
904 const Module
* module_
,
905 const XMLElement
& node_
);
909 bool IsSupportedModuleType ( ModuleType type
);
910 AutoRegisterType
GetAutoRegisterType( std::string type
);
915 class SysSetupGenerator
918 const Project
& project
;
919 SysSetupGenerator ( const Project
& project
);
920 ~SysSetupGenerator ();
923 std::string
GetDirectoryId ( const Module
& module
);
924 std::string
GetFlags ( const Module
& module
);
925 void Generate ( HINF inf
,
926 const Module
& module
);
931 InitializeEnvironment ();
934 Right ( const std::string
& s
, size_t n
);
937 Replace ( const std::string
& s
, const std::string
& find
, const std::string
& with
);
940 ChangeSeparator ( const std::string
& s
,
941 const char fromSeparator
,
942 const char toSeparator
);
945 FixSeparator ( const std::string
& s
);
948 FixSeparatorForSystemCommand ( const std::string
& s
);
951 DosSeparator ( const std::string
& s
);
955 const std::string
& filename
,
956 const std::string
& newExtension
);
960 const std::string
& location
,
961 const std::string
& path
,
962 const std::string
& att_value
);
965 GetExtension ( const std::string
& filename
);
968 GetDirectory ( const std::string
& filename
);
971 GetFilename ( const std::string
& filename
);
974 NormalizeFilename ( const std::string
& filename
);
977 ToLower ( std::string filename
);
979 #endif /* __RBUILD_H */