-Add a new module type 'cabinet' to handle .cab files generation
[reactos.git] / reactos / tools / rbuild / backend / mingw / modulehandler.h
index 8161f32..987343b 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 MINGW_MODULEHANDLER_H
 #define MINGW_MODULEHANDLER_H
 
@@ -5,6 +22,7 @@
 #include "mingw.h"
 
 class MingwBackend;
+class Rule;
 
 extern std::string
 GetTargetMacro ( const Module&, bool with_dollar = true );
@@ -22,30 +40,25 @@ public:
 
        static void SetBackend ( MingwBackend* backend_ );
        static void SetMakefile ( FILE* f );
-       static void SetUsePch ( bool use_pch );
+       void EnablePreCompiledHeaderSupport ();
 
-       static std::string PassThruCacheDirectory (
-               const std::string &f,
-               Directory* directoryTree );
+       static const FileLocation* PassThruCacheDirectory (const FileLocation* fileLocation );
 
-       static Directory* GetTargetDirectoryTree (
-               const Module& module );
-
-       static std::string GetTargetFilename (
+       static const FileLocation* GetTargetFilename (
                const Module& module,
                string_list* pclean_files );
 
-       static std::string
-       GetImportLibraryFilename (
+       static const FileLocation* GetImportLibraryFilename (
                const Module& module,
                string_list* pclean_files );
 
-       static std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines );
+       static std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines, std::set<std::string> &used_defs );
        static std::string GenerateGccIncludeParametersFromVector ( const std::vector<Include*>& includes );
 
        std::string GetModuleTargets ( const Module& module );
        void GetObjectsVector ( const IfableData& data,
-                               std::vector<std::string>& objectFiles ) const;
+                               std::vector<FileLocation>& objectFiles ) const;
+       void GenerateSourceMacro();
        void GenerateObjectMacro();
        void GenerateTargetMacro();
        void GenerateOtherMacros();
@@ -61,27 +74,34 @@ public:
        void GenerateInvocations () const;
        void GenerateCleanTarget () const;
        void GenerateInstallTarget () const;
+       void GenerateDependsTarget () const;
        static bool ReferenceObjects ( const Module& module );
+       virtual void AddImplicitLibraries ( Module& module ) { return; }
+
+       void OutputCopyCommand ( const FileLocation& source,
+                                const FileLocation& destination );
 protected:
-       virtual void GetModuleSpecificSourceFiles ( std::vector<File*>& sourceFiles );
+       virtual void GetModuleSpecificCompilationUnits ( std::vector<CompilationUnit*>& compilationUnits );
        std::string GetWorkingDirectory () const;
        std::string GetBasename ( const std::string& filename ) const;
-       std::string GetActualSourceFilename ( const std::string& filename ) const;
-       std::string GetModuleArchiveFilename () const;
+       const FileLocation* GetActualSourceFilename ( const FileLocation* file ) const;
+       std::string GetExtraDependencies ( const FileLocation *file ) const;
+       std::string GetCompilationUnitDependencies ( const CompilationUnit& compilationUnit ) const;
+       const FileLocation* GetModuleArchiveFilename () const;
        bool IsGeneratedFile ( const File& file ) const;
        std::string GetImportLibraryDependency ( const Module& importedModule );
        void GetTargets ( const Module& dependencyModule,
                          string_list& targets );
        void GetModuleDependencies ( string_list& dependencies );
        std::string GetAllDependencies () const;
-       void GetSourceFilenames ( string_list& list,
-                                  bool includeGeneratedFiles ) const;
-       void GetSourceFilenamesWithoutGeneratedFiles ( string_list& list ) const;
-       std::string GetObjectFilename ( const std::string& sourceFilename,
-                                       string_list* pclean_files ) const;
+       void GetSourceFilenames ( std::vector<FileLocation>& list,
+                                 bool includeGeneratedFiles ) const;
+       void GetSourceFilenamesWithoutGeneratedFiles ( std::vector<FileLocation>& list ) const;
+       const FileLocation* GetObjectFilename ( const FileLocation* sourceFile,
+                                               const Module& module ) const;
 
        std::string GetObjectFilenames ();
-       
+
        std::string GetPreconditionDependenciesName () const;
        std::string GetCFlagsMacro () const;
        static std::string GetObjectsMacro ( const Module& );
@@ -90,96 +110,74 @@ protected:
        std::string GetLinkerMacro () const;
        void GenerateCleanObjectsAsYouGoCode () const;
        void GenerateRunRsymCode () const;
+       void GenerateRunStripCode () const;
        void GenerateLinkerCommand ( const std::string& dependencies,
-                                    const std::string& linker,
                                     const std::string& linkerParameters,
-                                    const std::string& objectsMacro,
-                                    const std::string& libsMacro );
+                                    const std::string& pefixupParameters );
        void GeneratePhonyTarget() const;
+       void GenerateBuildMapCode ( const FileLocation *mapTarget = NULL );
        void GenerateRules ();
        void GenerateImportLibraryTargetIfNeeded ();
-       void GetDefinitionDependencies ( string_list& dependencies ) const;
+       void GetDefinitionDependencies ( std::vector<FileLocation>& dependencies ) const;
        std::string GetLinkingDependencies () const;
        static MingwBackend* backend;
        static FILE* fMakefile;
-       static bool use_pch;
+       bool use_pch;
 private:
        std::string ConcatenatePaths ( const std::string& path1,
                                       const std::string& path2 ) const;
        std::string GenerateGccDefineParameters () const;
-       std::string GenerateCompilerParametersFromVector ( const std::vector<CompilerFlag*>& compilerFlags ) const;
+       std::string GenerateCompilerParametersFromVector ( const std::vector<CompilerFlag*>& compilerFlags, const CompilerType type ) const;
        std::string GenerateLinkerParametersFromVector ( const std::vector<LinkerFlag*>& linkerFlags ) const;
        std::string GenerateImportLibraryDependenciesFromVector ( const std::vector<Library*>& libraries );
        std::string GenerateLinkerParameters () const;
        void GenerateMacro ( const char* assignmentOperation,
                             const std::string& macro,
-                            const IfableData& data );
+                            const IfableData& data,
+                            std::set<const Define *>* used_defs,
+                            bool generatingCompilerMacro );
        void GenerateMacros ( const char* op,
                              const IfableData& data,
-                             const std::vector<LinkerFlag*>* linkerFlags );
+                             const std::vector<LinkerFlag*>* linkerFlags,
+                             std::set<const Define *>& used_defs );
+       void GenerateSourceMacros ( const char* assignmentOperation,
+                                   const IfableData& data );
        void GenerateObjectMacros ( const char* assignmentOperation,
-                                   const IfableData& data,
-                                   const std::vector<LinkerFlag*>* linkerFlags );
+                                   const IfableData& data );
        std::string GenerateGccIncludeParameters () const;
        std::string GenerateGccParameters () const;
        std::string GenerateNasmParameters () const;
-       void GenerateGccCommand ( const std::string& sourceFilename,
-                                 const std::string& cc,
-                                 const std::string& cflagsMacro );
-       void GenerateGccAssemblerCommand ( const std::string& sourceFilename,
-                                          const std::string& cc,
-                                          const std::string& cflagsMacro );
-       void GenerateNasmCommand ( const std::string& sourceFilename,
-                                  const std::string& nasmflagsMacro );
-       void GenerateWindresCommand ( const std::string& sourceFilename,
-                                     const std::string& windresflagsMacro );
-       void GenerateWinebuildCommands ( const std::string& sourceFilename );
-       std::string GetWidlFlags ( const File& file );
-       void GenerateWidlCommandsServer (
-               const File& file,
-               const std::string& widlflagsMacro );
-       void GenerateWidlCommandsClient (
-               const File& file,
-               const std::string& widlflagsMacro );
-       void GenerateWidlCommands ( const File& file,
-                                   const std::string& widlflagsMacro );
-       void GenerateCommands ( const File& file,
-                               const std::string& cc,
-                               const std::string& cppc,
-                               const std::string& cflagsMacro,
-                               const std::string& nasmflagsMacro,
-                               const std::string& windresflagsMacro,
-                               const std::string& widlflagsMacro );
-       void GenerateObjectFileTargets ( const IfableData& data,
-                                        const std::string& cc,
-                                        const std::string& cppc,
-                                        const std::string& cflagsMacro,
-                                        const std::string& nasmflagsMacro,
-                                        const std::string& windresflagsMacro,
-                                        const std::string& widlflagsMacro );
-       void GenerateObjectFileTargets ( const std::string& cc,
-                                        const std::string& cppc,
-                                        const std::string& cflagsMacro,
-                                        const std::string& nasmflagsMacro,
-                                        const std::string& windresflagsMacro,
-                                        const std::string& widlflagsMacro );
-       std::string GenerateArchiveTarget ( const std::string& ar,
-                                           const std::string& objs_macro ) const;
-       void GetSpecObjectDependencies ( string_list& dependencies,
-                                        const std::string& filename ) const;
-       void GetWidlObjectDependencies ( string_list& dependencies,
-                                        const std::string& filename ) const;
+       const FileLocation* GetPrecompiledHeaderFilename () const;
+       void GenerateGccCommand ( const FileLocation* sourceFile,
+                                 const Rule *rule,
+                                 const std::string& extraDependencies );
+       void GenerateCommands ( const CompilationUnit& compilationUnit,
+                               const std::string& extraDependencies );
+       void GenerateObjectFileTargets ( const IfableData& data );
+       void GenerateObjectFileTargets ();
+       const FileLocation* GenerateArchiveTarget ();
+       void GetMcObjectDependencies   ( std::vector<FileLocation>& dependencies,
+                                        const FileLocation *file ) const;
+       void GetSpecObjectDependencies ( std::vector<FileLocation>& dependencies,
+                                        const FileLocation *file ) const;
+       void GetWidlObjectDependencies ( std::vector<FileLocation>& dependencies,
+                                        const FileLocation *file ) const;
        void GetDefaultDependencies ( string_list& dependencies ) const;
        void GetInvocationDependencies ( const Module& module, string_list& dependencies );
        bool IsWineModule () const;
-       std::string GetDefinitionFilename () const;
-       static std::string RemoveVariables ( std::string path);
-       void GenerateBuildMapCode ();
+       const FileLocation* GetDefinitionFilename () const;
        void GenerateBuildNonSymbolStrippedCode ();
-       void CleanupFileVector ( std::vector<File*>& sourceFiles );
-       void GetRpcHeaderDependencies ( string_list& dependencies ) const;
-       std::string GetRpcServerHeaderFilename ( std::string basename ) const;
-       std::string GetRpcClientHeaderFilename ( std::string basename ) const;
+       void CleanupCompilationUnitVector ( std::vector<CompilationUnit*>& compilationUnits );
+       void GetRpcHeaderDependencies ( std::vector<FileLocation>& dependencies ) const;
+       void GetMcHeaderDependencies ( std::vector<FileLocation>& dependencies ) const;
+       static std::string GetPropertyValue ( const Module& module, const std::string& name );
+       const FileLocation* GetRpcServerHeaderFilename ( const FileLocation *base ) const;
+       const FileLocation* GetRpcClientHeaderFilename ( const FileLocation *base ) const;
+       const FileLocation* GetRpcProxyHeaderFilename ( const FileLocation *base ) const;
+       const FileLocation* GetIdlHeaderFilename ( const FileLocation *base ) const;
+       const FileLocation* GetMcHeaderFilename ( const FileLocation *base ) const;
+       std::string GetModuleCleanTarget ( const Module& module ) const;
+       void GetReferencedObjectLibraryModuleCleanTargets ( std::vector<std::string>& moduleNames ) const;
 public:
        const Module& module;
        string_list clean_files;
@@ -188,6 +186,7 @@ public:
        std::string windresflagsMacro;
        std::string widlflagsMacro;
        std::string linkerflagsMacro;
+       std::string sourcesMacro;
        std::string objectsMacro;
        std::string libsMacro;
        std::string linkDepsMacro;
@@ -211,7 +210,6 @@ public:
        MingwKernelModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
-       std::string TypeSpecificCFlags() { return "-D_SEH_NO_NATIVE_NLG"; }
 private:
        void GenerateKernelModuleTarget ();
 };
@@ -228,6 +226,17 @@ private:
 };
 
 
+class MingwHostStaticLibraryModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwHostStaticLibraryModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostTrue; }
+       virtual void Process ();
+private:
+       void GenerateHostStaticLibraryModuleTarget ();
+};
+
+
 class MingwObjectLibraryModuleHandler : public MingwModuleHandler
 {
 public:
@@ -245,8 +254,8 @@ public:
        MingwKernelModeDLLModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
-       std::string TypeSpecificCFlags() { return "-D_SEH_NO_NATIVE_NLG"; }
        std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateKernelModeDLLModuleTarget ();
 };
@@ -258,8 +267,9 @@ public:
        MingwKernelModeDriverModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
-       std::string TypeSpecificCFlags() { return "-D__NTDRIVER__ -D_SEH_NO_NATIVE_NLG"; }
+       std::string TypeSpecificCFlags() { return "-D__NTDRIVER__"; }
        std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateKernelModeDriverModuleTarget ();
 };
@@ -271,8 +281,8 @@ public:
        MingwNativeDLLModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
-       std::string TypeSpecificCFlags() { return "-D_SEH_NO_NATIVE_NLG"; }
        std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateNativeDLLModuleTarget ();
 };
@@ -284,8 +294,9 @@ public:
        MingwNativeCUIModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
-       std::string TypeSpecificCFlags() { return "-D__NTAPP__ -D_SEH_NO_NATIVE_NLG"; }
+       std::string TypeSpecificCFlags() { return "-D__NTAPP__"; }
        std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateNativeCUIModuleTarget ();
 };
@@ -297,17 +308,34 @@ public:
        MingwWin32DLLModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
+       std::string TypeSpecificLinkerFlags() { return module.cplusplus ? "-nostartfiles -lgcc" : "-nostartfiles -nostdlib -lgcc"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateWin32DLLModuleTarget ();
 };
 
 
+class MingwWin32OCXModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwWin32OCXModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+       std::string TypeSpecificLinkerFlags() { return module.cplusplus ? "-nostartfiles -lgcc" : "-nostartfiles -nostdlib -lgcc"; }
+       void AddImplicitLibraries ( Module& module );
+private:
+       void GenerateWin32OCXModuleTarget ();
+};
+
+
 class MingwWin32CUIModuleHandler : public MingwModuleHandler
 {
 public:
        MingwWin32CUIModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
+       std::string TypeSpecificLinkerFlags() { return module.cplusplus ? "-nostartfiles -lgcc" : "-nostartfiles -nostdlib -lgcc"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateWin32CUIModuleTarget ();
 };
@@ -319,6 +347,8 @@ public:
        MingwWin32GUIModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
+       std::string TypeSpecificLinkerFlags() { return module.cplusplus ? "-nostartfiles -lgcc" : "-nostartfiles -nostdlib -lgcc"; }
+       void AddImplicitLibraries ( Module& module );
 private:
        void GenerateWin32GUIModuleTarget ();
 };
@@ -348,6 +378,19 @@ private:
 };
 
 
+class MingwBootProgramModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwBootProgramModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+       std::string GetProgTextAddrMacro ();
+       std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
+private:
+       void GenerateBootProgramModuleTarget ();
+};
+
+
 class MingwIsoModuleHandler : public MingwModuleHandler
 {
 public:
@@ -356,12 +399,12 @@ public:
        virtual void Process ();
 private:
        void GenerateIsoModuleTarget ();
-       std::string GetBootstrapCdDirectories ( const std::string& bootcdDirectory );
-       std::string GetNonModuleCdDirectories ( const std::string& bootcdDirectory );
-       std::string GetCdDirectories ( const std::string& bootcdDirectory );
-       void GetBootstrapCdFiles ( std::vector<std::string>& out ) const;
-       void GetNonModuleCdFiles ( std::vector<std::string>& out ) const;
-       void GetCdFiles ( std::vector<std::string>& out ) const;
+       void GetBootstrapCdDirectories ( std::vector<FileLocation>& out, const std::string& bootcdDirectory );
+       void GetNonModuleCdDirectories ( std::vector<FileLocation>& out, const std::string& bootcdDirectory );
+       void GetCdDirectories ( std::vector<FileLocation>& out, const std::string& bootcdDirectory );
+       void GetBootstrapCdFiles ( std::vector<FileLocation>& out ) const;
+       void GetNonModuleCdFiles ( std::vector<FileLocation>& out ) const;
+       void GetCdFiles ( std::vector<FileLocation>& out ) const;
        void OutputBootstrapfileCopyCommands ( const std::string& bootcdDirectory );
        void OutputCdfileCopyCommands ( const std::string& bootcdDirectory );
 };
@@ -376,9 +419,6 @@ public:
 private:
        void GenerateLiveIsoModuleTarget ();
        void CreateDirectory ( const std::string& directory );
-       void OutputCopyCommand ( const std::string& sourceFilename,
-                                const std::string& targetFilename,
-                                const std::string& targetDirectory );
        void OutputModuleCopyCommands ( std::string& livecdDirectory,
                                        std::string& livecdReactos );
        void OutputNonModuleCopyCommands ( std::string& livecdDirectory,
@@ -395,8 +435,9 @@ public:
        MingwTestModuleHandler ( const Module& module );
        virtual HostType DefaultHost() { return HostFalse; }
        virtual void Process ();
+       std::string TypeSpecificLinkerFlags() { return "-nostartfiles -nostdlib"; }
 protected:
-       virtual void GetModuleSpecificSourceFiles ( std::vector<File*>& sourceFiles );
+       virtual void GetModuleSpecificCompilationUnits ( std::vector<CompilationUnit*>& compilationUnits );
 private:
        void GenerateTestModuleTarget ();
 };
@@ -419,4 +460,54 @@ public:
        virtual void Process ();
 };
 
+
+class MingwRpcProxyModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwRpcProxyModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+};
+
+
+class MingwAliasModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwAliasModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+};
+
+class MingwIdlHeaderModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwIdlHeaderModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+};
+
+class MingwCabinetModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwCabinetModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+};
+
+class MingwEmbeddedTypeLibModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwEmbeddedTypeLibModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+};
+
+class MingwElfExecutableModuleHandler : public MingwModuleHandler
+{
+public:
+       MingwElfExecutableModuleHandler ( const Module& module );
+       virtual HostType DefaultHost() { return HostFalse; }
+       virtual void Process ();
+};
+
 #endif /* MINGW_MODULEHANDLER_H */