Merge trunk HEAD (r46369)
[reactos.git] / reactos / tools / rbuild / rbuild.h
index 6ce938a..e5be60c 100644 (file)
  * 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.
+ * 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.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
-#ifndef __RBUILD_H
-#define __RBUILD_H
+
+#pragma once
 
 #include "pch.h"
 
@@ -68,7 +68,7 @@ extern char cBadSep;
 #define DEF_SBAD_SEP "\\"
 #endif
 
-#define MS_VS_DEF_VERSION "7.10"
+#define MS_VS_DEF_VERSION "9.00"
 
 class XmlNode;
 class Directory;
@@ -155,6 +155,25 @@ enum DependenciesType
        FullDependencies
 };
 
+enum CompilerSet
+{
+       GnuGcc,
+       MicrosoftC
+};
+
+enum LinkerSet
+{
+       GnuLd,
+       MicrosoftLink
+};
+
+enum SpecFileType
+{
+    None,
+    Spec = 1,
+    PSpec = 2
+};
+
 class Configuration
 {
 public:
@@ -174,6 +193,8 @@ public:
        bool MakeHandlesInstallDirectories;
        bool GenerateProxyMakefilesInSourceTree;
        bool InstallFiles;
+       CompilerSet Compiler;
+       LinkerSet Linker;
 };
 
 class Environment
@@ -183,6 +204,7 @@ public:
        static std::string GetArch ();
        static std::string GetIntermediatePath ();
        static std::string GetOutputPath ();
+       static std::string GetSourcePath ();
        static std::string GetCdOutputPath ();
        static std::string GetInstallPath ();
        static std::string GetAutomakeFile ( const std::string& defaultFile );
@@ -260,6 +282,9 @@ public:
        const std::string& GetProjectFilename () const;
        std::string ResolveProperties ( const std::string& s ) const;
        const Property* LookupProperty ( const std::string& name ) const;
+       std::string GetCompilerSet () const;
+       std::string GetLinkerSet () const;
+       void GenerateInstallerFileList();
 private:
        std::string ResolveNextProperty ( const std::string& s ) const;
        void ReadXml ();
@@ -299,8 +324,6 @@ enum ModuleType
        Win32SCR,
        IdlHeader,
        IdlInterface,
-       IsoRegTest,
-       LiveIsoRegTest,
        EmbeddedTypeLib,
        ElfExecutable,
        RpcProxy,
@@ -321,9 +344,15 @@ enum HostType
 
 enum CompilerType
 {
-       CompilerTypeDontCare,
        CompilerTypeCC,
+       CompilerTypeCXX,
        CompilerTypeCPP,
+       CompilerTypeAS,
+       CompilerTypeMIDL,
+       CompilerTypeRC,
+       CompilerTypeNASM,
+
+       CompilerTypesCount
 };
 
 class FileLocation
@@ -355,10 +384,9 @@ public:
        std::string buildtype;
        ModuleType type;
        ImportLibrary* importLibrary;
+       ImportLibrary* delayImportLibrary;
        Metadata* metadata;
        Bootsector* bootSector;
-       bool mangledSymbols;
-       bool underscoreSymbols;
        bool isUnicode;
        bool isDefaultEntryPoint;
        Bootstrap* bootstrap;
@@ -369,6 +397,7 @@ public:
        std::vector<CompilerFlag*> compilerFlags;
        std::vector<LinkerFlag*> linkerFlags;
        std::vector<StubbedComponent*> stubbedComponents;
+       std::vector<CDFile*> cdfiles;
        LinkerScript* linkerScript;
        PchFile* pch;
        bool cplusplus;
@@ -380,6 +409,7 @@ public:
        bool isCRT;
        std::string CRT;
        bool dynamicCRT;
+       std::string installbase;
        FileLocation *output; // "path/foo.exe"
        FileLocation *dependency; // "path/foo.exe" or "path/libfoo.a"
        FileLocation *install;
@@ -398,15 +428,17 @@ public:
        bool IsDLL () const;
        std::string GetPathWithPrefix ( const std::string& prefix ) const; // "path/prefixfoo.exe"
        std::string GetPathToBaseDir() const; // "../" offset to rootdirectory
-       std::string GetEntryPoint(bool leadingUnderscore) const;
+       std::string GetEntryPoint() const;
        void GetTargets ( string_list& ) const;
        std::string GetInvocationTarget ( const int index ) const;
        bool HasFileWithExtension ( const IfableData&, const std::string& extension ) const;
        void InvokeModule () const;
        void ProcessXML ();
        std::string GetDllName() const;
+       SpecFileType IsSpecDefinitionFile () const;
 private:
        void SetImportLibrary ( ImportLibrary* importLibrary );
+       void SetDelayImportLibrary ( ImportLibrary* importLibrary );
        DirectoryLocation GetTargetDirectoryTree () const;
        std::string GetDefaultModuleExtension () const;
        std::string GetDefaultModuleEntrypoint () const;
@@ -423,8 +455,39 @@ private:
                                   bool default_value = false );
 };
 
+class ToolsetDirective
+{
+private:
+       bool enabled;
+
+protected:
+       void ParseToolsets ( const Project& project, const XMLElement& node );
+
+public:
+       virtual ~ToolsetDirective() { }
+       bool IsEnabled () const;
+};
+
+class CompilerDirective
+{
+private:
+       std::bitset<CompilerTypesCount> compilersSet;
+       bool enabled;
+
+protected:
+       void ParseCompilers ( const XMLElement& node, const std::string& defaultValue );
+
+public:
+       CompilerDirective (): enabled ( true ) { }
+       virtual ~CompilerDirective() { }
+       void SetCompiler ( CompilerType compiler );
+       void UnsetCompiler ( CompilerType compiler );
+       void SetAllCompilers ();
+       void UnsetAllCompilers ();
+       bool IsCompilerSet ( CompilerType compiler ) const;
+};
 
-class Include
+class Include: public CompilerDirective, public ToolsetDirective
 {
 public:
        FileLocation *directory;
@@ -444,19 +507,21 @@ private:
        const XMLElement* node;
        const Module* module;
        DirectoryLocation GetDefaultDirectoryTree ( const Module* module ) const;
+       void Initialize ();
 };
 
 
-class Define
+class Define: public CompilerDirective, public ToolsetDirective
 {
 public:
        const Project& project;
        const Module* module;
        const XMLElement* node;
        std::string name;
+       std::string arguments;
        std::string value;
        std::string backend;
-       bool overridable;
+       bool redefine;
 
        Define ( const Project& project,
                 const XMLElement& defineNode );
@@ -466,7 +531,8 @@ public:
        Define ( const Project& project,
                 const Module* module,
                 const std::string& name_,
-                const std::string& backend_ = "" );
+                const std::string& backend_ = "",
+                bool redefine_ = false );
        ~Define();
        void ProcessXML();
 private:
@@ -501,6 +567,7 @@ public:
        const Module& module;
        std::string name;
        const Module* importedModule;
+       bool delayimp;
 
        Library ( const XMLElement& _node,
                  const Module& _module,
@@ -601,22 +668,23 @@ public:
        const Module* module;
        std::string dllname;
        FileLocation *source;
+       FileLocation *target;
 
        ImportLibrary ( const Project& project,
                        const XMLElement& node,
-                       const Module* module );
+                       const Module* module,
+                       bool delayimp );
        ~ImportLibrary ();
 };
 
 
-class CompilerFlag
+class CompilerFlag: public CompilerDirective, public ToolsetDirective
 {
 public:
        const Project& project;
        const Module* module;
        const XMLElement& node;
        std::string flag;
-       CompilerType compiler;
 
        CompilerFlag ( const Project& project,
                       const XMLElement& compilerFlagNode );
@@ -630,7 +698,7 @@ private:
 };
 
 
-class LinkerFlag
+class LinkerFlag: public ToolsetDirective
 {
 public:
        const Project& project;
@@ -847,6 +915,7 @@ class InstallFile : public XmlNode
 public:
        FileLocation *source;
        FileLocation *target;
+       std::string installbase;
 
        InstallFile ( const Project& project,
                      const XMLElement& bootstrapNode,
@@ -1029,5 +1098,3 @@ NormalizeFilename ( const std::string& filename );
 
 extern std::string
 ToLower ( std::string filename );
-
-#endif /* __RBUILD_H */