create phony targets for each module name, so you can type 'make ntoskrnl' instead...
[reactos.git] / reactos / tools / rbuild / backend / mingw / modulehandler.cpp
index 23fbfba..2803ef7 100644 (file)
@@ -100,7 +100,7 @@ MingwModuleHandler::GetImportLibraryDependencies ( const Module& module ) const
                        dependencies += " ";\r
                const Module* importedModule = module.project.LocateModule ( module.libraries[i]->name );\r
                assert ( importedModule != NULL );\r
-               dependencies += FixupTargetFilename ( importedModule->GetPath () ).c_str ();\r
+               dependencies += FixupTargetFilename ( importedModule->GetDependencyPath () ).c_str ();\r
        }\r
        return dependencies;\r
 }\r
@@ -237,11 +237,14 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Includ
 void\r
 MingwModuleHandler::GenerateGccModuleIncludeVariable ( const Module& module ) const\r
 {\r
-       string name ( module.name + "_INCLUDES" );\r
+#if 0\r
+       string name ( module.name + "_CFLAGS" );\r
        fprintf ( fMakefile,\r
-                 "%s := %s\n",\r
+                 "%s := %s %s\n",\r
                  name.c_str(),\r
+                 GenerateGccDefineParameters(module).c_str(),\r
                  GenerateGccIncludeParameters(module).c_str() );\r
+#endif\r
 }\r
 \r
 string\r
@@ -257,54 +260,180 @@ MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const
        return parameters;\r
 }\r
 \r
-string\r
-MingwModuleHandler::GenerateGccParameters ( const Module& module ) const\r
+void\r
+MingwModuleHandler::GenerateMacros (\r
+       const char* op,\r
+       const vector<File*>& files,\r
+       const vector<Include*>& includes,\r
+       const vector<Define*>& defines,\r
+       const vector<If*>& ifs,\r
+       const string& cflags_macro,\r
+       const string& nasmflags_macro,\r
+       const string& objs_macro) const\r
 {\r
-       string parameters = GenerateGccDefineParameters ( module );\r
-       parameters += ssprintf(" $(%s_INCLUDES)",module.name.c_str());\r
-       return parameters;\r
+       size_t i;\r
+\r
+       if ( includes.size() || defines.size() )\r
+       {\r
+               fprintf (\r
+                       fMakefile,\r
+                       "%s %s",\r
+                       cflags_macro.c_str(),\r
+                       op );\r
+               for ( i = 0; i < includes.size(); i++ )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               " -I%s",\r
+                               includes[i]->directory.c_str() );\r
+               }\r
+               for ( i = 0; i < defines.size(); i++ )\r
+               {\r
+                       Define& d = *defines[i];\r
+                       fprintf (\r
+                               fMakefile,\r
+                               " -D%s",\r
+                               d.name.c_str() );\r
+                       if ( d.value.size() )\r
+                               fprintf (\r
+                                       fMakefile,\r
+                                       "=%s",\r
+                                       d.value.c_str() );\r
+               }\r
+               fprintf ( fMakefile, "\n" );\r
+       }\r
+\r
+       if ( files.size() )\r
+       {\r
+               fprintf (\r
+                       fMakefile,\r
+                       "%s %s",\r
+                       objs_macro.c_str(),\r
+                       op );\r
+               for ( i = 0; i < files.size(); i++ )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "%s%s",\r
+                               ( i%10 == 9 ? "\\\n\t" : " " ),\r
+                               GetObjectFilename(files[i]->name).c_str() );\r
+               }\r
+               fprintf ( fMakefile, "\n" );\r
+       }\r
+\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+       {\r
+               If& rIf = *ifs[i];\r
+               if ( rIf.defines.size() || rIf.includes.size() || rIf.files.size() || rIf.ifs.size() )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "ifeq (\"$(%s)\",\"%s\")\n",\r
+                               rIf.property.c_str(),\r
+                               rIf.value.c_str() );\r
+                       GenerateMacros (\r
+                               "+=",\r
+                               rIf.files,\r
+                               rIf.includes,\r
+                               rIf.defines,\r
+                               rIf.ifs,\r
+                               cflags_macro,\r
+                               nasmflags_macro,\r
+                               objs_macro );\r
+                       fprintf ( \r
+                               fMakefile,\r
+                               "endif\n\n" );\r
+               }\r
+       }\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacros (\r
+       const Module& module,\r
+       const string& cflags_macro,\r
+       const string& nasmflags_macro,\r
+       const string& objs_macro) const\r
+{\r
+       GenerateMacros (\r
+               "=",\r
+               module.files,\r
+               module.includes,\r
+               module.defines,\r
+               module.ifs,\r
+               cflags_macro,\r
+               nasmflags_macro,\r
+               objs_macro );\r
+       fprintf ( fMakefile, "\n" );\r
+\r
+       fprintf (\r
+               fMakefile,\r
+               "%s += $(PROJECT_CFLAGS)\n\n",\r
+               cflags_macro.c_str () );\r
 }\r
 \r
 string\r
 MingwModuleHandler::GenerateGccCommand ( const Module& module,\r
-                                            const string& sourceFilename,\r
-                                            const string& cc ) const\r
+                                         const string& sourceFilename,\r
+                                         const string& cc,\r
+                                         const string& cflagsMacro ) const\r
 {\r
        string objectFilename = GetObjectFilename ( sourceFilename );\r
        return ssprintf ( "%s -c %s -o %s %s\n",\r
                              cc.c_str (),\r
                              sourceFilename.c_str (),\r
                              objectFilename.c_str (),\r
-                             GenerateGccParameters ( module ).c_str () );\r
+                             cflagsMacro.c_str () );\r
 }\r
 \r
 string\r
 MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module,\r
-                                                     const string& sourceFilename,\r
-                                                     const string& cc ) const\r
+                                                  const string& sourceFilename,\r
+                                                  const string& cc,\r
+                                                  const string& cflagsMacro ) const\r
 {\r
        string objectFilename = GetObjectFilename ( sourceFilename );\r
        return ssprintf ( "%s -x assembler-with-cpp -c %s -o %s -D__ASM__ %s\n",\r
-                             cc.c_str (),\r
+                         cc.c_str (),\r
+                         sourceFilename.c_str (),\r
+                         objectFilename.c_str (),\r
+                         cflagsMacro.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateNasmCommand ( const Module& module,\r
+                                          const string& sourceFilename,\r
+                                          const string& nasmflagsMacro ) const\r
+{\r
+       string objectFilename = GetObjectFilename ( sourceFilename );\r
+       return ssprintf ( "%s -f win32 %s -o %s %s\n",\r
+                             "nasm",\r
                              sourceFilename.c_str (),\r
                              objectFilename.c_str (),\r
-                             GenerateGccParameters ( module ).c_str () );\r
+                             nasmflagsMacro.c_str () );\r
 }\r
 \r
 string\r
 MingwModuleHandler::GenerateCommand ( const Module& module,\r
-                                         const string& sourceFilename,\r
-                                         const string& cc ) const\r
+                                      const string& sourceFilename,\r
+                                      const string& cc,\r
+                                      const string& cflagsMacro,\r
+                                      const string& nasmflagsMacro ) const\r
 {\r
        string extension = GetExtension ( sourceFilename );\r
        if ( extension == ".c" || extension == ".C" )\r
                return GenerateGccCommand ( module,\r
                                            sourceFilename,\r
-                                           cc );\r
+                                           cc,\r
+                                           cflagsMacro );\r
        else if ( extension == ".s" || extension == ".S" )\r
                return GenerateGccAssemblerCommand ( module,\r
                                                     sourceFilename,\r
-                                                    cc );\r
+                                                    cc,\r
+                                                    cflagsMacro );\r
+       else if ( extension == ".asm" || extension == ".ASM" )\r
+               return GenerateNasmCommand ( module,\r
+                                            sourceFilename,\r
+                                            nasmflagsMacro );\r
 \r
        throw InvalidOperationException ( __FILE__,\r
                                          __LINE__,\r
@@ -315,16 +444,17 @@ MingwModuleHandler::GenerateCommand ( const Module& module,
 \r
 void\r
 MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
-                                                   const string& cc) const\r
+                                                const vector<File*>& files,\r
+                                                const vector<If*>& ifs,\r
+                                                const string& cc,\r
+                                                const string& cflagsMacro,\r
+                                                const string& nasmflagsMacro ) const\r
 {\r
-       if ( module.files.size () == 0 )\r
-               return;\r
-       \r
-       GenerateGccModuleIncludeVariable ( module );\r
+       size_t i;\r
 \r
-       for ( size_t i = 0; i < module.files.size (); i++ )\r
+       for ( i = 0; i < files.size (); i++ )\r
        {\r
-               string sourceFilename = module.files[i]->name;\r
+               string sourceFilename = files[i]->name;\r
                string objectFilename = GetObjectFilename ( sourceFilename );\r
                fprintf ( fMakefile,\r
                          "%s: %s\n",\r
@@ -334,58 +464,83 @@ MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,
                          "\t%s\n",\r
                          GenerateCommand ( module,\r
                                            sourceFilename,\r
-                                           cc ).c_str () );\r
+                                           cc,\r
+                                           cflagsMacro,\r
+                                           nasmflagsMacro ).c_str () );\r
        }\r
-       \r
-       fprintf ( fMakefile, "\n" );\r
-}\r
 \r
-void\r
-MingwModuleHandler::GenerateObjectFileTargetsHost ( const Module& module ) const\r
-{\r
-       GenerateObjectFileTargets ( module,\r
-                                   "${host_gcc}" );\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+               GenerateObjectFileTargets ( module, ifs[i]->files, ifs[i]->ifs, cc, cflagsMacro, nasmflagsMacro );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateObjectFileTargetsTarget ( const Module& module ) const\r
+MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
+                                                const string& cc,\r
+                                                const string& cflagsMacro,\r
+                                                const string& nasmflagsMacro ) const\r
 {\r
-       GenerateObjectFileTargets ( module,\r
-                                   "${gcc}" );\r
+       GenerateObjectFileTargets ( module, module.files, module.ifs, cc, cflagsMacro, nasmflagsMacro );\r
+       fprintf ( fMakefile, "\n" );\r
 }\r
 \r
 void\r
 MingwModuleHandler::GenerateArchiveTarget ( const Module& module,\r
-                                               const string& ar ) const\r
+                                            const string& ar,\r
+                                            const string& objs_macro ) const\r
 {\r
        string archiveFilename = GetModuleArchiveFilename ( module );\r
        string sourceFilenames = GetSourceFilenames ( module );\r
-       string objectFilenames = GetObjectFilenames ( module );\r
        \r
        fprintf ( fMakefile,\r
                  "%s: %s\n",\r
                  archiveFilename.c_str (),\r
-                 objectFilenames.c_str ());\r
+                 objs_macro.c_str ());\r
 \r
        fprintf ( fMakefile,\r
                  "\t%s -rc %s %s\n\n",\r
                  ar.c_str (),\r
                  archiveFilename.c_str (),\r
-                 objectFilenames.c_str ());\r
+                 objs_macro.c_str ());\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateArchiveTargetHost ( const Module& module ) const\r
+MingwModuleHandler::GenerateMacrosAndTargets (\r
+       const Module& module,\r
+       const string& cc,\r
+       const string& ar ) const\r
 {\r
-       GenerateArchiveTarget ( module,\r
-                               "${host_ar}" );\r
+       string cflagsMacro = ssprintf("%s_CFLAGS",module.name.c_str());\r
+       string nasmflagsMacro = ssprintf("%s_NASMFLAGS",module.name.c_str());\r
+       string objectsMacro = ssprintf("%s_OBJS",module.name.c_str());\r
+\r
+       GenerateMacros ( module, cflagsMacro, nasmflagsMacro, objectsMacro );\r
+\r
+       // generate phony target for module name\r
+       fprintf ( fMakefile, ".PHONY: %s\n",\r
+               module.name.c_str() );\r
+       fprintf ( fMakefile, "%s: %s\n\n",\r
+               module.name.c_str(),\r
+               module.GetPath().c_str() );\r
+\r
+       // future references to the macros will be to get their values\r
+       cflagsMacro = ssprintf("$(%s)",cflagsMacro.c_str());\r
+       nasmflagsMacro = ssprintf("$(%s)",nasmflagsMacro.c_str());\r
+       objectsMacro = ssprintf("$(%s)",objectsMacro.c_str());\r
+\r
+       GenerateArchiveTarget ( module, ar, objectsMacro );\r
+       GenerateObjectFileTargets ( module, cc, cflagsMacro, nasmflagsMacro );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateArchiveTargetTarget ( const Module& module ) const\r
+MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module& module ) const\r
 {\r
-       GenerateArchiveTarget ( module,\r
-                               "${ar}" );\r
+       GenerateMacrosAndTargets ( module, "${host_gcc}", "${host_ar}" );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module ) const\r
+{\r
+       GenerateMacrosAndTargets ( module, "${gcc}", "${ar}" );\r
 }\r
 \r
 string\r
@@ -493,19 +648,40 @@ MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) co
                dependencies += s;\r
        }\r
        \r
+       fprintf ( fMakefile,\r
+                 ".PHONY: %s\n\n",\r
+                 preconditionDependenciesName.c_str () );\r
        fprintf ( fMakefile,\r
                  "%s: %s\n\n",\r
                  preconditionDependenciesName.c_str (),\r
                  dependencies.c_str () );\r
-       fprintf ( fMakefile,\r
-                 "%s: %s\n\n",\r
-                 sourceFilenames.c_str (),\r
-                 preconditionDependenciesName.c_str ());\r
-       fprintf ( fMakefile,\r
-                 ".PHONY: %s\n\n",\r
-                 preconditionDependenciesName.c_str () );\r
+       const char* p = sourceFilenames.c_str();\r
+       const char* end = p + strlen(p);\r
+       while ( p < end )\r
+       {\r
+               const char* p2 = &p[512];\r
+               if ( p2 > end )\r
+                       p2 = end;\r
+               while ( p2 > p && !isspace(*p2) )\r
+                       --p2;\r
+               if ( p == p2 )\r
+               {\r
+                       p2 = strpbrk ( p, " \t" );\r
+                       if ( !p2 )\r
+                               p2 = end;\r
+               }\r
+               fprintf ( fMakefile,\r
+                                 "%.*s: %s\n",\r
+                                 p2-p,\r
+                                 p,\r
+                                 preconditionDependenciesName.c_str ());\r
+               p = p2;\r
+               p += strspn ( p, " \t" );\r
+       }\r
+       fprintf ( fMakefile, "\n" );\r
 }\r
 \r
+\r
 static MingwBuildToolModuleHandler buildtool_handler;\r
 \r
 MingwBuildToolModuleHandler::MingwBuildToolModuleHandler()\r
@@ -526,21 +702,22 @@ MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& modul
 {\r
        string target ( FixupTargetFilename ( module.GetPath () ) );\r
        string archiveFilename = GetModuleArchiveFilename ( module );\r
+\r
+       GenerateMacrosAndTargetsHost ( module );\r
+\r
        fprintf ( fMakefile, "%s: %s\n",\r
                  target.c_str (),\r
                  archiveFilename.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${host_gcc} -o %s %s\n",\r
+                 "\t${host_gcc} -o %s %s\n\n",\r
                  target.c_str (),\r
                  archiveFilename.c_str () );\r
-       GenerateArchiveTargetHost ( module );\r
-       GenerateObjectFileTargetsHost ( module );\r
 }\r
 \r
 static MingwKernelModuleHandler kernelmodule_handler;\r
 \r
 MingwKernelModuleHandler::MingwKernelModuleHandler ()\r
-       : MingwModuleHandler ( KernelModeDLL )\r
+       : MingwModuleHandler ( Kernel )\r
 {\r
 }\r
 \r
@@ -564,13 +741,18 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )
        string base_tmp = ros_junk + module.name + ".base.tmp";\r
        string junk_tmp = ros_junk + module.name + ".junk.tmp";\r
        string temp_exp = ros_junk + module.name + ".temp.exp";\r
+       string gccOptions = ssprintf ("-Wl,-T,%s" SSEP "ntoskrnl.lnk -Wl,--subsystem,native -Wl,--entry,_NtProcessStartup -Wl,--image-base,0xC0000000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+                                     module.GetBasePath ().c_str () );\r
+\r
+       GenerateMacrosAndTargetsTarget ( module );\r
+\r
        fprintf ( fMakefile, "%s: %s %s\n",\r
                  target.c_str (),\r
                  archiveFilename.c_str (),\r
                  importLibraryDependencies.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${gcc} -Wl,--entry,_NtProcessStartup -Wl,-T,%s" SSEP "ntoskrnl.lnk -Wl,--subsystem,native -Wl,--image-base,0xC0000000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -Wl,--base-file,%s -nostartfiles -o %s %s %s\n",\r
-                 module.GetBasePath ().c_str (),\r
+                 "\t${gcc} %s -Wl,--base-file,%s -o %s %s %s\n",\r
+                 gccOptions.c_str (),\r
                  base_tmp.c_str (),\r
                  junk_tmp.c_str (),\r
                  archiveFilename.c_str (),\r
@@ -587,19 +769,18 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )
                  "\t${rm} %s\n",\r
                  base_tmp.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${ld} -Wl,%s -o %s %s %s\n",\r
+                 "\t${gcc} %s -Wl,%s -o %s %s %s\n",\r
+                 gccOptions.c_str (),\r
                  temp_exp.c_str (),\r
                  target.c_str (),\r
                  archiveFilename.c_str (),\r
                  importLibraryDependencies.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${rm} %s\n",\r
+                 "\t${rm} %s\n\n",\r
                  temp_exp.c_str () );\r
-       \r
-       GenerateArchiveTargetTarget ( module );\r
-       GenerateObjectFileTargetsTarget ( module );\r
 }\r
 \r
+\r
 static MingwStaticLibraryModuleHandler staticlibrary_handler;\r
 \r
 MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ()\r
@@ -618,6 +799,188 @@ MingwStaticLibraryModuleHandler::Process ( const Module& module )
 void\r
 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module& module )\r
 {\r
-       GenerateArchiveTargetTarget ( module );\r
-       GenerateObjectFileTargetsTarget ( module );\r
+       GenerateMacrosAndTargetsTarget ( module );\r
+}\r
+\r
+\r
+static MingwKernelModeDLLModuleHandler kernelmodedll_handler;\r
+\r
+MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()\r
+       : MingwModuleHandler ( KernelModeDLL )\r
+{\r
+}\r
+\r
+void\r
+MingwKernelModeDLLModuleHandler::Process ( const Module& module )\r
+{\r
+       GeneratePreconditionDependencies ( module );\r
+       GenerateKernelModeDLLModuleTarget ( module );\r
+       GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Module& module )\r
+{\r
+       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string workingDirectory = GetWorkingDirectory ( );\r
+       string archiveFilename = GetModuleArchiveFilename ( module );\r
+       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+       if (module.importLibrary != NULL)\r
+       {\r
+               fprintf ( fMakefile, "%s:\n",\r
+                         module.GetDependencyPath ().c_str () );\r
+\r
+               fprintf ( fMakefile,\r
+                         "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+                         module.GetTargetName ().c_str (),\r
+                         FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+                         FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+       }\r
+\r
+       if (module.files.size () > 0)\r
+       {\r
+               GenerateMacrosAndTargetsTarget ( module );\r
+\r
+               fprintf ( fMakefile, "%s: %s %s\n",\r
+                         target.c_str (),\r
+                         archiveFilename.c_str (),\r
+                         importLibraryDependencies.c_str () );\r
+       \r
+               fprintf ( fMakefile,\r
+                         "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll -o %s %s %s\n\n",\r
+                         target.c_str (),\r
+                         archiveFilename.c_str (),\r
+                         importLibraryDependencies.c_str () );\r
+       }\r
+       else\r
+       {\r
+               fprintf ( fMakefile, "%s:\n",\r
+                         target.c_str ());\r
+               fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+                         target.c_str ());\r
+       }\r
+}\r
+\r
+\r
+static MingwNativeDLLModuleHandler nativedll_handler;\r
+\r
+MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()\r
+       : MingwModuleHandler ( NativeDLL )\r
+{\r
+}\r
+\r
+void\r
+MingwNativeDLLModuleHandler::Process ( const Module& module )\r
+{\r
+       GeneratePreconditionDependencies ( module );\r
+       GenerateNativeDLLModuleTarget ( module );\r
+       GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& module )\r
+{\r
+       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string workingDirectory = GetWorkingDirectory ( );\r
+       string archiveFilename = GetModuleArchiveFilename ( module );\r
+       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+       if (module.importLibrary != NULL)\r
+       {\r
+               fprintf ( fMakefile, "%s:\n",\r
+                         module.GetDependencyPath ().c_str () );\r
+\r
+               fprintf ( fMakefile,\r
+                         "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+                         module.GetTargetName ().c_str (),\r
+                         FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+                         FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+       }\r
+\r
+       if (module.files.size () > 0)\r
+       {\r
+               GenerateMacrosAndTargetsTarget ( module );\r
+\r
+               fprintf ( fMakefile, "%s: %s %s\n",\r
+                         target.c_str (),\r
+                         archiveFilename.c_str (),\r
+                         importLibraryDependencies.c_str () );\r
+       \r
+               fprintf ( fMakefile,\r
+                         "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DllMainCRTStartup@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n\n",\r
+                         target.c_str (),\r
+                         archiveFilename.c_str (),\r
+                         importLibraryDependencies.c_str () );\r
+       }\r
+       else\r
+       {\r
+               fprintf ( fMakefile, "%s:\n\n",\r
+                         target.c_str ());\r
+               fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+                         target.c_str ());\r
+       }\r
+}\r
+\r
+\r
+static MingwWin32DLLModuleHandler win32dll_handler;\r
+\r
+MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ()\r
+       : MingwModuleHandler ( Win32DLL )\r
+{\r
+}\r
+\r
+void\r
+MingwWin32DLLModuleHandler::Process ( const Module& module )\r
+{\r
+       GeneratePreconditionDependencies ( module );\r
+       GenerateWin32DLLModuleTarget ( module );\r
+       GenerateInvocations ( module );\r
+}\r
+\r
+void\r
+MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module )\r
+{\r
+       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
+       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string workingDirectory = GetWorkingDirectory ( );\r
+       string archiveFilename = GetModuleArchiveFilename ( module );\r
+       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+\r
+       if (module.importLibrary != NULL)\r
+       {\r
+               fprintf ( fMakefile, "%s:\n",\r
+                         module.GetDependencyPath ().c_str () );\r
+\r
+               fprintf ( fMakefile,\r
+                         "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+                         module.GetTargetName ().c_str (),\r
+                         FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+                         FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+       }\r
+\r
+       if (module.files.size () > 0)\r
+       {\r
+               GenerateMacrosAndTargetsTarget ( module );\r
+\r
+               fprintf ( fMakefile, "%s: %s %s\n",\r
+                         target.c_str (),\r
+                         archiveFilename.c_str (),\r
+                         importLibraryDependencies.c_str () );\r
+\r
+               fprintf ( fMakefile,\r
+                         "\t${gcc} -Wl,--subsystem,console -Wl,--entry,_DllMain@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n",\r
+                         target.c_str (),\r
+                         archiveFilename.c_str (),\r
+                         importLibraryDependencies.c_str () );\r
+       }\r
+       else\r
+       {\r
+               fprintf ( fMakefile, "%s:\n\n",\r
+                         target.c_str ());\r
+               fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+                         target.c_str ());\r
+       }\r
 }\r