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>
39 #include "exception.h"
43 typedef std::vector
<std::string
> string_list
;
45 extern std::string ExePrefix
;
46 extern std::string ExePostfix
;
47 extern std::string sSep
;
48 extern std::string sBadSep
;
53 #define DEF_EXEPREFIX ""
54 #define DEF_EXEPOSTFIX ".exe"
56 #define DEF_CBAD_SEP '/'
58 #define DEF_SBAD_SEP "/"
60 #define DEF_EXEPREFIX "./"
61 #define DEF_EXEPOSTFIX ""
63 #define DEF_CBAD_SEP '\\'
65 #define DEF_SBAD_SEP "\\"
68 #define MS_VS_DEF_VERSION "7.10"
87 class TestSupportCode
;
89 class AutomaticDependency
;
94 class StubbedComponent
;
96 class CompilationUnit
;
100 class SourceFileTest
;
103 typedef std::map
<std::string
,Directory
*> directory_map
;
109 directory_map subdirs
;
110 Directory ( const std::string
& name
);
111 void Add ( const char* subdir
);
112 void GenerateTree ( const std::string
& parent
,
114 std::string
EscapeSpaces ( std::string path
);
115 void CreateRule ( FILE* f
,
116 const std::string
& parent
);
118 bool mkdir_p ( const char* path
);
119 std::string
ReplaceVariable ( std::string name
,
122 std::string
GetEnvironmentVariable ( const std::string
& name
);
123 void ResolveVariablesInPath ( char* buf
,
125 bool CreateDirectory ( std::string path
);
136 bool AutomaticDependencies
;
137 bool CheckDependenciesForModuleOnly
;
138 bool CompilationUnitsEnabled
;
139 std::string CheckDependenciesForModuleOnlyModule
;
140 std::string VSProjectVersion
;
141 bool MakeHandlesInstallDirectories
;
142 bool GenerateProxyMakefilesInSourceTree
;
148 static std::string
GetVariable ( const std::string
& name
);
149 static std::string
GetIntermediatePath ();
150 static std::string
GetOutputPath ();
151 static std::string
GetInstallPath ();
152 static std::string
GetEnvironmentVariablePathOrDefault ( const std::string
& name
,
153 const std::string
& defaultValue
);
157 class FileSupportCode
160 static void WriteIfChanged ( char* outbuf
,
161 std::string filename
);
169 CompilationUnit
* compilationUnit
;
177 std::vector
<CompilationUnit
*> compilationUnits
;
178 std::vector
<File
*> files
;
179 std::vector
<Include
*> includes
;
180 std::vector
<Define
*> defines
;
181 std::vector
<Library
*> libraries
;
182 std::vector
<Property
*> properties
;
183 std::vector
<CompilerFlag
*> compilerFlags
;
184 std::vector
<If
*> ifs
;
193 XMLElement
*node
, *head
;
195 const Configuration
& configuration
;
197 std::string makefile
;
198 XMLIncludes xmlbuildfiles
;
199 std::vector
<Module
*> modules
;
200 std::vector
<LinkerFlag
*> linkerFlags
;
201 std::vector
<CDFile
*> cdfiles
;
202 std::vector
<InstallFile
*> installfiles
;
203 IfableData non_if_data
;
205 Project ( const Configuration
& configuration
,
206 const std::string
& filename
);
208 void WriteConfigurationFile ();
209 void ExecuteInvocations ();
210 void ProcessXML ( const std::string
& path
);
211 Module
* LocateModule ( const std::string
& name
);
212 const Module
* LocateModule ( const std::string
& name
) const;
213 std::string
GetProjectFilename () const;
214 std::string
ResolveProperties ( const std::string
& s
) const;
216 std::string
ResolveNextProperty ( std::string
& s
) const;
217 const Property
* LookupProperty ( const std::string
& name
) const;
218 void SetConfigurationOption ( char* s
,
220 std::string
* alternativeName
);
221 void SetConfigurationOption ( char* s
,
224 void ProcessXMLSubElement ( const XMLElement
& e
,
225 const std::string
& path
,
226 ParseContext
& parseContext
);
228 // disable copy semantics
229 Project ( const Project
& );
230 Project
& operator = ( const Project
& );
241 KernelModeDriver
= 5,
267 const Project
& project
;
268 const XMLElement
& node
;
269 std::string xmlbuildFile
;
272 std::string extension
;
273 std::string entrypoint
;
274 std::string baseaddress
;
277 ImportLibrary
* importLibrary
;
280 Bootstrap
* bootstrap
;
281 AutoRegister
* autoRegister
;
282 IfableData non_if_data
;
283 std::vector
<Invoke
*> invocations
;
284 std::vector
<Dependency
*> dependencies
;
285 std::vector
<CompilerFlag
*> compilerFlags
;
286 std::vector
<LinkerFlag
*> linkerFlags
;
287 std::vector
<StubbedComponent
*> stubbedComponents
;
288 LinkerScript
* linkerScript
;
293 std::string installBase
;
294 std::string installName
;
295 std::string aliasedModuleName
;
300 Module ( const Project
& project
,
301 const XMLElement
& moduleNode
,
302 const std::string
& modulePath
);
304 ModuleType
GetModuleType ( const std::string
& location
,
305 const XMLAttribute
& attribute
);
306 bool HasImportLibrary () const;
308 bool GenerateInOutputTree () const;
309 std::string
GetTargetName () const; // "foo.exe"
310 std::string
GetDependencyPath () const; // "path/foo.exe" or "path/libfoo.a"
311 std::string
GetBasePath () const; // "path"
312 std::string
GetPath () const; // "path/foo.exe"
313 std::string
GetPathWithPrefix ( const std::string
& prefix
) const; // "path/prefixfoo.exe"
314 void GetTargets ( string_list
& ) const;
315 std::string
GetInvocationTarget ( const int index
) const;
316 bool HasFileWithExtension ( const IfableData
&, const std::string
& extension
) const;
317 void InvokeModule () const;
319 void GetSourceFilenames ( string_list
& list
,
320 bool includeGeneratedFiles
) const;
322 std::string
GetDefaultModuleExtension () const;
323 std::string
GetDefaultModuleEntrypoint () const;
324 std::string
GetDefaultModuleBaseaddress () const;
325 void ProcessXMLSubElement ( const XMLElement
& e
,
326 const std::string
& path
,
327 ParseContext
& parseContext
);
334 const Project
& project
;
335 const Module
* module
;
336 const XMLElement
* node
;
337 const Module
* baseModule
;
338 std::string directory
;
339 std::string basePath
;
341 Include ( const Project
& project
,
342 const XMLElement
* includeNode
);
343 Include ( const Project
& project
,
344 const Module
* module
,
345 const XMLElement
* includeNode
);
346 Include ( const Project
& project
,
347 std::string directory
,
348 std::string basePath
);
358 const Project
& project
;
359 const Module
* module
;
360 const XMLElement
& node
;
364 Define ( const Project
& project
,
365 const XMLElement
& defineNode
);
366 Define ( const Project
& project
,
367 const Module
* module
,
368 const XMLElement
& defineNode
);
381 std::string switches
;
382 bool isPreCompiledHeader
;
384 File ( const std::string
& _name
,
386 std::string _switches
,
387 bool _isPreCompiledHeader
);
396 const XMLElement
& node
;
397 const Module
& module
;
399 const Module
* importedModule
;
401 Library ( const XMLElement
& _node
,
402 const Module
& _module
,
403 const std::string
& _name
);
412 const XMLElement
& node
;
413 const Module
& module
;
414 const Module
* invokeModule
;
415 std::vector
<InvokeFile
*> input
;
416 std::vector
<InvokeFile
*> output
;
418 Invoke ( const XMLElement
& _node
,
419 const Module
& _module
);
422 void GetTargets ( string_list
& targets
) const;
423 std::string
GetParameters () const;
425 void ProcessXMLSubElement ( const XMLElement
& e
);
426 void ProcessXMLSubElementInput ( const XMLElement
& e
);
427 void ProcessXMLSubElementOutput ( const XMLElement
& e
);
434 const XMLElement
& node
;
436 std::string switches
;
438 InvokeFile ( const XMLElement
& _node
,
439 const std::string
& _name
);
448 const XMLElement
& node
;
449 const Module
& module
;
450 const Module
* dependencyModule
;
452 Dependency ( const XMLElement
& _node
,
453 const Module
& _module
);
462 const XMLElement
& node
;
463 const Module
& module
;
464 std::string basename
;
465 std::string definition
;
467 ImportLibrary ( const XMLElement
& _node
,
468 const Module
& module
);
477 const XMLElement
& node
;
478 const Project
& project
;
479 const Module
* module
;
481 std::string property
, value
;
484 If ( const XMLElement
& node_
,
485 const Project
& project_
,
486 const Module
* module_
,
487 const bool negated_
= false );
497 const Project
& project
;
498 const Module
* module
;
499 const XMLElement
& node
;
502 CompilerFlag ( const Project
& project
,
503 const XMLElement
& compilerFlagNode
);
504 CompilerFlag ( const Project
& project
,
505 const Module
* module
,
506 const XMLElement
& compilerFlagNode
);
517 const Project
& project
;
518 const Module
* module
;
519 const XMLElement
& node
;
522 LinkerFlag ( const Project
& project
,
523 const XMLElement
& linkerFlagNode
);
524 LinkerFlag ( const Project
& project
,
525 const Module
* module
,
526 const XMLElement
& linkerFlagNode
);
537 const Project
& project
;
538 const Module
* module
;
539 const XMLElement
& node
;
540 const Module
* baseModule
;
541 std::string directory
;
542 std::string basePath
;
544 LinkerScript ( const Project
& project
,
545 const Module
* module
,
546 const XMLElement
& node
);
555 const XMLElement
& node
;
556 const Project
& project
;
557 const Module
* module
;
558 std::string name
, value
;
560 Property ( const XMLElement
& node_
,
561 const Project
& project_
,
562 const Module
* module_
);
568 class TestSupportCode
571 const Project
& project
;
573 TestSupportCode ( const Project
& project
);
575 void GenerateTestSupportCode ( bool verbose
);
577 bool IsTestModule ( const Module
& module
);
578 void GenerateTestSupportCodeForModule ( Module
& module
,
580 std::string
GetHooksFilename ( Module
& module
);
581 char* WriteStubbedSymbolToHooksFile ( char* buffer
,
582 const StubbedComponent
& component
,
583 const StubbedSymbol
& symbol
);
584 char* WriteStubbedComponentToHooksFile ( char* buffer
,
585 const StubbedComponent
& component
);
586 void WriteHooksFile ( Module
& module
);
587 std::string
GetStubsFilename ( Module
& module
);
588 char* WriteStubbedSymbolToStubsFile ( char* buffer
,
589 const StubbedComponent
& component
,
590 const StubbedSymbol
& symbol
,
592 char* WriteStubbedComponentToStubsFile ( char* buffer
,
593 const StubbedComponent
& component
,
595 void WriteStubsFile ( Module
& module
);
596 std::string
GetStartupFilename ( Module
& module
);
597 bool IsUnknownCharacter ( char ch
);
598 std::string
GetTestDispatcherName ( std::string filename
);
599 bool IsTestFile ( std::string
& filename
) const;
600 void GetSourceFilenames ( string_list
& list
,
601 Module
& module
) const;
602 char* WriteTestDispatcherPrototypesToStartupFile ( char* buffer
,
604 char* WriteRegisterTestsFunctionToStartupFile ( char* buffer
,
606 void WriteStartupFile ( Module
& module
);
613 const Project
& project
;
616 WineResource ( const Project
& project
,
617 std::string bin2res
);
619 void UnpackResources ( bool verbose
);
621 bool IsSpecFile ( const File
& file
);
622 bool IsWineModule ( const Module
& module
);
623 bool IsResourceFile ( const File
& file
);
624 std::string
GetResourceFilename ( const Module
& module
);
625 void UnpackResourcesInModule ( Module
& module
,
633 SourceFile ( AutomaticDependency
* automaticDependency
,
634 const Module
& module
,
635 const std::string
& filename
,
637 bool isNonAutomaticDependency
);
638 SourceFile
* ParseFile ( const std::string
& normalizedFilename
);
640 std::string
Location () const;
641 std::vector
<SourceFile
*> files
;
642 AutomaticDependency
* automaticDependency
;
643 const Module
& module
;
644 std::string filename
;
645 std::string filenamePart
;
646 std::string directoryPart
;
647 std::vector
<SourceFile
*> parents
; /* List of files, this file is included from */
648 bool isNonAutomaticDependency
;
649 std::string cachedDependencies
;
650 time_t lastWriteTime
;
651 time_t youngestLastWriteTime
; /* Youngest last write time of this file and all children */
652 SourceFile
* youngestFile
;
654 void GetDirectoryAndFilenameParts ();
657 void SkipWhitespace ();
658 bool ReadInclude ( std::string
& filename
,
659 bool& searchCurrentDirectory
,
661 bool IsIncludedFrom ( const std::string
& normalizedFilename
);
662 SourceFile
* GetParentSourceFile ();
663 bool CanProcessFile ( const std::string
& extension
);
664 bool IsParentOf ( const SourceFile
* parent
,
665 const SourceFile
* child
);
672 class AutomaticDependency
674 friend class SourceFileTest
;
676 const Project
& project
;
678 AutomaticDependency ( const Project
& project
);
679 ~AutomaticDependency ();
680 std::string
GetFilename ( const std::string
& filename
);
681 bool LocateIncludedFile ( const std::string
& directory
,
682 const std::string
& includedFilename
,
683 std::string
& resolvedFilename
);
684 bool LocateIncludedFile ( SourceFile
* sourceFile
,
685 const Module
& module
,
686 const std::string
& includedFilename
,
687 bool searchCurrentDirectory
,
689 std::string
& resolvedFilename
);
690 SourceFile
* RetrieveFromCacheOrParse ( const Module
& module
,
691 const std::string
& filename
,
692 SourceFile
* parentSourceFile
);
693 SourceFile
* RetrieveFromCache ( const std::string
& filename
);
694 void CheckAutomaticDependencies ( bool verbose
);
695 void CheckAutomaticDependenciesForModule ( Module
& module
,
698 void GetModulesToCheck ( Module
& module
, std::vector
<const Module
*>& modules
);
699 void CheckAutomaticDependencies ( const Module
& module
,
701 void CheckAutomaticDependenciesForFile ( SourceFile
* sourceFile
);
702 void GetIncludeDirectories ( std::vector
<Include
*>& includes
,
703 const Module
& module
,
704 Include
& currentDirectory
,
705 bool searchCurrentDirectory
);
706 void GetModuleFiles ( const Module
& module
,
707 std::vector
<File
*>& files
) const;
709 void ParseFiles ( const Module
& module
);
710 void ParseFile ( const Module
& module
,
712 std::map
<std::string
, SourceFile
*> sourcefile_map
;
719 const Project
& project
;
720 const Module
* module
;
721 const XMLElement
& node
;
723 std::string nameoncd
;
725 Bootstrap ( const Project
& project
,
726 const Module
* module
,
727 const XMLElement
& bootstrapNode
);
731 bool IsSupportedModuleType ( ModuleType type
);
739 const Project
& project
;
740 const XMLElement
& node
;
743 std::string nameoncd
;
746 CDFile ( const Project
& project
,
747 const XMLElement
& bootstrapNode
,
748 const std::string
& path
);
751 std::string
GetPath () const;
758 const Project
& project
;
759 const XMLElement
& node
;
765 InstallFile ( const Project
& project
,
766 const XMLElement
& bootstrapNode
,
767 const std::string
& path
);
770 std::string
GetPath () const;
777 const XMLElement
& node
;
778 const Module
& module
;
782 const XMLElement
& node
,
783 const Module
& module
,
789 class StubbedComponent
792 const Module
* module
;
793 const XMLElement
& node
;
795 std::vector
<StubbedSymbol
*> symbols
;
797 StubbedComponent ( const Module
* module_
,
798 const XMLElement
& stubbedComponentNode
);
799 ~StubbedComponent ();
801 void ProcessXMLSubElement ( const XMLElement
& e
);
808 const XMLElement
& node
;
811 std::string strippedName
;
813 StubbedSymbol ( const XMLElement
& stubbedSymbolNode
);
817 std::string
StripSymbol ( std::string symbol
);
821 class CompilationUnit
824 const Project
* project
;
825 const Module
* module
;
826 const XMLElement
* node
;
828 std::vector
<File
*> files
;
830 CompilationUnit ( File
* file
);
831 CompilationUnit ( const Project
* project
,
832 const Module
* module
,
833 const XMLElement
* node
);
836 bool IsGeneratedFile () const;
837 bool HasFileWithExtension ( const std::string
& extension
) const;
838 bool IsFirstFile () const;
839 FileLocation
* GetFilename ( Directory
* intermediateDirectory
) const;
840 std::string
GetSwitches () const;
844 class CompilationUnitSupportCode
847 const Project
& project
;
849 CompilationUnitSupportCode ( const Project
& project
);
850 ~CompilationUnitSupportCode ();
851 void Generate ( bool verbose
);
853 void GenerateForModule ( Module
& module
,
855 std::string
GetCompilationUnitFilename ( Module
& module
,
856 CompilationUnit
& compilationUnit
);
857 void WriteCompilationUnitFile ( Module
& module
,
858 CompilationUnit
& compilationUnit
);
865 Directory
* directory
;
866 std::string filename
;
867 FileLocation ( Directory
* directory
,
868 std::string filename
);
872 enum AutoRegisterType
882 const Project
& project
;
883 const Module
* module
;
884 const XMLElement
& node
;
885 std::string infSection
;
886 AutoRegisterType type
;
887 AutoRegister ( const Project
& project_
,
888 const Module
* module_
,
889 const XMLElement
& node_
);
893 bool IsSupportedModuleType ( ModuleType type
);
894 AutoRegisterType
GetAutoRegisterType( std::string type
);
899 class SysSetupGenerator
902 const Project
& project
;
903 SysSetupGenerator ( const Project
& project
);
904 ~SysSetupGenerator ();
907 std::string
GetDirectoryId ( const Module
& module
);
908 std::string
GetFlags ( const Module
& module
);
909 void Generate ( HINF inf
,
910 const Module
& module
);
915 InitializeEnvironment ();
918 Right ( const std::string
& s
, size_t n
);
921 Replace ( const std::string
& s
, const std::string
& find
, const std::string
& with
);
924 ChangeSeparator ( const std::string
& s
,
925 const char fromSeparator
,
926 const char toSeparator
);
929 FixSeparator ( const std::string
& s
);
932 FixSeparatorForSystemCommand ( const std::string
& s
);
935 DosSeparator ( const std::string
& s
);
939 const std::string
& filename
,
940 const std::string
& newExtension
);
944 const std::string
& location
,
945 const std::string
& path
,
946 const std::string
& att_value
);
949 GetExtension ( const std::string
& filename
);
952 GetDirectory ( const std::string
& filename
);
955 GetFilename ( const std::string
& filename
);
958 NormalizeFilename ( const std::string
& filename
);
961 ToLower ( std::string filename
);
963 #endif /* __RBUILD_H */