host vs target refactoring, <module> has two new attributes 'host' and 'prefix' ...
[reactos.git] / reactos / tools / rbuild / backend / mingw / modulehandler.cpp
index 90bd48e..a9d6f08 100644 (file)
@@ -31,14 +31,40 @@ ReplaceExtension ( const string& filename,
                    const string& newExtension )\r
 {\r
        size_t index = filename.find_last_of ( '/' );\r
-       if (index == string::npos) index = 0;\r
-       string tmp = filename.substr( index, filename.size() - index );\r
+       if ( index == string::npos )\r
+               index = 0;\r
+       size_t index2 = filename.find_last_of ( '\\' );\r
+       if ( index2 != string::npos && index2 > index )\r
+               index = index2;\r
+       string tmp = filename.substr( index /*, filename.size() - index*/ );\r
        size_t ext_index = tmp.find_last_of( '.' );\r
-       if (ext_index != string::npos) \r
+       if ( ext_index != string::npos )\r
                return filename.substr ( 0, index + ext_index ) + newExtension;\r
        return filename + newExtension;\r
 }\r
 \r
+string\r
+PrefixFilename (\r
+       const string& filename,\r
+       const string& prefix )\r
+{\r
+       if ( !prefix.length() )\r
+               return filename;\r
+       string out;\r
+       const char* pfilename = filename.c_str();\r
+       const char* p1 = strrchr ( pfilename, '/' );\r
+       const char* p2 = strrchr ( pfilename, '\\' );\r
+       if ( p1 || p2 )\r
+       {\r
+               if ( p2 > p1 )\r
+                       p1 = p2;\r
+               out += string(pfilename,p1-pfilename) + CSEP;\r
+               pfilename = p1 + 1;\r
+       }\r
+       out += prefix + pfilename;\r
+       return out;\r
+}\r
+\r
 \r
 MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype )\r
 {\r
@@ -167,22 +193,9 @@ MingwModuleHandler::GetModuleDependencies ( const Module& module ) const
        return dependencies;\r
 }\r
 \r
-/*string\r
-MingwModuleHandler::GetAllDependencies ( const Module& module ) const\r
-{\r
-       string dependencies = GetImportMacro ( module );\r
-       string s = GetModuleDependencies ( module );\r
-       if ( s.length () > 0 )\r
-       {\r
-               dependencies += " ";\r
-               dependencies += s;\r
-       }\r
-       return dependencies;\r
-}*/\r
-\r
 string\r
 MingwModuleHandler::GetSourceFilenames ( const Module& module,\r
-                                            bool includeGeneratedFiles ) const\r
+                                         bool includeGeneratedFiles ) const\r
 {\r
        size_t i;\r
 \r
@@ -229,8 +242,8 @@ MingwModuleHandler::GetSourceFilenamesWithoutGeneratedFiles ( const Module& modu
                                    false );\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetObjectFilename ( const string& sourceFilename )\r
+static string\r
+GetObjectFilename ( const Module& module, const string& sourceFilename )\r
 {\r
        string newExtension;\r
        string extension = GetExtension ( sourceFilename );\r
@@ -240,7 +253,10 @@ MingwModuleHandler::GetObjectFilename ( const string& sourceFilename )
                newExtension = ".stubs.o";\r
        else\r
                newExtension = ".o";\r
-       return FixupTargetFilename ( ReplaceExtension ( sourceFilename, newExtension ) );\r
+       return FixupTargetFilename (\r
+               ReplaceExtension (\r
+                       PrefixFilename(sourceFilename,module.prefix),\r
+                       newExtension ) );\r
 }\r
 \r
 void\r
@@ -274,7 +290,8 @@ MingwModuleHandler::GetObjectFilenames ( const Module& module ) const
        {\r
                if ( objectFilenames.size () > 0 )\r
                        objectFilenames += " ";\r
-               objectFilenames += PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) );\r
+               objectFilenames += PassThruCacheDirectory (\r
+                       GetObjectFilename ( module, files[i]->name ) );\r
        }\r
        return objectFilenames;\r
 }\r
@@ -514,6 +531,7 @@ MingwModuleHandler::GenerateMacro (
 \r
 void\r
 MingwModuleHandler::GenerateMacros (\r
+       const Module& module,\r
        const char* assignmentOperation,\r
        const IfableData& data,\r
        const vector<CompilerFlag*>* compilerFlags,\r
@@ -580,7 +598,7 @@ MingwModuleHandler::GenerateMacros (
                                        "%s := %s $(%s)\n",\r
                                        objs_macro.c_str(),\r
                                        PassThruCacheDirectory (\r
-                                               MingwModuleHandler::GetObjectFilename ( file.name ) ).c_str (),\r
+                                               GetObjectFilename ( module, file.name ) ).c_str (),\r
                                        objs_macro.c_str() );\r
                        }\r
                }\r
@@ -599,7 +617,7 @@ MingwModuleHandler::GenerateMacros (
                                        "%s%s",\r
                                        ( i%10 == 9 ? "\\\n\t" : " " ),\r
                                        PassThruCacheDirectory (\r
-                                               MingwModuleHandler::GetObjectFilename ( file.name ) ).c_str () );\r
+                                               GetObjectFilename ( module, file.name ) ).c_str () );\r
                        }\r
                }\r
                fprintf ( fMakefile, "\n" );\r
@@ -621,6 +639,7 @@ MingwModuleHandler::GenerateMacros (
                                rIf.property.c_str(),\r
                                rIf.value.c_str() );\r
                        GenerateMacros (\r
+                               module,\r
                                "+=",\r
                                rIf.data,\r
                                NULL,\r
@@ -651,6 +670,7 @@ MingwModuleHandler::GenerateMacros (
        const string& linkdeps_macro ) const\r
 {\r
        GenerateMacros (\r
+               module,\r
                "=",\r
                module.non_if_data,\r
                &module.compilerFlags,\r
@@ -721,7 +741,8 @@ MingwModuleHandler::GenerateGccCommand ( const Module& module,
        string deps = sourceFilename;\r
        if ( module.pch && use_pch )\r
                deps += " " + module.pch->header + ".gch";\r
-       string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+       string objectFilename = PassThruCacheDirectory (\r
+               GetObjectFilename ( module, sourceFilename ) );\r
        fprintf ( fMakefile,\r
                  "%s: %s\n",\r
                  objectFilename.c_str (),\r
@@ -741,7 +762,8 @@ MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module,
                                                   const string& cc,\r
                                                   const string& cflagsMacro ) const\r
 {\r
-       string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+       string objectFilename = PassThruCacheDirectory (\r
+               GetObjectFilename ( module, sourceFilename ) );\r
        fprintf ( fMakefile,\r
                  "%s: %s\n",\r
                  objectFilename.c_str (),\r
@@ -760,7 +782,8 @@ MingwModuleHandler::GenerateNasmCommand ( const Module& module,
                                           const string& sourceFilename,\r
                                           const string& nasmflagsMacro ) const\r
 {\r
-       string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+       string objectFilename = PassThruCacheDirectory (\r
+               GetObjectFilename ( module, sourceFilename ) );\r
        fprintf ( fMakefile,\r
                  "%s: %s\n",\r
                  objectFilename.c_str (),\r
@@ -779,7 +802,8 @@ MingwModuleHandler::GenerateWindresCommand ( const Module& module,
                                              const string& sourceFilename,\r
                                              const string& windresflagsMacro ) const\r
 {\r
-       string objectFilename = PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( sourceFilename ) );\r
+       string objectFilename = PassThruCacheDirectory ( \r
+               GetObjectFilename ( module, sourceFilename ) );\r
        string rciFilename = ReplaceExtension ( sourceFilename,\r
                                                ".rci" );\r
        string resFilename = ReplaceExtension ( sourceFilename,\r
@@ -859,7 +883,7 @@ MingwModuleHandler::GenerateCommands (
        const string& windresflagsMacro,\r
        string_list& clean_files ) const\r
 {\r
-       CLEAN_FILE ( GetObjectFilename(sourceFilename) );\r
+       CLEAN_FILE ( GetObjectFilename(module,sourceFilename) );\r
        string extension = GetExtension ( sourceFilename );\r
        if ( extension == ".c" || extension == ".C" )\r
        {\r
@@ -1090,22 +1114,6 @@ MingwModuleHandler::GenerateObjectFileTargets (
        fprintf ( fMakefile, "\n" );\r
 }\r
 \r
-void\r
-MingwModuleHandler::GetCleanTargets (\r
-       string_list& out,\r
-       const IfableData& data ) const\r
-{\r
-       size_t i;\r
-\r
-       const vector<File*>& files = data.files;\r
-       for ( i = 0; i < files.size(); i++ )\r
-               out.push_back ( PassThruCacheDirectory ( MingwModuleHandler::GetObjectFilename ( files[i]->name ) ) );\r
-\r
-       const vector<If*>& ifs = data.ifs;\r
-       for ( i = 0; i < ifs.size(); i++ )\r
-               GetCleanTargets ( out, ifs[i]->data );\r
-}\r
-\r
 string\r
 MingwModuleHandler::GenerateArchiveTarget ( const Module& module,\r
                                             const string& ar,\r
@@ -1165,13 +1173,14 @@ MingwModuleHandler::GetLinkerMacro ( const Module& module ) const
 void\r
 MingwModuleHandler::GenerateMacrosAndTargets (\r
        const Module& module,\r
-       const string& cc,\r
-       const string& cppc,\r
-       const string& ar,\r
        const string* cflags,\r
        const string* nasmflags,\r
        string_list& clean_files ) const\r
 {\r
+       string cc = ( module.host ? "${host_gcc}" : "${gcc}" );\r
+       string cppc = ( module.host ? "${host_gpp}" : "${gpp}" );\r
+       string ar = ( module.host ? "${host_ar}" : "${ar}" );\r
+\r
        string cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());\r
        string nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());\r
        string windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ());\r
@@ -1234,50 +1243,6 @@ MingwModuleHandler::GenerateMacrosAndTargets (
        }\r
 }\r
 \r
-void\r
-MingwModuleHandler::GenerateMacrosAndTargetsHost (\r
-       const Module& module,\r
-       string_list& clean_files ) const\r
-{\r
-       GenerateMacrosAndTargets (\r
-               module,\r
-               "${host_gcc}",\r
-               "${host_gpp}",\r
-               "${host_ar}",\r
-               NULL,\r
-               NULL,\r
-               clean_files );\r
-}\r
-\r
-void\r
-MingwModuleHandler::GenerateMacrosAndTargetsTarget (\r
-       const Module& module,\r
-       string_list& clean_files ) const\r
-{\r
-       GenerateMacrosAndTargetsTarget (\r
-               module,\r
-               NULL,\r
-               NULL,\r
-               clean_files );\r
-}\r
-\r
-void\r
-MingwModuleHandler::GenerateMacrosAndTargetsTarget (\r
-       const Module& module,\r
-       const string* cflags,\r
-       const string* nasmflags,\r
-       string_list& clean_files ) const\r
-{\r
-       GenerateMacrosAndTargets (\r
-               module,\r
-               "${gcc}",\r
-               "${gpp}",\r
-               "${ar}",\r
-               cflags,\r
-               nasmflags,\r
-               clean_files );\r
-}\r
-\r
 string\r
 MingwModuleHandler::GetInvocationDependencies ( const Module& module ) const\r
 {\r
@@ -1489,7 +1454,11 @@ MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& modul
        string linkDepsMacro = GetLinkingDependenciesMacro ( module );\r
        string libsMacro = GetLibsMacro ( module );\r
 \r
-       GenerateMacrosAndTargetsHost ( module, clean_files );\r
+       GenerateMacrosAndTargets (\r
+               module,\r
+               NULL,\r
+               NULL,\r
+               clean_files );\r
 \r
        string linker;\r
        if ( IsCPlusPlusModule ( module ) )\r
@@ -1548,7 +1517,7 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module, str
                                      module.entrypoint.c_str (),\r
                                      module.baseaddress.c_str () );\r
 \r
-       GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+       GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
        GenerateImportLibraryTargetIfNeeded ( module, clean_files );\r
 \r
@@ -1615,7 +1584,7 @@ MingwStaticLibraryModuleHandler::Process ( const Module& module, string_list& cl
 void\r
 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module& module, string_list& clean_files )\r
 {\r
-       GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+       GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 }\r
 \r
 \r
@@ -1637,7 +1606,7 @@ MingwObjectLibraryModuleHandler::Process ( const Module& module, string_list& cl
 void\r
 MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ( const Module& module, string_list& clean_files )\r
 {\r
-       GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+       GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 }\r
 \r
 \r
@@ -1672,7 +1641,7 @@ MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget (
 \r
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+               GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -1732,10 +1701,10 @@ MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget (
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
                string cflags ( "-D__NTDRIVER__" );\r
-               GenerateMacrosAndTargetsTarget ( module,\r
-                                                &cflags,\r
-                                                NULL,\r
-                                                clean_files);\r
+               GenerateMacrosAndTargets ( module,\r
+                                          &cflags,\r
+                                          NULL,\r
+                                          clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -1791,7 +1760,7 @@ MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& modul
 \r
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+               GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -1848,10 +1817,10 @@ MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ( const Module& modul
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
                string cflags ( "-D__NTAPP__" );\r
-               GenerateMacrosAndTargetsTarget ( module,\r
-                                                &cflags,\r
-                                                NULL,\r
-                                                clean_files );\r
+               GenerateMacrosAndTargets ( module,\r
+                                          &cflags,\r
+                                          NULL,\r
+                                          clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -1931,7 +1900,7 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module,
 \r
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+               GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -1939,7 +1908,7 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module,
                          linkDepsMacro.c_str () );\r
 \r
                string linker;\r
-               if ( IsCPlusPlusModule ( module ) )\r
+               if ( module.cplusplus )\r
                        linker = "${gpp}";\r
                else\r
                        linker = "${gcc}";\r
@@ -1993,7 +1962,7 @@ MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ( const Module& module,
 \r
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+               GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -2001,7 +1970,7 @@ MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ( const Module& module,
                          linkDepsMacro.c_str () );\r
 \r
                string linker;\r
-               if ( IsCPlusPlusModule ( module ) )\r
+               if ( module.cplusplus )\r
                        linker = "${gpp}";\r
                else\r
                        linker = "${gcc}";\r
@@ -2055,7 +2024,7 @@ MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module,
 \r
        if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+       GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
                fprintf ( fMakefile, "%s: %s %s\n",\r
                          target.c_str (),\r
@@ -2063,7 +2032,7 @@ MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module,
                          linkDepsMacro.c_str () );\r
 \r
                string linker;\r
-               if ( IsCPlusPlusModule ( module ) )\r
+               if ( module.cplusplus )\r
                        linker = "${gpp}";\r
                else\r
                        linker = "${gcc}";\r
@@ -2118,7 +2087,7 @@ MingwBootLoaderModuleHandler::GenerateBootLoaderModuleTarget (
        string linkDepsMacro = GetLinkingDependenciesMacro ( module );\r
        string libsMacro = GetLibsMacro ( module );\r
 \r
-       GenerateMacrosAndTargetsTarget ( module, clean_files );\r
+       GenerateMacrosAndTargets ( module, NULL, NULL, clean_files );\r
 \r
        fprintf ( fMakefile, "%s: %s %s\n",\r
                  target.c_str (),\r
@@ -2164,10 +2133,10 @@ MingwBootSectorModuleHandler::GenerateBootSectorModuleTarget ( const Module& mod
        string objectsMacro = GetObjectsMacro ( module );\r
 \r
        string* nasmflags = new string ( "-f bin" );\r
-       GenerateMacrosAndTargetsTarget ( module,\r
-                                        NULL,\r
-                                        nasmflags,\r
-                                        clean_files );\r
+       GenerateMacrosAndTargets ( module,\r
+                                  NULL,\r
+                                  nasmflags,\r
+                                  clean_files );\r
 \r
        fprintf ( fMakefile, ".PHONY: %s\n\n",\r
                      module.name.c_str ());\r