use ntoskrnl's def file when running dlltool, otherwise not all of ntoskrnl's exports...
[reactos.git] / reactos / tools / rbuild / backend / mingw / modulehandler.cpp
index e807ce0..dd17592 100644 (file)
@@ -139,15 +139,20 @@ MingwModuleHandler::GetAllDependencies ( const Module& module ) const
 string\r
 MingwModuleHandler::GetSourceFilenames ( const Module& module ) const\r
 {\r
-       if ( module.files.size () == 0 )\r
-               return "";\r
-       \r
+       size_t i;\r
+\r
        string sourceFilenames ( "" );\r
-       for ( size_t i = 0; i < module.files.size (); i++ )\r
+       for ( i = 0; i < module.files.size (); i++ )\r
+               sourceFilenames += " " + module.files[i]->name;\r
+       vector<If*> ifs = module.ifs;\r
+       for ( i = 0; i < ifs.size(); i++ )\r
        {\r
-               if ( sourceFilenames.size () > 0 )\r
-                       sourceFilenames += " ";\r
-               sourceFilenames += module.files[i]->name;\r
+               size_t j;\r
+               If& rIf = *ifs[i];\r
+               for ( j = 0; j < rIf.ifs.size(); j++ )\r
+                       ifs.push_back ( rIf.ifs[j] );\r
+               for ( j = 0; j < rIf.files.size(); j++ )\r
+                       sourceFilenames += " " + rIf.files[j]->name;\r
        }\r
        return sourceFilenames;\r
 }\r
@@ -262,34 +267,34 @@ MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const
 \r
 void\r
 MingwModuleHandler::GenerateMacros (\r
-       const Module& module,\r
        const char* op,\r
        const vector<File*>& files,\r
-       const vector<Include*>* includes,\r
+       const vector<Include*>& includes,\r
        const vector<Define*>& defines,\r
-       const vector<If*>* ifs,\r
+       const vector<If*>& ifs,\r
        const string& cflags_macro,\r
        const string& nasmflags_macro,\r
        const string& objs_macro) const\r
 {\r
        size_t i;\r
 \r
-       if ( (includes && includes->size()) || defines.size() )\r
+       if ( includes.size() || defines.size() )\r
        {\r
                fprintf (\r
                        fMakefile,\r
                        "%s %s",\r
                        cflags_macro.c_str(),\r
                        op );\r
-               if ( includes )\r
-                       for ( i = 0; i < includes->size(); i++ )\r
-                               fprintf (\r
-                                       fMakefile,\r
-                                       " -I%s",\r
-                                       (*includes)[i]->directory.c_str() );\r
-               for ( i = 0; i < module.defines.size(); i++ )\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 = *module.defines[i];\r
+                       Define& d = *defines[i];\r
                        fprintf (\r
                                fMakefile,\r
                                " -D%s",\r
@@ -321,32 +326,28 @@ MingwModuleHandler::GenerateMacros (
                fprintf ( fMakefile, "\n" );\r
        }\r
 \r
-       if ( ifs && ifs->size() )\r
+       for ( i = 0; i < ifs.size(); i++ )\r
        {\r
-               for ( size_t i = 0; i < module.ifs.size(); i++ )\r
+               If& rIf = *ifs[i];\r
+               if ( rIf.defines.size() || rIf.includes.size() || rIf.files.size() || rIf.ifs.size() )\r
                {\r
-                       If& rIf = *(*ifs)[i];\r
-                       if ( rIf.defines.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
-                                       module,\r
-                                       "+=",\r
-                                       rIf.files,\r
-                                       NULL,\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
+                       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
@@ -359,47 +360,20 @@ MingwModuleHandler::GenerateMacros (
        const string& objs_macro) const\r
 {\r
        GenerateMacros (\r
-               module,\r
                "=",\r
                module.files,\r
-               &module.includes,\r
+               module.includes,\r
                module.defines,\r
-               NULL,\r
+               module.ifs,\r
                cflags_macro,\r
                nasmflags_macro,\r
                objs_macro );\r
        fprintf ( fMakefile, "\n" );\r
 \r
-       for ( size_t i = 0; i < module.ifs.size(); i++ )\r
-       {\r
-               If& rIf = *module.ifs[i];\r
-               if ( rIf.defines.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
-                               module,\r
-                               "+=",\r
-                               rIf.files,\r
-                               NULL,\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
        fprintf (\r
                fMakefile,\r
-               "%s_CFLAGS += $(PROJECT_CFLAGS)\n\n",\r
-               module.name.c_str () );\r
+               "%s += $(PROJECT_CFLAGS)\n\n",\r
+               cflags_macro.c_str () );\r
 }\r
 \r
 string\r
@@ -476,14 +450,14 @@ MingwModuleHandler::GenerateCommand ( const Module& module,
 void\r
 MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\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 ( files.size () == 0 )\r
-               return;\r
+       size_t i;\r
 \r
-       for ( size_t i = 0; i < files.size (); i++ )\r
+       for ( i = 0; i < files.size (); i++ )\r
        {\r
                string sourceFilename = files[i]->name;\r
                string objectFilename = GetObjectFilename ( sourceFilename );\r
@@ -499,8 +473,9 @@ MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,
                                            cflagsMacro,\r
                                            nasmflagsMacro ).c_str () );\r
        }\r
-       \r
-       fprintf ( fMakefile, "\n" );\r
+\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
@@ -509,18 +484,30 @@ MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,
                                                 const string& cflagsMacro,\r
                                                 const string& nasmflagsMacro ) const\r
 {\r
-       GenerateObjectFileTargets ( module, module.files, cc, cflagsMacro, nasmflagsMacro );\r
-       for ( size_t i = 0; i < module.ifs.size(); i++ )\r
-               GenerateObjectFileTargets ( module, module.ifs[i]->files, cc, cflagsMacro, nasmflagsMacro );\r
+       GenerateObjectFileTargets ( module, module.files, module.ifs, cc, cflagsMacro, nasmflagsMacro );\r
+       fprintf ( fMakefile, "\n" );\r
 }\r
 \r
 void\r
+MingwModuleHandler::GetCleanTargets ( vector<string>& out,\r
+                                      const vector<File*>& files,\r
+                                      const vector<If*>& ifs ) const\r
+{\r
+       size_t i;\r
+\r
+       for ( i = 0; i < files.size(); i++ )\r
+               out.push_back ( GetObjectFilename(files[i]->name) );\r
+\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+               GetCleanTargets ( out, ifs[i]->files, ifs[i]->ifs );\r
+}\r
+\r
+string\r
 MingwModuleHandler::GenerateArchiveTarget ( const Module& module,\r
                                             const string& ar,\r
                                             const string& objs_macro ) const\r
 {\r
        string archiveFilename = GetModuleArchiveFilename ( module );\r
-       string sourceFilenames = GetSourceFilenames ( module );\r
        \r
        fprintf ( fMakefile,\r
                  "%s: %s\n",\r
@@ -532,6 +519,8 @@ MingwModuleHandler::GenerateArchiveTarget ( const Module& module,
                  ar.c_str (),\r
                  archiveFilename.c_str (),\r
                  objs_macro.c_str ());\r
+\r
+       return archiveFilename;\r
 }\r
 \r
 void\r
@@ -546,13 +535,34 @@ MingwModuleHandler::GenerateMacrosAndTargets (
 \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
+       string ar_target = GenerateArchiveTarget ( module, ar, objectsMacro );\r
        GenerateObjectFileTargets ( module, cc, cflagsMacro, nasmflagsMacro );\r
+\r
+       vector<string> clean_files;\r
+       clean_files.push_back ( FixupTargetFilename(module.GetPath()) );\r
+       clean_files.push_back ( ar_target );\r
+       GetCleanTargets ( clean_files, module.files, module.ifs );\r
+\r
+       fprintf ( fMakefile, "clean::\n\t-@$(rm)" );\r
+       for ( size_t i = 0; i < clean_files.size(); i++ )\r
+       {\r
+               if ( 9==(i%10) )\r
+                       fprintf ( fMakefile, " 2>NUL\n\t-@$(rm)" );\r
+               fprintf ( fMakefile, " %s", clean_files[i].c_str() );\r
+       }\r
+       fprintf ( fMakefile, " 2>NUL\n\n" );\r
 }\r
 \r
 void\r
@@ -726,6 +736,9 @@ 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
@@ -733,7 +746,6 @@ MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& modul
                  "\t${host_gcc} -o %s %s\n\n",\r
                  target.c_str (),\r
                  archiveFilename.c_str () );\r
-       GenerateMacrosAndTargetsHost ( module );\r
 }\r
 \r
 static MingwKernelModuleHandler kernelmodule_handler;\r
@@ -765,6 +777,9 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )
        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
@@ -780,10 +795,11 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )
                  "\t${rm} %s\n",\r
                  junk_tmp.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${dlltool} --dllname %s --base-file %s --output-exp %s --kill-at\n",\r
+                 "\t${dlltool} --dllname %s --base-file %s --def ntoskrnl/ntoskrnl.def --output-exp %s --kill-at\n",\r
                  target.c_str (),\r
                  base_tmp.c_str (),\r
-                 temp_exp.c_str ());\r
+                 //FixupTargetFilename ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
+                 temp_exp.c_str () );\r
        fprintf ( fMakefile,\r
                  "\t${rm} %s\n",\r
                  base_tmp.c_str () );\r
@@ -797,8 +813,6 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )
        fprintf ( fMakefile,\r
                  "\t${rm} %s\n\n",\r
                  temp_exp.c_str () );\r
-       \r
-       GenerateMacrosAndTargetsTarget ( module );\r
 }\r
 \r
 \r
@@ -862,6 +876,8 @@ MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Modul
 \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
@@ -872,8 +888,6 @@ MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Modul
                          target.c_str (),\r
                          archiveFilename.c_str (),\r
                          importLibraryDependencies.c_str () );\r
-               \r
-               GenerateMacrosAndTargetsTarget ( module );\r
        }\r
        else\r
        {\r
@@ -923,6 +937,8 @@ MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& modul
 \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
@@ -933,8 +949,6 @@ MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& modul
                          target.c_str (),\r
                          archiveFilename.c_str (),\r
                          importLibraryDependencies.c_str () );\r
-               \r
-               GenerateMacrosAndTargetsTarget ( module );\r
        }\r
        else\r
        {\r
@@ -984,6 +998,8 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module
 \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
@@ -994,8 +1010,6 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module
                          target.c_str (),\r
                          archiveFilename.c_str (),\r
                          importLibraryDependencies.c_str () );\r
-               \r
-               GenerateMacrosAndTargetsTarget ( module );\r
        }\r
        else\r
        {\r