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
<Module
*> modules
;
187 std::vector
<CompilerFlag
*> compilerFlags
;
188 std::vector
<If
*> ifs
;
192 void ExtractModules( std::vector
<Module
*> &modules
);
198 XMLElement
*node
, *head
;
201 const Configuration
& configuration
;
203 std::string makefile
;
204 XMLIncludes xmlbuildfiles
;
205 std::vector
<LinkerFlag
*> linkerFlags
;
206 std::vector
<CDFile
*> cdfiles
;
207 std::vector
<InstallFile
*> installfiles
;
208 std::vector
<Module
*> modules
;
209 IfableData non_if_data
;
211 Project ( const Configuration
& configuration
,
212 const std::string
& filename
);
214 void SetBackend ( Backend
* backend
) { _backend
= backend
; }
215 Backend
& GetBackend() { return *_backend
; }
216 void WriteConfigurationFile ();
217 void ExecuteInvocations ();
219 void ProcessXML ( const std::string
& path
);
220 Module
* LocateModule ( const std::string
& name
);
221 const Module
* LocateModule ( const std::string
& name
) const;
222 std::string
GetProjectFilename () const;
223 std::string
ResolveProperties ( const std::string
& s
) const;
225 std::string
ResolveNextProperty ( std::string
& s
) const;
226 const Property
* LookupProperty ( const std::string
& name
) const;
227 void SetConfigurationOption ( char* s
,
229 std::string
* alternativeName
);
230 void SetConfigurationOption ( char* s
,
233 void ProcessXMLSubElement ( const XMLElement
& e
,
234 const std::string
& path
,
235 ParseContext
& parseContext
);
237 // disable copy semantics
238 Project ( const Project
& );
239 Project
& operator = ( const Project
& );
250 KernelModeDriver
= 5,
277 const Project
& project
;
278 const XMLElement
& node
;
279 std::string xmlbuildFile
;
282 std::string extension
;
283 std::string entrypoint
;
284 std::string baseaddress
;
288 ImportLibrary
* importLibrary
;
291 Bootstrap
* bootstrap
;
292 AutoRegister
* autoRegister
;
293 IfableData non_if_data
;
294 std::vector
<Invoke
*> invocations
;
295 std::vector
<Dependency
*> dependencies
;
296 std::vector
<CompilerFlag
*> compilerFlags
;
297 std::vector
<LinkerFlag
*> linkerFlags
;
298 std::vector
<StubbedComponent
*> stubbedComponents
;
299 LinkerScript
* linkerScript
;
304 std::string installBase
;
305 std::string installName
;
306 std::string aliasedModuleName
;
311 Module ( const Project
& project
,
312 const XMLElement
& moduleNode
,
313 const std::string
& modulePath
);
315 ModuleType
GetModuleType ( const std::string
& location
,
316 const XMLAttribute
& attribute
);
317 bool HasImportLibrary () const;
319 bool GenerateInOutputTree () const;
320 std::string
GetTargetName () const; // "foo.exe"
321 std::string
GetDependencyPath () const; // "path/foo.exe" or "path/libfoo.a"
322 std::string
GetBasePath () const; // "path"
323 std::string
GetPath () const; // "path/foo.exe"
324 std::string
GetPathWithPrefix ( const std::string
& prefix
) const; // "path/prefixfoo.exe"
325 std::string
GetPathToBaseDir() const; // "../" offset to rootdirectory
326 void GetTargets ( string_list
& ) const;
327 std::string
GetInvocationTarget ( const int index
) const;
328 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
329 void InvokeModule () const;
331 void GetSourceFilenames ( string_list
& list
,
332 bool includeGeneratedFiles
) const;
334 std::string
GetDefaultModuleExtension () const;
335 std::string
GetDefaultModuleEntrypoint () const;
336 std::string
GetDefaultModuleBaseaddress () const;
337 void ProcessXMLSubElement ( const XMLElement
& e
,
338 const std::string
& path
,
339 ParseContext
& parseContext
);
346 const Project
& project
;
347 const Module
* module
;
348 const XMLElement
* node
;
349 const Module
* baseModule
;
350 std::string directory
;
351 std::string basePath
;
353 Include ( const Project
& project
,
354 const XMLElement
* includeNode
);
355 Include ( const Project
& project
,
356 const Module
* module
,
357 const XMLElement
* includeNode
);
358 Include ( const Project
& project
,
359 std::string directory
,
360 std::string basePath
);
370 const Project
& project
;
371 const Module
* module
;
372 const XMLElement
& node
;
376 Define ( const Project
& project
,
377 const XMLElement
& defineNode
);
378 Define ( const Project
& project
,
379 const Module
* module
,
380 const XMLElement
& defineNode
);
393 std::string switches
;
394 bool isPreCompiledHeader
;
396 File ( const std::string
& _name
,
398 std::string _switches
,
399 bool _isPreCompiledHeader
);
408 const XMLElement
& node
;
409 const Module
& module
;
411 const Module
* importedModule
;
413 Library ( const XMLElement
& _node
,
414 const Module
& _module
,
415 const std::string
& _name
);
424 const XMLElement
& node
;
425 const Module
& module
;
426 const Module
* invokeModule
;
427 std::vector
<InvokeFile
*> input
;
428 std::vector
<InvokeFile
*> output
;
430 Invoke ( const XMLElement
& _node
,
431 const Module
& _module
);
434 void GetTargets ( string_list
& targets
) const;
435 std::string
GetParameters () const;
437 void ProcessXMLSubElement ( const XMLElement
& e
);
438 void ProcessXMLSubElementInput ( const XMLElement
& e
);
439 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
446 const XMLElement
& node
;
448 std::string switches
;
450 InvokeFile ( const XMLElement
& _node
,
451 const std::string
& _name
);
460 const XMLElement
& node
;
461 const Module
& module
;
462 const Module
* dependencyModule
;
464 Dependency ( const XMLElement
& _node
,
465 const Module
& _module
);
474 const XMLElement
& node
;
475 const Module
& module
;
476 std::string basename
;
477 std::string definition
;
479 ImportLibrary ( const XMLElement
& _node
,
480 const Module
& module
);
489 const XMLElement
& node
;
490 const Project
& project
;
491 const Module
* module
;
493 std::string property
, value
;
496 If ( const XMLElement
& node_
,
497 const Project
& project_
,
498 const Module
* module_
,
499 const bool negated_
= false );
509 const Project
& project
;
510 const Module
* module
;
511 const XMLElement
& node
;
514 CompilerFlag ( const Project
& project
,
515 const XMLElement
& compilerFlagNode
);
516 CompilerFlag ( const Project
& project
,
517 const Module
* module
,
518 const XMLElement
& compilerFlagNode
);
529 const Project
& project
;
530 const Module
* module
;
531 const XMLElement
& node
;
534 LinkerFlag ( const Project
& project
,
535 const XMLElement
& linkerFlagNode
);
536 LinkerFlag ( const Project
& project
,
537 const Module
* module
,
538 const XMLElement
& linkerFlagNode
);
549 const Project
& project
;
550 const Module
* module
;
551 const XMLElement
& node
;
552 const Module
* baseModule
;
553 std::string directory
;
554 std::string basePath
;
556 LinkerScript ( const Project
& project
,
557 const Module
* module
,
558 const XMLElement
& node
);
567 const XMLElement
& node
;
568 const Project
& project
;
569 const Module
* module
;
570 std::string name
, value
;
572 Property ( const XMLElement
& node_
,
573 const Project
& project_
,
574 const Module
* module_
);
580 class TestSupportCode
583 const Project
& project
;
585 TestSupportCode ( const Project
& project
);
587 void GenerateTestSupportCode ( bool verbose
);
589 bool IsTestModule ( const Module
& module
);
590 void GenerateTestSupportCodeForModule ( Module
& module
,
592 std::string
GetHooksFilename ( Module
& module
);
593 char* WriteStubbedSymbolToHooksFile ( char* buffer
,
594 const StubbedComponent
& component
,
595 const StubbedSymbol
& symbol
);
596 char* WriteStubbedComponentToHooksFile ( char* buffer
,
597 const StubbedComponent
& component
);
598 void WriteHooksFile ( Module
& module
);
599 std::string
GetStubsFilename ( Module
& module
);
600 char* WriteStubbedSymbolToStubsFile ( char* buffer
,
601 const StubbedComponent
& component
,
602 const StubbedSymbol
& symbol
,
604 char* WriteStubbedComponentToStubsFile ( char* buffer
,
605 const StubbedComponent
& component
,
607 void WriteStubsFile ( Module
& module
);
608 std::string
GetStartupFilename ( Module
& module
);
609 bool IsUnknownCharacter ( char ch
);
610 std::string
GetTestDispatcherName ( std::string filename
);
611 bool IsTestFile ( std::string
& filename
) const;
612 void GetSourceFilenames ( string_list
& list
,
613 Module
& module
) const;
614 char* WriteTestDispatcherPrototypesToStartupFile ( char* buffer
,
616 char* WriteRegisterTestsFunctionToStartupFile ( char* buffer
,
618 void WriteStartupFile ( Module
& module
);
625 const Project
& project
;
628 WineResource ( const Project
& project
,
629 std::string bin2res
);
631 void UnpackResources ( bool verbose
);
633 bool IsSpecFile ( const File
& file
);
634 bool IsWineModule ( const Module
& module
);
635 bool IsResourceFile ( const File
& file
);
636 std::string
GetResourceFilename ( const Module
& module
);
637 void UnpackResourcesInModule ( Module
& module
,
645 SourceFile ( AutomaticDependency
* automaticDependency
,
646 const Module
& module
,
647 const std::string
& filename
,
649 bool isNonAutomaticDependency
);
650 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
652 std::string
Location () const;
653 std::vector
<SourceFile
*> files
;
654 AutomaticDependency
* automaticDependency
;
655 const Module
& module
;
656 std::string filename
;
657 std::string filenamePart
;
658 std::string directoryPart
;
659 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
660 bool isNonAutomaticDependency
;
661 std::string cachedDependencies
;
662 time_t lastWriteTime
;
663 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
664 SourceFile
* youngestFile
;
666 void GetDirectoryAndFilenameParts ();
669 void SkipWhitespace ();
670 bool ReadInclude ( std::string
& filename
,
671 bool& searchCurrentDirectory
,
673 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
674 SourceFile
* GetParentSourceFile ();
675 bool CanProcessFile ( const std::string
& extension
);
676 bool IsParentOf ( const SourceFile
* parent
,
677 const SourceFile
* child
);
684 class AutomaticDependency
686 friend class SourceFileTest
;
688 const Project
& project
;
690 AutomaticDependency ( const Project
& project
);
691 ~AutomaticDependency ();
692 std::string
GetFilename ( const std::string
& filename
);
693 bool LocateIncludedFile ( const std::string
& directory
,
694 const std::string
& includedFilename
,
695 std::string
& resolvedFilename
);
696 bool LocateIncludedFile ( SourceFile
* sourceFile
,
697 const Module
& module
,
698 const std::string
& includedFilename
,
699 bool searchCurrentDirectory
,
701 std::string
& resolvedFilename
);
702 SourceFile
* RetrieveFromCacheOrParse ( const Module
& module
,
703 const std::string
& filename
,
704 SourceFile
* parentSourceFile
);
705 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
706 void CheckAutomaticDependencies ( bool verbose
);
707 void CheckAutomaticDependenciesForModule ( Module
& module
,
710 void GetModulesToCheck ( Module
& module
, std::vector
<const Module
*>& modules
);
711 void CheckAutomaticDependencies ( const Module
& module
,
713 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
714 void GetIncludeDirectories ( std::vector
<Include
*>& includes
,
715 const Module
& module
,
716 Include
& currentDirectory
,
717 bool searchCurrentDirectory
);
718 void GetModuleFiles ( const Module
& module
,
719 std::vector
<File
*>& files
) const;
721 void ParseFiles ( const Module
& module
);
722 void ParseFile ( const Module
& module
,
724 std::map
<std::string
, SourceFile
*> sourcefile_map
;
731 const Project
& project
;
732 const Module
* module
;
733 const XMLElement
& node
;
735 std::string nameoncd
;
737 Bootstrap ( const Project
& project
,
738 const Module
* module
,
739 const XMLElement
& bootstrapNode
);
743 bool IsSupportedModuleType ( ModuleType type
);
751 const Project
& project
;
752 const XMLElement
& node
;
755 std::string nameoncd
;
758 CDFile ( const Project
& project
,
759 const XMLElement
& bootstrapNode
,
760 const std::string
& path
);
763 std::string
GetPath () const;
770 const Project
& project
;
771 const XMLElement
& node
;
777 InstallFile ( const Project
& project
,
778 const XMLElement
& bootstrapNode
,
779 const std::string
& path
);
782 std::string
GetPath () const;
789 const XMLElement
& node
;
790 const Module
& module
;
794 const XMLElement
& node
,
795 const Module
& module
,
801 class StubbedComponent
804 const Module
* module
;
805 const XMLElement
& node
;
807 std::vector
<StubbedSymbol
*> symbols
;
809 StubbedComponent ( const Module
* module_
,
810 const XMLElement
& stubbedComponentNode
);
811 ~StubbedComponent ();
813 void ProcessXMLSubElement ( const XMLElement
& e
);
820 const XMLElement
& node
;
823 std::string strippedName
;
825 StubbedSymbol ( const XMLElement
& stubbedSymbolNode
);
829 std::string
StripSymbol ( std::string symbol
);
833 class CompilationUnit
836 const Project
* project
;
837 const Module
* module
;
838 const XMLElement
* node
;
840 std::vector
<File
*> files
;
842 CompilationUnit ( File
* file
);
843 CompilationUnit ( const Project
* project
,
844 const Module
* module
,
845 const XMLElement
* node
);
848 bool IsGeneratedFile () const;
849 bool HasFileWithExtension ( const std::string
& extension
) const;
850 bool IsFirstFile () const;
851 FileLocation
* GetFilename ( Directory
* intermediateDirectory
) const;
852 std::string
GetSwitches () const;
856 class CompilationUnitSupportCode
859 const Project
& project
;
861 CompilationUnitSupportCode ( const Project
& project
);
862 ~CompilationUnitSupportCode ();
863 void Generate ( bool verbose
);
865 void GenerateForModule ( Module
& module
,
867 std::string
GetCompilationUnitFilename ( Module
& module
,
868 CompilationUnit
& compilationUnit
);
869 void WriteCompilationUnitFile ( Module
& module
,
870 CompilationUnit
& compilationUnit
);
877 Directory
* directory
;
878 std::string filename
;
879 FileLocation ( Directory
* directory
,
880 std::string filename
);
884 enum AutoRegisterType
894 const Project
& project
;
895 const Module
* module
;
896 const XMLElement
& node
;
897 std::string infSection
;
898 AutoRegisterType type
;
899 AutoRegister ( const Project
& project_
,
900 const Module
* module_
,
901 const XMLElement
& node_
);
905 bool IsSupportedModuleType ( ModuleType type
);
906 AutoRegisterType
GetAutoRegisterType( std::string type
);
911 class SysSetupGenerator
914 const Project
& project
;
915 SysSetupGenerator ( const Project
& project
);
916 ~SysSetupGenerator ();
919 std::string
GetDirectoryId ( const Module
& module
);
920 std::string
GetFlags ( const Module
& module
);
921 void Generate ( HINF inf
,
922 const Module
& module
);
927 InitializeEnvironment ();
930 Right ( const std::string
& s
, size_t n
);
933 Replace ( const std::string
& s
, const std::string
& find
, const std::string
& with
);
936 ChangeSeparator ( const std::string
& s
,
937 const char fromSeparator
,
938 const char toSeparator
);
941 FixSeparator ( const std::string
& s
);
944 FixSeparatorForSystemCommand ( const std::string
& s
);
947 DosSeparator ( const std::string
& s
);
951 const std::string
& filename
,
952 const std::string
& newExtension
);
956 const std::string
& location
,
957 const std::string
& path
,
958 const std::string
& att_value
);
961 GetExtension ( const std::string
& filename
);
964 GetDirectory ( const std::string
& filename
);
967 GetFilename ( const std::string
& filename
);
970 NormalizeFilename ( const std::string
& filename
);
973 ToLower ( std::string filename
);
975 #endif /* __RBUILD_H */