store pointer to Backend in the Project class so properties of the Backend object...
[reactos.git] / reactos / tools / rbuild / rbuild.h
index 1830ab9..4cdb08d 100644 (file)
@@ -1,3 +1,20 @@
+/*
+ * Copyright (C) 2005 Casper S. Hornstrup
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
 #ifndef __RBUILD_H
 #define __RBUILD_H
 
 #endif/*WIN32*/
 #endif/*_MSC_VER*/
 
+#include <infhost.h>
+
 #include "ssprintf.h"
 #include "exception.h"
-#include "XML.h"
+#include "xml.h"
+
+class Backend; // forward declaration
 
 typedef std::vector<std::string> string_list;
 
+extern std::string ExePrefix;
+extern std::string ExePostfix;
+extern std::string sSep;
+extern std::string sBadSep;
+extern char cSep;
+extern char cBadSep;
+
 #ifdef WIN32
-#define EXEPREFIX ""
-#define EXEPOSTFIX ".exe"
-#define CSEP '\\'
-#define CBAD_SEP '/'
-#define SSEP "\\"
-#define SBAD_SEP "/"
+#define DEF_EXEPREFIX ""
+#define DEF_EXEPOSTFIX ".exe"
+#define DEF_CSEP '\\'
+#define DEF_CBAD_SEP '/'
+#define DEF_SSEP "\\"
+#define DEF_SBAD_SEP "/"
 #else
-#define EXEPREFIX "./"
-#define EXEPOSTFIX ""
-#define CSEP '/'
-#define CBAD_SEP '\\'
-#define SSEP "/"
-#define SBAD_SEP "\\"
+#define DEF_EXEPREFIX "./"
+#define DEF_EXEPOSTFIX ""
+#define DEF_CSEP '/'
+#define DEF_CBAD_SEP '\\'
+#define DEF_SSEP "/"
+#define DEF_SBAD_SEP "\\"
 #endif
 
+#define MS_VS_DEF_VERSION "7.10"
+
+class Directory;
 class Project;
 class IfableData;
 class Module;
@@ -54,6 +85,7 @@ class ImportLibrary;
 class If;
 class CompilerFlag;
 class LinkerFlag;
+class LinkerScript;
 class Property;
 class TestSupportCode;
 class WineResource;
@@ -64,10 +96,39 @@ class InstallFile;
 class PchFile;
 class StubbedComponent;
 class StubbedSymbol;
+class CompilationUnit;
+class FileLocation;
+class AutoRegister;
 
 class SourceFileTest;
 
 
+typedef std::map<std::string,Directory*> directory_map;
+
+class Directory
+{
+public:
+       std::string name;
+       directory_map subdirs;
+       Directory ( const std::string& name );
+       void Add ( const char* subdir );
+       void GenerateTree ( const std::string& parent,
+                           bool verbose );
+       std::string EscapeSpaces ( std::string path );
+       void CreateRule ( FILE* f,
+                         const std::string& parent );
+private:
+       bool mkdir_p ( const char* path );
+       std::string ReplaceVariable ( std::string name,
+                                     std::string value,
+                                     std::string path );
+       std::string GetEnvironmentVariable ( const std::string& name );
+       void ResolveVariablesInPath ( char* buf,
+                                     std::string path );
+       bool CreateDirectory ( std::string path );
+};
+
+
 class Configuration
 {
 public:
@@ -77,7 +138,9 @@ public:
        bool CleanAsYouGo;
        bool AutomaticDependencies;
        bool CheckDependenciesForModuleOnly;
+       bool CompilationUnitsEnabled;
        std::string CheckDependenciesForModuleOnlyModule;
+       std::string VSProjectVersion;
        bool MakeHandlesInstallDirectories;
        bool GenerateProxyMakefilesInSourceTree;
 };
@@ -93,6 +156,7 @@ public:
                                                                 const std::string& defaultValue );
 };
 
+
 class FileSupportCode
 {
 public:
@@ -100,9 +164,20 @@ public:
                                     std::string filename );
 };
 
+
+class ParseContext
+{
+public:
+       If* ifData;
+       CompilationUnit* compilationUnit;
+       ParseContext ();
+};
+
+
 class IfableData
 {
 public:
+       std::vector<CompilationUnit*> compilationUnits;
        std::vector<File*> files;
        std::vector<Include*> includes;
        std::vector<Define*> defines;
@@ -119,7 +194,9 @@ class Project
 {
        std::string xmlfile;
        XMLElement *node, *head;
+       Backend* _backend;
 public:
+       const Configuration& configuration;
        std::string name;
        std::string makefile;
        XMLIncludes xmlbuildfiles;
@@ -129,10 +206,14 @@ public:
        std::vector<InstallFile*> installfiles;
        IfableData non_if_data;
 
-       Project ( const std::string& filename );
+       Project ( const Configuration& configuration,
+                 const std::string& filename );
        ~Project ();
+       void SetBackend ( Backend* backend ) { _backend = backend; }
+       Backend& GetBackend() { return *_backend; }
        void WriteConfigurationFile ();
        void ExecuteInvocations ();
+
        void ProcessXML ( const std::string& path );
        Module* LocateModule ( const std::string& name );
        const Module* LocateModule ( const std::string& name ) const;
@@ -149,7 +230,7 @@ private:
        void ReadXml ();
        void ProcessXMLSubElement ( const XMLElement& e,
                                    const std::string& path,
-                                   If* pIf = NULL );
+                                   ParseContext& parseContext );
 
        // disable copy semantics
        Project ( const Project& );
@@ -176,7 +257,8 @@ enum ModuleType
        LiveIso = 14,
        Test = 15,
        RpcServer = 16,
-       RpcClient = 17
+       RpcClient = 17,
+       Alias = 18
 };
 
 enum HostType
@@ -193,6 +275,7 @@ public:
        const XMLElement& node;
        std::string xmlbuildFile;
        std::string name;
+       std::string guid;
        std::string extension;
        std::string entrypoint;
        std::string baseaddress;
@@ -200,21 +283,25 @@ public:
        ModuleType type;
        ImportLibrary* importLibrary;
        bool mangledSymbols;
+       bool isUnicode;
        Bootstrap* bootstrap;
+       AutoRegister* autoRegister;
        IfableData non_if_data;
        std::vector<Invoke*> invocations;
        std::vector<Dependency*> dependencies;
        std::vector<CompilerFlag*> compilerFlags;
        std::vector<LinkerFlag*> linkerFlags;
        std::vector<StubbedComponent*> stubbedComponents;
+       LinkerScript* linkerScript;
        PchFile* pch;
        bool cplusplus;
        std::string prefix;
        HostType host;
        std::string installBase;
        std::string installName;
+       std::string aliasedModuleName;
        bool useWRC;
-       bool enableWarnings;
+       bool allowWarnings;
        bool enabled;
 
        Module ( const Project& project,
@@ -226,11 +313,11 @@ public:
        bool HasImportLibrary () const;
        bool IsDLL () const;
        bool GenerateInOutputTree () const;
-       std::string GetTargetName () const;
-       std::string GetDependencyPath () const;
-       std::string GetBasePath () const;
-       std::string GetPath () const;
-       std::string GetPathWithPrefix ( const std::string& prefix ) const;
+       std::string GetTargetName () const; // "foo.exe"
+       std::string GetDependencyPath () const; // "path/foo.exe" or "path/libfoo.a"
+       std::string GetBasePath () const; // "path"
+       std::string GetPath () const; // "path/foo.exe"
+       std::string GetPathWithPrefix ( const std::string& prefix ) const; // "path/prefixfoo.exe"
        void GetTargets ( string_list& ) const;
        std::string GetInvocationTarget ( const int index ) const;
        bool HasFileWithExtension ( const IfableData&, const std::string& extension ) const;
@@ -244,7 +331,7 @@ private:
        std::string GetDefaultModuleBaseaddress () const;
        void ProcessXMLSubElement ( const XMLElement& e,
                                    const std::string& path,
-                                   If* pIf = NULL );
+                                   ParseContext& parseContext );
 };
 
 
@@ -253,19 +340,22 @@ class Include
 public:
        const Project& project;
        const Module* module;
-       const XMLElement& node;
+       const XMLElement* node;
+       const Module* baseModule;
        std::string directory;
        std::string basePath;
 
        Include ( const Project& project,
-                 const XMLElement& includeNode );
+                 const XMLElement* includeNode );
        Include ( const Project& project,
                  const Module* module,
-                 const XMLElement& includeNode );
+                 const XMLElement* includeNode );
+       Include ( const Project& project,
+                 std::string directory,
+                 std::string basePath );
        ~Include ();
        void ProcessXML();
 private:
-       void Initialize();
 };
 
 
@@ -304,7 +394,6 @@ public:
               bool _isPreCompiledHeader );
 
        void ProcessXML();
-       bool IsGeneratedFile () const;
 };
 
 
@@ -314,7 +403,7 @@ public:
        const XMLElement& node;
        const Module& module;
        std::string name;
-       const Module* imported_module;
+       const Module* importedModule;
 
        Library ( const XMLElement& _node,
                  const Module& _module,
@@ -449,6 +538,24 @@ private:
 };
 
 
+class LinkerScript
+{
+public:
+       const Project& project;
+       const Module* module;
+       const XMLElement& node;
+       const Module* baseModule;
+       std::string directory;
+       std::string basePath;
+
+       LinkerScript ( const Project& project,
+                      const Module* module,
+                      const XMLElement& node );
+       ~LinkerScript ();
+       void ProcessXML();
+};
+
+
 class Property
 {
 public:
@@ -531,7 +638,7 @@ class SourceFile
 {
 public:
        SourceFile ( AutomaticDependency* automaticDependency,
-                    Module& module,
+                    const Module& module,
                     const std::string& filename,
                     SourceFile* parent,
                     bool isNonAutomaticDependency );
@@ -540,7 +647,7 @@ public:
        std::string Location () const;
        std::vector<SourceFile*> files;
        AutomaticDependency* automaticDependency;
-       Module& module;
+       const Module& module;
        std::string filename;
        std::string filenamePart;
        std::string directoryPart;
@@ -556,6 +663,7 @@ private:
        void Open ();
        void SkipWhitespace ();
        bool ReadInclude ( std::string& filename,
+                          bool& searchCurrentDirectory,
                           bool& includeNext );
        bool IsIncludedFrom ( const std::string& normalizedFilename );
        SourceFile* GetParentSourceFile ();
@@ -581,27 +689,32 @@ public:
                                  const std::string& includedFilename,
                                  std::string& resolvedFilename );
        bool LocateIncludedFile ( SourceFile* sourceFile,
-                                 Module& module,
+                                 const Module& module,
                                  const std::string& includedFilename,
+                                 bool searchCurrentDirectory,
                                  bool includeNext,
                                  std::string& resolvedFilename );
-       SourceFile* RetrieveFromCacheOrParse ( Module& module,
+       SourceFile* RetrieveFromCacheOrParse ( const Module& module,
                                               const std::string& filename,
                                               SourceFile* parentSourceFile );
        SourceFile* RetrieveFromCache ( const std::string& filename );
        void CheckAutomaticDependencies ( bool verbose );
-       void CheckAutomaticDependencies ( Module& module,
-                                         bool verbose );
-       void CheckAutomaticDependencies ( Module& module,
-                                         bool verbose,
-                                         bool parseFiles );
-       void CheckAutomaticDependenciesForFile ( SourceFile* sourceFile );
+       void CheckAutomaticDependenciesForModule ( Module& module,
+                                                  bool verbose );
 private:
-       void GetModuleFiles ( Module& module,
+       void GetModulesToCheck ( Module& module, std::vector<const Module*>& modules );
+       void CheckAutomaticDependencies ( const Module& module,
+                                          bool verbose );
+       void CheckAutomaticDependenciesForFile ( SourceFile* sourceFile );
+       void GetIncludeDirectories ( std::vector<Include*>& includes,
+                                    const Module& module,
+                                     Include& currentDirectory,
+                                     bool searchCurrentDirectory );
+       void GetModuleFiles ( const Module& module,
                               std::vector<File*>& files ) const;
        void ParseFiles ();
-       void ParseFiles ( Module& module );
-       void ParseFile ( Module& module,
+       void ParseFiles ( const Module& module );
+       void ParseFile ( const Module& module,
                         const File& file );
        std::map<std::string, SourceFile*> sourcefile_map;
 };
@@ -711,9 +824,123 @@ private:
        std::string StripSymbol ( std::string symbol );
 };
 
+
+class CompilationUnit
+{
+public:
+       const Project* project;
+       const Module* module;
+       const XMLElement* node;
+       std::string name;
+       std::vector<File*> files;
+
+       CompilationUnit ( File* file );
+       CompilationUnit ( const Project* project,
+                         const Module* module,
+                         const XMLElement* node );
+       ~CompilationUnit ();
+       void ProcessXML();
+       bool IsGeneratedFile () const;
+       bool HasFileWithExtension ( const std::string& extension ) const;
+       bool IsFirstFile () const;
+       FileLocation* GetFilename ( Directory* intermediateDirectory ) const;
+       std::string GetSwitches () const;
+};
+
+
+class CompilationUnitSupportCode
+{
+public:
+       const Project& project;
+
+       CompilationUnitSupportCode ( const Project& project );
+       ~CompilationUnitSupportCode ();
+       void Generate ( bool verbose );
+private:
+       void GenerateForModule ( Module& module,
+                                bool verbose );
+       std::string GetCompilationUnitFilename ( Module& module,
+                                                CompilationUnit& compilationUnit );
+       void WriteCompilationUnitFile ( Module& module,
+                                       CompilationUnit& compilationUnit );
+};
+
+
+class FileLocation
+{
+public:
+       Directory* directory;
+       std::string filename;
+       FileLocation ( Directory* directory,
+                      std::string filename );
+};
+
+
+enum AutoRegisterType
+{
+       DllRegisterServer,
+       DllInstall,
+       Both
+};
+
+class AutoRegister
+{
+public:
+       const Project& project;
+       const Module* module;
+       const XMLElement& node;
+       std::string infSection;
+       AutoRegisterType type;
+       AutoRegister ( const Project& project_,
+                      const Module* module_,
+                      const XMLElement& node_ );
+       ~AutoRegister ();
+       void ProcessXML();
+private:
+       bool IsSupportedModuleType ( ModuleType type );
+       AutoRegisterType GetAutoRegisterType( std::string type );
+       void Initialize ();
+};
+
+
+class SysSetupGenerator
+{
+public:
+       const Project& project;
+       SysSetupGenerator ( const Project& project );
+       ~SysSetupGenerator ();
+       void Generate ();
+private:
+       std::string GetDirectoryId ( const Module& module );
+       std::string GetFlags ( const Module& module );
+       void Generate ( HINF inf,
+                       const Module& module );
+};
+
+
+extern void
+InitializeEnvironment ();
+
+extern std::string
+Right ( const std::string& s, size_t n );
+
+extern std::string
+Replace ( const std::string& s, const std::string& find, const std::string& with );
+
+extern std::string
+ChangeSeparator ( const std::string& s,
+                  const char fromSeparator,
+                  const char toSeparator );
+
 extern std::string
 FixSeparator ( const std::string& s );
 
+extern std::string
+FixSeparatorForSystemCommand ( const std::string& s );
+
+extern std::string
+DosSeparator ( const std::string& s );
+
 extern std::string
 ReplaceExtension (
        const std::string& filename,
@@ -737,4 +964,7 @@ GetFilename ( const std::string& filename );
 extern std::string
 NormalizeFilename ( const std::string& filename );
 
+extern std::string
+ToLower ( std::string filename );
+
 #endif /* __RBUILD_H */