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 UseVSVersionInPath
;
146 bool UseVSConfigurationInPath
;
147 bool MakeHandlesInstallDirectories
;
148 bool GenerateProxyMakefilesInSourceTree
;
155 static std::string
GetVariable ( const std::string
& name
);
156 static std::string
GetIntermediatePath ();
157 static std::string
GetOutputPath ();
158 static std::string
GetInstallPath ();
159 static std::string
GetEnvironmentVariablePathOrDefault ( const std::string
& name
,
160 const std::string
& defaultValue
);
164 class FileSupportCode
167 static void WriteIfChanged ( char* outbuf
,
168 std::string filename
);
176 CompilationUnit
* compilationUnit
;
184 std::vector
<CompilationUnit
*> compilationUnits
;
185 std::vector
<File
*> files
;
186 std::vector
<Include
*> includes
;
187 std::vector
<Define
*> defines
;
188 std::vector
<Library
*> libraries
;
189 std::vector
<Property
*> properties
;
190 std::vector
<Module
*> modules
;
191 std::vector
<CompilerFlag
*> compilerFlags
;
192 std::vector
<If
*> ifs
;
196 void ExtractModules( std::vector
<Module
*> &modules
);
202 XMLElement
*node
, *head
;
205 const Configuration
& configuration
;
207 std::string makefile
;
208 XMLIncludes xmlbuildfiles
;
209 std::vector
<LinkerFlag
*> linkerFlags
;
210 std::vector
<CDFile
*> cdfiles
;
211 std::vector
<InstallFile
*> installfiles
;
212 std::vector
<Module
*> modules
;
213 IfableData non_if_data
;
215 Project ( const Configuration
& configuration
,
216 const std::string
& filename
);
218 void SetBackend ( Backend
* backend
) { _backend
= backend
; }
219 Backend
& GetBackend() { return *_backend
; }
220 void WriteConfigurationFile ();
221 void ExecuteInvocations ();
223 void ProcessXML ( const std::string
& path
);
224 Module
* LocateModule ( const std::string
& name
);
225 const Module
* LocateModule ( const std::string
& name
) const;
226 std::string
GetProjectFilename () const;
227 std::string
ResolveProperties ( const std::string
& s
) const;
229 std::string
ResolveNextProperty ( std::string
& s
) const;
230 const Property
* LookupProperty ( const std::string
& name
) const;
231 void SetConfigurationOption ( char* s
,
233 std::string
* alternativeName
);
234 void SetConfigurationOption ( char* s
,
237 void ProcessXMLSubElement ( const XMLElement
& e
,
238 const std::string
& path
,
239 ParseContext
& parseContext
);
241 // disable copy semantics
242 Project ( const Project
& );
243 Project
& operator = ( const Project
& );
254 KernelModeDriver
= 5,
286 const Project
& project
;
287 const XMLElement
& node
;
288 std::string xmlbuildFile
;
291 std::string extension
;
292 std::string baseaddress
;
296 ImportLibrary
* importLibrary
;
299 Bootstrap
* bootstrap
;
300 AutoRegister
* autoRegister
;
301 IfableData non_if_data
;
302 std::vector
<Invoke
*> invocations
;
303 std::vector
<Dependency
*> dependencies
;
304 std::vector
<CompilerFlag
*> compilerFlags
;
305 std::vector
<LinkerFlag
*> linkerFlags
;
306 std::vector
<StubbedComponent
*> stubbedComponents
;
307 LinkerScript
* linkerScript
;
312 std::string installBase
;
313 std::string installName
;
314 std::string aliasedModuleName
;
319 Module ( const Project
& project
,
320 const XMLElement
& moduleNode
,
321 const std::string
& modulePath
);
323 ModuleType
GetModuleType ( const std::string
& location
,
324 const XMLAttribute
& attribute
);
325 bool HasImportLibrary () const;
327 bool GenerateInOutputTree () const;
328 std::string
GetTargetName () const; // "foo.exe"
329 std::string
GetDependencyPath () const; // "path/foo.exe" or "path/libfoo.a"
330 std::string
GetBasePath () const; // "path"
331 std::string
GetPath () const; // "path/foo.exe"
332 std::string
GetPathWithPrefix ( const std::string
& prefix
) const; // "path/prefixfoo.exe"
333 std::string
GetPathToBaseDir() const; // "../" offset to rootdirectory
334 std::string
GetEntryPoint(bool leadingUnderscore
) const;
335 void GetTargets ( string_list
& ) const;
336 std::string
GetInvocationTarget ( const int index
) const;
337 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
338 void InvokeModule () const;
340 void GetSourceFilenames ( string_list
& list
,
341 bool includeGeneratedFiles
) const;
343 std::string
GetDefaultModuleExtension () const;
344 std::string
GetDefaultModuleEntrypoint () const;
345 std::string
GetDefaultModuleBaseaddress () const;
346 std::string entrypoint
;
347 void ProcessXMLSubElement ( const XMLElement
& e
,
348 const std::string
& path
,
349 ParseContext
& parseContext
);
356 const Project
& project
;
357 const Module
* module
;
358 const XMLElement
* node
;
359 const Module
* baseModule
;
360 std::string directory
;
361 std::string basePath
;
363 Include ( const Project
& project
,
364 const XMLElement
* includeNode
);
365 Include ( const Project
& project
,
366 const Module
* module
,
367 const XMLElement
* includeNode
);
368 Include ( const Project
& project
,
369 std::string directory
,
370 std::string basePath
);
380 const Project
& project
;
381 const Module
* module
;
382 const XMLElement
& node
;
386 Define ( const Project
& project
,
387 const XMLElement
& defineNode
);
388 Define ( const Project
& project
,
389 const Module
* module
,
390 const XMLElement
& defineNode
);
403 std::string switches
;
404 bool isPreCompiledHeader
;
406 File ( const std::string
& _name
,
408 std::string _switches
,
409 bool _isPreCompiledHeader
);
418 const XMLElement
& node
;
419 const Module
& module
;
421 const Module
* importedModule
;
423 Library ( const XMLElement
& _node
,
424 const Module
& _module
,
425 const std::string
& _name
);
434 const XMLElement
& node
;
435 const Module
& module
;
436 const Module
* invokeModule
;
437 std::vector
<InvokeFile
*> input
;
438 std::vector
<InvokeFile
*> output
;
440 Invoke ( const XMLElement
& _node
,
441 const Module
& _module
);
444 void GetTargets ( string_list
& targets
) const;
445 std::string
GetParameters () const;
447 void ProcessXMLSubElement ( const XMLElement
& e
);
448 void ProcessXMLSubElementInput ( const XMLElement
& e
);
449 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
456 const XMLElement
& node
;
458 std::string switches
;
460 InvokeFile ( const XMLElement
& _node
,
461 const std::string
& _name
);
470 const XMLElement
& node
;
471 const Module
& module
;
472 const Module
* dependencyModule
;
474 Dependency ( const XMLElement
& _node
,
475 const Module
& _module
);
484 const XMLElement
& node
;
485 const Module
& module
;
486 std::string basename
;
487 std::string definition
;
489 ImportLibrary ( const XMLElement
& _node
,
490 const Module
& module
);
499 const XMLElement
& node
;
500 const Project
& project
;
501 const Module
* module
;
503 std::string property
, value
;
506 If ( const XMLElement
& node_
,
507 const Project
& project_
,
508 const Module
* module_
,
509 const bool negated_
= false );
519 const Project
& project
;
520 const Module
* module
;
521 const XMLElement
& node
;
524 CompilerFlag ( const Project
& project
,
525 const XMLElement
& compilerFlagNode
);
526 CompilerFlag ( const Project
& project
,
527 const Module
* module
,
528 const XMLElement
& compilerFlagNode
);
539 const Project
& project
;
540 const Module
* module
;
541 const XMLElement
& node
;
544 LinkerFlag ( const Project
& project
,
545 const XMLElement
& linkerFlagNode
);
546 LinkerFlag ( const Project
& project
,
547 const Module
* module
,
548 const XMLElement
& linkerFlagNode
);
559 const Project
& project
;
560 const Module
* module
;
561 const XMLElement
& node
;
562 const Module
* baseModule
;
563 std::string directory
;
564 std::string basePath
;
566 LinkerScript ( const Project
& project
,
567 const Module
* module
,
568 const XMLElement
& node
);
577 const XMLElement
& node
;
578 const Project
& project
;
579 const Module
* module
;
580 std::string name
, value
;
582 Property ( const XMLElement
& node_
,
583 const Project
& project_
,
584 const Module
* module_
);
590 class TestSupportCode
593 const Project
& project
;
595 TestSupportCode ( const Project
& project
);
597 void GenerateTestSupportCode ( bool verbose
);
599 bool IsTestModule ( const Module
& module
);
600 void GenerateTestSupportCodeForModule ( Module
& module
,
602 std::string
GetHooksFilename ( Module
& module
);
603 char* WriteStubbedSymbolToHooksFile ( char* buffer
,
604 const StubbedComponent
& component
,
605 const StubbedSymbol
& symbol
);
606 char* WriteStubbedComponentToHooksFile ( char* buffer
,
607 const StubbedComponent
& component
);
608 void WriteHooksFile ( Module
& module
);
609 std::string
GetStubsFilename ( Module
& module
);
610 char* WriteStubbedSymbolToStubsFile ( char* buffer
,
611 const StubbedComponent
& component
,
612 const StubbedSymbol
& symbol
,
614 char* WriteStubbedComponentToStubsFile ( char* buffer
,
615 const StubbedComponent
& component
,
617 void WriteStubsFile ( Module
& module
);
618 std::string
GetStartupFilename ( Module
& module
);
619 bool IsUnknownCharacter ( char ch
);
620 std::string
GetTestDispatcherName ( std::string filename
);
621 bool IsTestFile ( std::string
& filename
) const;
622 void GetSourceFilenames ( string_list
& list
,
623 Module
& module
) const;
624 char* WriteTestDispatcherPrototypesToStartupFile ( char* buffer
,
626 char* WriteRegisterTestsFunctionToStartupFile ( char* buffer
,
628 void WriteStartupFile ( Module
& module
);
635 const Project
& project
;
638 WineResource ( const Project
& project
,
639 std::string bin2res
);
641 void UnpackResources ( bool verbose
);
643 bool IsSpecFile ( const File
& file
);
644 bool IsWineModule ( const Module
& module
);
645 bool IsResourceFile ( const File
& file
);
646 std::string
GetResourceFilename ( const Module
& module
);
647 void UnpackResourcesInModule ( Module
& module
,
655 SourceFile ( AutomaticDependency
* automaticDependency
,
656 const Module
& module
,
657 const std::string
& filename
,
659 bool isNonAutomaticDependency
);
660 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
662 std::string
Location () const;
663 std::vector
<SourceFile
*> files
;
664 AutomaticDependency
* automaticDependency
;
665 const Module
& module
;
666 std::string filename
;
667 std::string filenamePart
;
668 std::string directoryPart
;
669 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
670 bool isNonAutomaticDependency
;
671 std::string cachedDependencies
;
672 time_t lastWriteTime
;
673 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
674 SourceFile
* youngestFile
;
676 void GetDirectoryAndFilenameParts ();
679 void SkipWhitespace ();
680 bool ReadInclude ( std::string
& filename
,
681 bool& searchCurrentDirectory
,
683 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
684 SourceFile
* GetParentSourceFile ();
685 bool CanProcessFile ( const std::string
& extension
);
686 bool IsParentOf ( const SourceFile
* parent
,
687 const SourceFile
* child
);
694 class AutomaticDependency
696 friend class SourceFileTest
;
698 const Project
& project
;
700 AutomaticDependency ( const Project
& project
);
701 ~AutomaticDependency ();
702 std::string
GetFilename ( const std::string
& filename
);
703 bool LocateIncludedFile ( const std::string
& directory
,
704 const std::string
& includedFilename
,
705 std::string
& resolvedFilename
);
706 bool LocateIncludedFile ( SourceFile
* sourceFile
,
707 const Module
& module
,
708 const std::string
& includedFilename
,
709 bool searchCurrentDirectory
,
711 std::string
& resolvedFilename
);
712 SourceFile
* RetrieveFromCacheOrParse ( const Module
& module
,
713 const std::string
& filename
,
714 SourceFile
* parentSourceFile
);
715 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
716 void CheckAutomaticDependencies ( bool verbose
);
717 void CheckAutomaticDependenciesForModule ( Module
& module
,
720 void GetModulesToCheck ( Module
& module
, std::vector
<const Module
*>& modules
);
721 void CheckAutomaticDependencies ( const Module
& module
,
723 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
724 void GetIncludeDirectories ( std::vector
<Include
*>& includes
,
725 const Module
& module
,
726 Include
& currentDirectory
,
727 bool searchCurrentDirectory
);
728 void GetModuleFiles ( const Module
& module
,
729 std::vector
<File
*>& files
) const;
731 void ParseFiles ( const Module
& module
);
732 void ParseFile ( const Module
& module
,
734 std::map
<std::string
, SourceFile
*> sourcefile_map
;
741 const Project
& project
;
742 const Module
* module
;
743 const XMLElement
& node
;
745 std::string nameoncd
;
747 Bootstrap ( const Project
& project
,
748 const Module
* module
,
749 const XMLElement
& bootstrapNode
);
753 bool IsSupportedModuleType ( ModuleType type
);
761 const Project
& project
;
762 const XMLElement
& node
;
765 std::string nameoncd
;
768 CDFile ( const Project
& project
,
769 const XMLElement
& bootstrapNode
,
770 const std::string
& path
);
773 std::string
GetPath () const;
780 const Project
& project
;
781 const XMLElement
& node
;
787 InstallFile ( const Project
& project
,
788 const XMLElement
& bootstrapNode
,
789 const std::string
& path
);
792 std::string
GetPath () const;
799 const XMLElement
& node
;
800 const Module
& module
;
804 const XMLElement
& node
,
805 const Module
& module
,
811 class StubbedComponent
814 const Module
* module
;
815 const XMLElement
& node
;
817 std::vector
<StubbedSymbol
*> symbols
;
819 StubbedComponent ( const Module
* module_
,
820 const XMLElement
& stubbedComponentNode
);
821 ~StubbedComponent ();
823 void ProcessXMLSubElement ( const XMLElement
& e
);
830 const XMLElement
& node
;
833 std::string strippedName
;
835 StubbedSymbol ( const XMLElement
& stubbedSymbolNode
);
839 std::string
StripSymbol ( std::string symbol
);
843 class CompilationUnit
846 const Project
* project
;
847 const Module
* module
;
848 const XMLElement
* node
;
850 std::vector
<File
*> files
;
852 CompilationUnit ( File
* file
);
853 CompilationUnit ( const Project
* project
,
854 const Module
* module
,
855 const XMLElement
* node
);
858 bool IsGeneratedFile () const;
859 bool HasFileWithExtension ( const std::string
& extension
) const;
860 bool IsFirstFile () const;
861 FileLocation
* GetFilename ( Directory
* intermediateDirectory
) const;
862 std::string
GetSwitches () const;
866 class CompilationUnitSupportCode
869 const Project
& project
;
871 CompilationUnitSupportCode ( const Project
& project
);
872 ~CompilationUnitSupportCode ();
873 void Generate ( bool verbose
);
875 void GenerateForModule ( Module
& module
,
877 std::string
GetCompilationUnitFilename ( Module
& module
,
878 CompilationUnit
& compilationUnit
);
879 void WriteCompilationUnitFile ( Module
& module
,
880 CompilationUnit
& compilationUnit
);
887 Directory
* directory
;
888 std::string filename
;
889 FileLocation ( Directory
* directory
,
890 std::string filename
);
894 enum AutoRegisterType
904 const Project
& project
;
905 const Module
* module
;
906 const XMLElement
& node
;
907 std::string infSection
;
908 AutoRegisterType type
;
909 AutoRegister ( const Project
& project_
,
910 const Module
* module_
,
911 const XMLElement
& node_
);
915 bool IsSupportedModuleType ( ModuleType type
);
916 AutoRegisterType
GetAutoRegisterType( std::string type
);
921 class SysSetupGenerator
924 const Project
& project
;
925 SysSetupGenerator ( const Project
& project
);
926 ~SysSetupGenerator ();
929 std::string
GetDirectoryId ( const Module
& module
);
930 std::string
GetFlags ( const Module
& module
);
931 void Generate ( HINF inf
,
932 const Module
& module
);
937 InitializeEnvironment ();
940 Right ( const std::string
& s
, size_t n
);
943 Replace ( const std::string
& s
, const std::string
& find
, const std::string
& with
);
946 ChangeSeparator ( const std::string
& s
,
947 const char fromSeparator
,
948 const char toSeparator
);
951 FixSeparator ( const std::string
& s
);
954 FixSeparatorForSystemCommand ( const std::string
& s
);
957 DosSeparator ( const std::string
& s
);
961 const std::string
& filename
,
962 const std::string
& newExtension
);
966 const std::string
& location
,
967 const std::string
& path
,
968 const std::string
& att_value
);
971 GetExtension ( const std::string
& filename
);
974 GetDirectory ( const std::string
& filename
);
977 GetFilename ( const std::string
& filename
);
980 NormalizeFilename ( const std::string
& filename
);
983 ToLower ( std::string filename
);
985 #endif /* __RBUILD_H */