reorder GenerateRules() to get rid of unnecessary if()
[reactos.git] / reactos / tools / rbuild / backend / mingw / modulehandler.cpp
index f353b81..d2012f4 100644 (file)
 \r
 using std::string;\r
 using std::vector;\r
-using std::map;\r
-using std::set;\r
 \r
-typedef set<string> set_string;\r
-\r
-map<ModuleType,MingwModuleHandler*>*\r
-MingwModuleHandler::handler_map = NULL;\r
-set_string\r
-MingwModuleHandler::directory_set;\r
-int\r
-MingwModuleHandler::ref = 0;\r
+#define CLEAN_FILE(f) clean_files.push_back ( f ); /*if ( module.name == "crt" ) printf ( "%s(%i): clean: %s\n", __FILE__, __LINE__, f.c_str() )*/\r
 \r
+static string ros_temp = "$(ROS_TEMPORARY)";\r
+MingwBackend*\r
+MingwModuleHandler::backend = NULL;\r
 FILE*\r
 MingwModuleHandler::fMakefile = NULL;\r
+bool\r
+MingwModuleHandler::use_pch = false;\r
 \r
-MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype )\r
+string\r
+PrefixFilename (\r
+       const string& filename,\r
+       const string& prefix )\r
 {\r
-       if ( !ref++ )\r
-               handler_map = new map<ModuleType,MingwModuleHandler*>;\r
-       (*handler_map)[moduletype] = this;\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
-MingwModuleHandler::~MingwModuleHandler()\r
+string\r
+v2s ( const string_list& v, int wrap_at )\r
 {\r
-       if ( !--ref )\r
+       if ( !v.size() )\r
+               return "";\r
+       string s;\r
+       int wrap_count = 0;\r
+       for ( size_t i = 0; i < v.size(); i++ )\r
        {\r
-               delete handler_map;\r
-               handler_map = NULL;\r
+               if ( !v[i].size() )\r
+                       continue;\r
+               if ( wrap_at > 0 && wrap_count++ == wrap_at )\r
+                       s += " \\\n\t\t";\r
+               else if ( s.size() )\r
+                       s += " ";\r
+               s += v[i];\r
        }\r
+       return s;\r
 }\r
 \r
-const string &\r
-MingwModuleHandler::PassThruCacheDirectory( const string &file ) const \r
+string\r
+GetTargetMacro ( const Module& module, bool with_dollar )\r
 {\r
-    directory_set.insert( ReplaceExtension( GetDirectory( file ), "" ) );\r
-    return file;\r
+       string s ( module.name );\r
+       strupr ( &s[0] );\r
+       s += "_TARGET";\r
+       if ( with_dollar )\r
+               return ssprintf ( "$(%s)", s.c_str() );\r
+       return s;\r
 }\r
 \r
-void\r
+MingwModuleHandler::MingwModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : module(module_)\r
+{\r
+}\r
+\r
+MingwModuleHandler::~MingwModuleHandler()\r
+{\r
+}\r
+\r
+/*static*/ void\r
+MingwModuleHandler::SetBackend ( MingwBackend* backend_ )\r
+{\r
+       backend = backend_;\r
+}\r
+\r
+/*static*/ void\r
 MingwModuleHandler::SetMakefile ( FILE* f )\r
 {\r
        fMakefile = f;\r
 }\r
 \r
-MingwModuleHandler*\r
-MingwModuleHandler::LookupHandler ( const string& location,\r
-                                    ModuleType moduletype )\r
+/*static*/ void\r
+MingwModuleHandler::SetUsePch ( bool b )\r
+{\r
+       use_pch = b;\r
+}\r
+\r
+/*static*/ string\r
+MingwModuleHandler::PassThruCacheDirectory (\r
+       const string &file, bool out )\r
+{\r
+       string dir ( GetDirectory ( file ) );\r
+       return backend->AddDirectoryTarget ( dir, out ) + SSEP + file;\r
+}\r
+\r
+/*static*/ string\r
+MingwModuleHandler::GetTargetFilename (\r
+       const Module& module,\r
+       string_list* pclean_files )\r
 {\r
-       if ( !handler_map )\r
-               throw Exception ( "internal tool error: no registered module handlers" );\r
-       MingwModuleHandler* h = (*handler_map)[moduletype];\r
-       if ( !h )\r
+       string target = PassThruCacheDirectory (\r
+               FixupTargetFilename ( module.GetPath () ),\r
+               true );\r
+       if ( pclean_files )\r
        {\r
-               throw UnknownModuleTypeException ( location, moduletype );\r
-               return NULL;\r
+               string_list& clean_files = *pclean_files;\r
+               CLEAN_FILE ( target );\r
        }\r
-       return h;\r
+       return target;\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetWorkingDirectory () const\r
+/*static*/ string\r
+MingwModuleHandler::GetImportLibraryFilename (\r
+       const Module& module,\r
+       string_list* pclean_files )\r
 {\r
-       return ".";\r
+       string target = PassThruCacheDirectory (\r
+               FixupTargetFilename ( module.GetDependencyPath () ),\r
+               true );\r
+       if ( pclean_files )\r
+       {\r
+               string_list& clean_files = *pclean_files;\r
+               CLEAN_FILE ( target );\r
+       }\r
+       return target;\r
 }\r
 \r
-string \r
-MingwModuleHandler::GetDirectory ( const string& filename ) const \r
+/*static*/ MingwModuleHandler*\r
+MingwModuleHandler::InstanciateHandler (\r
+       const Module& module,\r
+       MingwBackend* backend )\r
 {\r
-       size_t index = filename.find_last_of ( '/' );\r
-       if (index == string::npos)\r
-               return ".";\r
-       else\r
-               return filename.substr ( 0, index );\r
+       MingwModuleHandler* handler;\r
+       switch ( module.type )\r
+       {\r
+               case BuildTool:\r
+                       handler = new MingwBuildToolModuleHandler ( module );\r
+                       break;\r
+               case StaticLibrary:\r
+                       handler = new MingwStaticLibraryModuleHandler ( module );\r
+                       break;\r
+               case ObjectLibrary:\r
+                       handler = new MingwObjectLibraryModuleHandler ( module );\r
+                       break;\r
+               case Kernel:\r
+                       handler = new MingwKernelModuleHandler ( module );\r
+                       break;\r
+               case NativeCUI:\r
+                       handler = new MingwNativeCUIModuleHandler ( module );\r
+                       break;\r
+               case Win32CUI:\r
+                       handler = new MingwWin32CUIModuleHandler ( module );\r
+                       break;\r
+               case Win32GUI:\r
+                       handler = new MingwWin32GUIModuleHandler ( module );\r
+                       break;\r
+               case KernelModeDLL:\r
+                       handler = new MingwKernelModeDLLModuleHandler ( module );\r
+                       break;\r
+               case NativeDLL:\r
+                       handler = new MingwNativeDLLModuleHandler ( module );\r
+                       break;\r
+               case Win32DLL:\r
+                       handler = new MingwWin32DLLModuleHandler ( module );\r
+                       break;\r
+               case KernelModeDriver:\r
+                       handler = new MingwKernelModeDriverModuleHandler ( module );\r
+                       break;\r
+               case BootLoader:\r
+                       handler = new MingwBootLoaderModuleHandler ( module );\r
+                       break;\r
+               case BootSector:\r
+                       handler = new MingwBootSectorModuleHandler ( module );\r
+                       break;\r
+               case Iso:\r
+                       handler = new MingwIsoModuleHandler ( module );\r
+                       break;\r
+               case Test:\r
+                       handler = new MingwTestModuleHandler ( module );\r
+                       break;\r
+               default:\r
+                       throw UnknownModuleTypeException (\r
+                               module.node.location,\r
+                               module.type );\r
+                       break;\r
+       }\r
+       return handler;\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetExtension ( const string& filename ) const\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
-       size_t ext_index = tmp.find_last_of( '.' );\r
-       if (ext_index != string::npos) \r
-               return filename.substr ( index + ext_index, filename.size() );\r
-       return "";\r
+MingwModuleHandler::GetWorkingDirectory () const\r
+{\r
+       return ".";\r
 }\r
 \r
 string\r
 MingwModuleHandler::GetBasename ( const string& filename ) const\r
 {\r
        size_t index = filename.find_last_of ( '.' );\r
-       if (index != string::npos)\r
+       if ( index != string::npos )\r
                return filename.substr ( 0, index );\r
        return "";\r
 }\r
 \r
 string\r
-MingwModuleHandler::ReplaceExtension ( const string& filename,\r
-                                       const string& newExtension ) const\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
-       size_t ext_index = tmp.find_last_of( '.' );\r
-       if (ext_index != string::npos) \r
-               return filename.substr ( 0, index + ext_index ) + newExtension;\r
-       return filename + newExtension;\r
-}\r
-\r
-string\r
-MingwModuleHandler::GetActualSourceFilename ( const string& filename ) const\r
+MingwModuleHandler::GetActualSourceFilename (\r
+       const string& filename ) const\r
 {\r
        string extension = GetExtension ( filename );\r
        if ( extension == ".spec" || extension == "SPEC" )\r
        {\r
-               string basename = GetBasename( filename );\r
+               string basename = GetBasename ( filename );\r
                return basename + ".stubs.c";\r
        }\r
        else\r
@@ -130,89 +232,105 @@ MingwModuleHandler::GetActualSourceFilename ( const string& filename ) const
 }\r
 \r
 string\r
-MingwModuleHandler::GetModuleArchiveFilename ( const Module& module ) const\r
+MingwModuleHandler::GetModuleArchiveFilename () const\r
 {\r
-       return ReplaceExtension ( FixupTargetFilename ( module.GetPath () ),\r
-                                 ".a" );\r
+       if ( module.type == StaticLibrary )\r
+               return GetTargetFilename(module,NULL);\r
+       return PassThruCacheDirectory ( ReplaceExtension (\r
+               FixupTargetFilename ( module.GetPath () ),\r
+               ".temp.a" ), false );\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetImportLibraryDependencies ( const Module& module ) const\r
+bool\r
+MingwModuleHandler::IsGeneratedFile ( const File& file ) const\r
 {\r
-       if ( module.libraries.size () == 0 )\r
-               return "";\r
-       \r
-       string dependencies ( "" );\r
-       for ( size_t i = 0; i < module.libraries.size (); i++ )\r
-       {\r
-               if ( dependencies.size () > 0 )\r
-                       dependencies += " ";\r
-               const Module* importedModule = module.project.LocateModule ( module.libraries[i]->name );\r
-               assert ( importedModule != NULL );\r
-               dependencies += PassThruCacheDirectory ( FixupTargetFilename ( importedModule->GetDependencyPath () ) ).c_str ();\r
-       }\r
-       return dependencies;\r
+       string extension = GetExtension ( file.name );\r
+       return ( extension == ".spec" || extension == "SPEC" );\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetModuleDependencies ( const Module& module ) const\r
+MingwModuleHandler::GetImportLibraryDependency (\r
+       const Module& importedModule )\r
 {\r
-       if ( module.dependencies.size () == 0 )\r
-               return "";\r
-       \r
-       string dependencies ( "" );\r
-       for ( size_t i = 0; i < module.dependencies.size (); i++ )\r
-       {\r
-               if ( dependencies.size () > 0 )\r
-                       dependencies += " ";\r
-               const Dependency* dependency = module.dependencies[i];\r
-               const Module* dependencyModule = dependency->dependencyModule;\r
-               dependencies += dependencyModule->GetTargets ();\r
-       }\r
-       string definitionDependencies = GetDefinitionDependencies ( module );\r
-       if ( dependencies.length () > 0 && definitionDependencies.length () > 0 )\r
-               dependencies += " " + definitionDependencies;\r
-       else if ( definitionDependencies.length () > 0 )\r
-               dependencies = definitionDependencies;\r
-       return dependencies;\r
+       string dep;\r
+       if ( importedModule.type == ObjectLibrary )\r
+               dep = GetTargetMacro ( importedModule );\r
+       else\r
+               dep = GetImportLibraryFilename ( importedModule, NULL );\r
+       return dep;\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetAllDependencies ( const Module& module ) const\r
+void\r
+MingwModuleHandler::GetModuleDependencies (\r
+       string_list& dependencies )\r
 {\r
-       string dependencies = GetImportLibraryDependencies ( module );\r
-       string s = GetModuleDependencies ( module );\r
-       if (s.length () > 0)\r
+       size_t iend = module.dependencies.size ();\r
+\r
+       // TODO FIXME - do we *really* not want to call\r
+       // GetDefinitionDependencies() if dependencies.size() == 0 ???\r
+       if ( iend == 0 )\r
+               return;\r
+       \r
+       for ( size_t i = 0; i < iend; i++ )\r
        {\r
-               dependencies += " ";\r
-               dependencies += s;\r
+               const Dependency& dependency = *module.dependencies[i];\r
+               const Module& dependencyModule = *dependency.dependencyModule;\r
+               dependencyModule.GetTargets ( dependencies );\r
        }\r
-       return dependencies;\r
+       GetDefinitionDependencies ( dependencies );\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetSourceFilenames ( const Module& module ) const\r
+void\r
+MingwModuleHandler::GetSourceFilenames (\r
+       string_list& list,\r
+       bool includeGeneratedFiles ) const\r
 {\r
        size_t i;\r
 \r
-       string sourceFilenames ( "" );\r
-       for ( i = 0; i < module.files.size (); i++ )\r
-               sourceFilenames += " " + GetActualSourceFilename ( module.files[i]->name );\r
-       vector<If*> ifs = module.ifs;\r
-       for ( i = 0; i < ifs.size(); i++ )\r
+       const vector<File*>& files = module.non_if_data.files;\r
+       for ( i = 0; i < files.size (); i++ )\r
+       {\r
+               if ( includeGeneratedFiles || !IsGeneratedFile ( *files[i] ) )\r
+               {\r
+                       list.push_back (\r
+                               GetActualSourceFilename ( files[i]->name ) );\r
+               }\r
+       }\r
+       // intentionally make a copy so that we can append more work in\r
+       // the middle of processing without having to go recursive\r
+       vector<If*> v = module.non_if_data.ifs;\r
+       for ( i = 0; i < v.size (); i++ )\r
        {\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 += " " + GetActualSourceFilename ( rIf.files[j]->name );\r
+               If& rIf = *v[i];\r
+               // check for sub-ifs to add to list\r
+               const vector<If*>& ifs = rIf.data.ifs;\r
+               for ( j = 0; j < ifs.size (); j++ )\r
+                       v.push_back ( ifs[j] );\r
+               const vector<File*>& files = rIf.data.files;\r
+               for ( j = 0; j < files.size (); j++ )\r
+               {\r
+                       File& file = *files[j];\r
+                       if ( includeGeneratedFiles || !IsGeneratedFile ( file ) )\r
+                       {\r
+                               list.push_back (\r
+                                       GetActualSourceFilename ( file.name ) );\r
+                       }\r
+               }\r
        }\r
-       return sourceFilenames;\r
+}\r
+\r
+void\r
+MingwModuleHandler::GetSourceFilenamesWithoutGeneratedFiles (\r
+       string_list& list ) const\r
+{\r
+       GetSourceFilenames ( list, false );\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetObjectFilename ( const string& sourceFilename ) const\r
+MingwModuleHandler::GetObjectFilename (\r
+       const string& sourceFilename,\r
+       string_list* pclean_files ) const\r
 {\r
        string newExtension;\r
        string extension = GetExtension ( sourceFilename );\r
@@ -222,60 +340,58 @@ MingwModuleHandler::GetObjectFilename ( const string& sourceFilename ) const
                newExtension = ".stubs.o";\r
        else\r
                newExtension = ".o";\r
-       return PassThruCacheDirectory (\r
+       string obj_file = PassThruCacheDirectory (\r
                FixupTargetFilename (\r
-                       ReplaceExtension ( sourceFilename, newExtension ) ) );\r
+                       ReplaceExtension (\r
+                               sourceFilename, //PrefixFilename(sourceFilename,module.prefix),\r
+                               newExtension ) ),\r
+                       false );\r
+       if ( pclean_files )\r
+       {\r
+               string_list& clean_files = *pclean_files;\r
+               CLEAN_FILE ( obj_file );\r
+       }\r
+       return obj_file;\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateCleanTarget () const\r
+{\r
+       if ( 0 == clean_files.size() )\r
+               return;\r
+       fprintf ( fMakefile, ".PHONY: %s_clean\n", module.name.c_str() );\r
+       fprintf ( fMakefile, "%s_clean:\n\t-@$(rm)", module.name.c_str() );\r
+       for ( size_t i = 0; i < clean_files.size(); i++ )\r
+       {\r
+               if ( 9==((i+1)%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" );\r
+       fprintf ( fMakefile, "clean: %s_clean\n\n", module.name.c_str() );\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetObjectFilenames ( const Module& module ) const\r
+MingwModuleHandler::GetObjectFilenames ()\r
 {\r
-       if ( module.files.size () == 0 )\r
+       const vector<File*>& files = module.non_if_data.files;\r
+       if ( files.size () == 0 )\r
                return "";\r
        \r
        string objectFilenames ( "" );\r
-       for ( size_t i = 0; i < module.files.size (); i++ )\r
+       for ( size_t i = 0; i < files.size (); i++ )\r
        {\r
                if ( objectFilenames.size () > 0 )\r
                        objectFilenames += " ";\r
-               objectFilenames += GetObjectFilename ( module.files[i]->name );\r
+               objectFilenames +=\r
+                       GetObjectFilename ( files[i]->name, NULL );\r
        }\r
        return objectFilenames;\r
 }\r
 \r
-void\r
-MingwModuleHandler::GenerateDirectoryTargets() const \r
-{\r
-       set_string::iterator i;\r
-       fprintf( fMakefile, "ifneq ($(ROS_INTERMEDIATE),)\ndirectories::" );\r
-\r
-       for ( i = directory_set.begin();\r
-             i != directory_set.end();\r
-             i++ )\r
-       {\r
-               fprintf ( fMakefile, " %s", i->c_str() );\r
-       }\r
-\r
-       fprintf( fMakefile, "\n\n" );\r
-\r
-       for ( i = directory_set.begin();\r
-             i != directory_set.end();\r
-             i++ )\r
-       {\r
-               fprintf ( fMakefile, "%s ", i->c_str() );\r
-       }\r
-\r
-       fprintf ( fMakefile, \r
-                 "::\n\t${mkdir} $@\n\n"\r
-                 "else\n"\r
-                 "directories::\n\n"\r
-                 "endif\n\n" );\r
-\r
-       directory_set.clear();\r
-}\r
-\r
 string\r
-MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector<Define*>& defines ) const\r
+MingwModuleHandler::GenerateGccDefineParametersFromVector (\r
+       const vector<Define*>& defines ) const\r
 {\r
        string parameters;\r
        for ( size_t i = 0; i < defines.size (); i++ )\r
@@ -295,10 +411,10 @@ MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector<Define*
 }\r
 \r
 string\r
-MingwModuleHandler::GenerateGccDefineParameters ( const Module& module ) const\r
+MingwModuleHandler::GenerateGccDefineParameters () const\r
 {\r
-       string parameters = GenerateGccDefineParametersFromVector ( module.project.defines );\r
-       string s = GenerateGccDefineParametersFromVector ( module.defines );\r
+       string parameters = GenerateGccDefineParametersFromVector ( module.project.non_if_data.defines );\r
+       string s = GenerateGccDefineParametersFromVector ( module.non_if_data.defines );\r
        if ( s.length () > 0 )\r
        {\r
                parameters += " ";\r
@@ -308,8 +424,9 @@ MingwModuleHandler::GenerateGccDefineParameters ( const Module& module ) const
 }\r
 \r
 string\r
-MingwModuleHandler::ConcatenatePaths ( const string& path1,\r
-                                          const string& path2 ) const\r
+MingwModuleHandler::ConcatenatePaths (\r
+       const string& path1,\r
+       const string& path2 ) const\r
 {\r
        if ( ( path1.length () == 0 ) || ( path1 == "." ) || ( path1 == "./" ) )\r
                return path2;\r
@@ -326,7 +443,7 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Includ
        for ( size_t i = 0; i < includes.size (); i++ )\r
        {\r
                Include& include = *includes[i];\r
-               if (parameters.length () > 0)\r
+               if ( parameters.length () > 0 )\r
                        parameters += " ";\r
                parameters += "-I" + include.directory;\r
        }\r
@@ -334,10 +451,10 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Includ
 }\r
 \r
 string\r
-MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const\r
+MingwModuleHandler::GenerateGccIncludeParameters () const\r
 {\r
-       string parameters = GenerateGccIncludeParametersFromVector ( module.includes );\r
-       string s = GenerateGccIncludeParametersFromVector ( module.project.includes );\r
+       string parameters = GenerateGccIncludeParametersFromVector ( module.non_if_data.includes );\r
+       string s = GenerateGccIncludeParametersFromVector ( module.project.non_if_data.includes );\r
        if ( s.length () > 0 )\r
        {\r
                parameters += " ";\r
@@ -347,6 +464,20 @@ MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const
 }\r
 \r
 \r
+string\r
+MingwModuleHandler::GenerateCompilerParametersFromVector ( const vector<CompilerFlag*>& compilerFlags ) const\r
+{\r
+       string parameters;\r
+       for ( size_t i = 0; i < compilerFlags.size (); i++ )\r
+       {\r
+               CompilerFlag& compilerFlag = *compilerFlags[i];\r
+               if ( parameters.length () > 0 )\r
+                       parameters += " ";\r
+               parameters += compilerFlag.flag;\r
+       }\r
+       return parameters;\r
+}\r
+\r
 string\r
 MingwModuleHandler::GenerateLinkerParametersFromVector ( const vector<LinkerFlag*>& linkerFlags ) const\r
 {\r
@@ -362,16 +493,34 @@ MingwModuleHandler::GenerateLinkerParametersFromVector ( const vector<LinkerFlag
 }\r
 \r
 string\r
-MingwModuleHandler::GenerateLinkerParameters ( const Module& module ) const\r
+MingwModuleHandler::GenerateImportLibraryDependenciesFromVector (\r
+       const vector<Library*>& libraries )\r
+{\r
+       string dependencies ( "" );\r
+       int wrap_count = 0;\r
+       for ( size_t i = 0; i < libraries.size (); i++ )\r
+       {\r
+               if ( wrap_count++ == 5 )\r
+                       dependencies += " \\\n\t\t", wrap_count = 0;\r
+               else if ( dependencies.size () > 0 )\r
+                       dependencies += " ";\r
+               dependencies += GetImportLibraryDependency ( *libraries[i]->imported_module );\r
+       }\r
+       return dependencies;\r
+}\r
+\r
+string\r
+MingwModuleHandler::GenerateLinkerParameters () const\r
 {\r
        return GenerateLinkerParametersFromVector ( module.linkerFlags );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,\r
-                                    const string& macro,\r
-                                    const vector<Include*>& includes,\r
-                                    const vector<Define*>& defines ) const\r
+MingwModuleHandler::GenerateMacro (\r
+       const char* assignmentOperation,\r
+       const string& macro,\r
+       const IfableData& data,\r
+       const vector<CompilerFlag*>* compilerFlags )\r
 {\r
        size_t i;\r
 \r
@@ -380,16 +529,29 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
                "%s %s",\r
                macro.c_str(),\r
                assignmentOperation );\r
-       for ( i = 0; i < includes.size(); i++ )\r
+       \r
+       if ( compilerFlags != NULL )\r
+       {\r
+               string compilerParameters = GenerateCompilerParametersFromVector ( *compilerFlags );\r
+               if ( compilerParameters.size () > 0 )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               " %s",\r
+                               compilerParameters.c_str () );\r
+               }\r
+       }\r
+\r
+       for ( i = 0; i < data.includes.size(); i++ )\r
        {\r
                fprintf (\r
                        fMakefile,\r
                        " -I%s",\r
-                       includes[i]->directory.c_str() );\r
+                       data.includes[i]->directory.c_str() );\r
        }\r
-       for ( i = 0; i < defines.size(); i++ )\r
+       for ( i = 0; i < data.defines.size(); i++ )\r
        {\r
-               Define& d = *defines[i];\r
+               Define& d = *data.defines[i];\r
                fprintf (\r
                        fMakefile,\r
                        " -D%s",\r
@@ -406,29 +568,22 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
 void\r
 MingwModuleHandler::GenerateMacros (\r
        const char* assignmentOperation,\r
-       const vector<File*>& files,\r
-       const vector<Include*>& includes,\r
-       const vector<Define*>& defines,\r
-       const vector<LinkerFlag*>* linkerFlags,\r
-       const vector<If*>& ifs,\r
-       const string& cflags_macro,\r
-       const string& nasmflags_macro,\r
-       const string& windresflags_macro,\r
-       const string& linkerflags_macro,\r
-       const string& objs_macro) const\r
+       const IfableData& data,\r
+       const vector<CompilerFlag*>* compilerFlags,\r
+       const vector<LinkerFlag*>* linkerFlags )\r
 {\r
        size_t i;\r
 \r
-       if ( includes.size() || defines.size() )\r
+       if ( data.includes.size () > 0 || data.defines.size () > 0 )\r
        {\r
                GenerateMacro ( assignmentOperation,\r
-                               cflags_macro,\r
-                               includes,\r
-                               defines );\r
+                               cflagsMacro,\r
+                               data,\r
+                               compilerFlags );\r
                GenerateMacro ( assignmentOperation,\r
-                               windresflags_macro,\r
-                               includes,\r
-                               defines );\r
+                               windresflagsMacro,\r
+                               data,\r
+                               compilerFlags );\r
        }\r
        \r
        if ( linkerFlags != NULL )\r
@@ -439,56 +594,119 @@ MingwModuleHandler::GenerateMacros (
                        fprintf (\r
                                fMakefile,\r
                                "%s %s %s\n",\r
-                               linkerflags_macro.c_str (),\r
+                               linkerflagsMacro.c_str (),\r
                                assignmentOperation,\r
                                linkerParameters.c_str() );\r
                }\r
        }\r
-       \r
-       if ( files.size() )\r
+\r
+       if ( data.libraries.size () > 0 )\r
+       {\r
+               string deps = GenerateImportLibraryDependenciesFromVector ( data.libraries );\r
+               if ( deps.size () > 0 )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "%s %s %s\n",\r
+                               libsMacro.c_str(),\r
+                               assignmentOperation,\r
+                               deps.c_str() );\r
+               }\r
+       }\r
+\r
+       const vector<If*>& ifs = data.ifs;\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+       {\r
+               If& rIf = *ifs[i];\r
+               if ( rIf.data.defines.size()\r
+                       || rIf.data.includes.size()\r
+                       || rIf.data.libraries.size()\r
+                       || rIf.data.files.size()\r
+                       || rIf.data.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.data,\r
+                               NULL,\r
+                               NULL );\r
+                       fprintf ( \r
+                               fMakefile,\r
+                               "endif\n\n" );\r
+               }\r
+       }\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateObjectMacros (\r
+       const char* assignmentOperation,\r
+       const IfableData& data,\r
+       const vector<CompilerFlag*>* compilerFlags,\r
+       const vector<LinkerFlag*>* linkerFlags )\r
+{\r
+       size_t i;\r
+\r
+       const vector<File*>& files = data.files;\r
+       if ( files.size () > 0 )\r
        {\r
+               for ( i = 0; i < files.size (); i++ )\r
+               {\r
+                       File& file = *files[i];\r
+                       if ( file.first )\r
+                       {\r
+                               fprintf ( fMakefile,\r
+                                       "%s := %s $(%s)\n",\r
+                                       objectsMacro.c_str(),\r
+                                       GetObjectFilename (\r
+                                               file.name, NULL ).c_str (),\r
+                                       objectsMacro.c_str() );\r
+                       }\r
+               }\r
                fprintf (\r
                        fMakefile,\r
                        "%s %s",\r
-                       objs_macro.c_str(),\r
+                       objectsMacro.c_str (),\r
                        assignmentOperation );\r
                for ( i = 0; i < files.size(); i++ )\r
                {\r
-                       string extension = GetExtension ( files[i]->name );\r
-                       if ( extension != ".spec" && extension != ".SPEC" )\r
+                       File& file = *files[i];\r
+                       if ( !file.first )\r
                        {\r
                                fprintf (\r
                                        fMakefile,\r
                                        "%s%s",\r
-                                       ( i%10 == 9 ? "\\\n\t" : " " ),\r
-                                       GetObjectFilename(files[i]->name).c_str() );\r
+                                       ( i%10 == 9 ? " \\\n\t" : " " ),\r
+                                       GetObjectFilename (\r
+                                               file.name, NULL ).c_str () );\r
                        }\r
                }\r
                fprintf ( fMakefile, "\n" );\r
        }\r
 \r
+       const vector<If*>& ifs = data.ifs;\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
+               if ( rIf.data.defines.size()\r
+                       || rIf.data.includes.size()\r
+                       || rIf.data.libraries.size()\r
+                       || rIf.data.files.size()\r
+                       || rIf.data.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
+                       GenerateObjectMacros (\r
                                "+=",\r
-                               rIf.files,\r
-                               rIf.includes,\r
-                               rIf.defines,\r
+                               rIf.data,\r
                                NULL,\r
-                               rIf.ifs,\r
-                               cflags_macro,\r
-                               nasmflags_macro,\r
-                               windresflags_macro,\r
-                               linkerflags_macro,\r
-                               objs_macro );\r
+                               NULL );\r
                        fprintf ( \r
                                fMakefile,\r
                                "endif\n\n" );\r
@@ -497,189 +715,193 @@ MingwModuleHandler::GenerateMacros (
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateMacros (\r
-       const Module& module,\r
-       const string& cflags_macro,\r
-       const string& nasmflags_macro,\r
-       const string& windresflags_macro,\r
-       const string& linkerflags_macro,\r
-       const string& objs_macro) const\r
-{\r
-       GenerateMacros (\r
-               "=",\r
-               module.files,\r
-               module.includes,\r
-               module.defines,\r
-               &module.linkerFlags,\r
-               module.ifs,\r
-               cflags_macro,\r
-               nasmflags_macro,\r
-               windresflags_macro,\r
-               linkerflags_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
-       fprintf (\r
-               fMakefile,\r
-               "%s += $(PROJECT_RCFLAGS)\n\n",\r
-               windresflags_macro.c_str () );\r
-\r
-       fprintf (\r
-               fMakefile,\r
-               "%s_LFLAGS += $(PROJECT_LFLAGS)\n\n",\r
-               module.name.c_str () );\r
-}\r
-\r
-void\r
-MingwModuleHandler::GenerateGccCommand ( const Module& module,\r
-                                         const string& sourceFilename,\r
-                                         const string& cc,\r
-                                         const string& cflagsMacro ) const\r
+MingwModuleHandler::GenerateGccCommand (\r
+       const string& sourceFilename,\r
+       const string& cc,\r
+       const string& cflagsMacro )\r
 {\r
-       string objectFilename = GetObjectFilename ( sourceFilename );\r
+       string deps = sourceFilename;\r
+       if ( module.pch && use_pch )\r
+               deps += " " + module.pch->header + ".gch";\r
+       string objectFilename = GetObjectFilename (\r
+               sourceFilename, NULL );\r
        fprintf ( fMakefile,\r
-                 "%s: %s\n",\r
+                 "%s: %s %s\n",\r
                  objectFilename.c_str (),\r
-                 sourceFilename.c_str () );\r
+                 deps.c_str (),\r
+                 GetDirectory ( objectFilename ).c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_CC)\n" );\r
        fprintf ( fMakefile,\r
-                "\t%s -c %s -o %s %s\n",\r
+                "\t%s -c $< -o $@ %s\n",\r
                 cc.c_str (),\r
-                sourceFilename.c_str (),\r
-                objectFilename.c_str (),\r
                 cflagsMacro.c_str () );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateGccAssemblerCommand ( const Module& module,\r
-                                                  const string& sourceFilename,\r
-                                                  const string& cc,\r
-                                                  const string& cflagsMacro ) const\r
+MingwModuleHandler::GenerateGccAssemblerCommand (\r
+       const string& sourceFilename,\r
+       const string& cc,\r
+       const string& cflagsMacro )\r
 {\r
-       string objectFilename = GetObjectFilename ( sourceFilename );\r
+       string objectFilename = GetObjectFilename (\r
+               sourceFilename, &clean_files );\r
        fprintf ( fMakefile,\r
-                 "%s: %s\n",\r
+                 "%s: %s %s\n",\r
                  objectFilename.c_str (),\r
-                 sourceFilename.c_str () );\r
+                 sourceFilename.c_str (),\r
+                 GetDirectory ( objectFilename ).c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_GAS)\n" );\r
        fprintf ( fMakefile,\r
-                 "\t%s -x assembler-with-cpp -c %s -o %s -D__ASM__ %s\n",\r
+                 "\t%s -x assembler-with-cpp -c $< -o $@ -D__ASM__ %s\n",\r
                  cc.c_str (),\r
-                 sourceFilename.c_str (),\r
-                 objectFilename.c_str (),\r
                  cflagsMacro.c_str () );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateNasmCommand ( const Module& module,\r
-                                          const string& sourceFilename,\r
-                                          const string& nasmflagsMacro ) const\r
+MingwModuleHandler::GenerateNasmCommand (\r
+       const string& sourceFilename,\r
+       const string& nasmflagsMacro )\r
 {\r
-       string objectFilename = GetObjectFilename ( sourceFilename );\r
+       string objectFilename = GetObjectFilename (\r
+               sourceFilename, &clean_files );\r
        fprintf ( fMakefile,\r
-                 "%s: %s\n",\r
+                 "%s: %s %s\n",\r
                  objectFilename.c_str (),\r
-                 sourceFilename.c_str () );\r
-       fprintf ( fMakefile,\r
-                 "\t%s -f win32 %s -o %s %s\n",\r
-                 "nasm",\r
                  sourceFilename.c_str (),\r
-                 objectFilename.c_str (),\r
+                 GetDirectory ( objectFilename ).c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_NASM)\n" );\r
+       fprintf ( fMakefile,\r
+                 "\t%s -f win32 $< -o $@ %s\n",\r
+                 "$(Q)nasm",\r
                  nasmflagsMacro.c_str () );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateWindresCommand ( const Module& module,\r
-                                             const string& sourceFilename,\r
-                                             const string& windresflagsMacro ) const\r
-{\r
-       string objectFilename = GetObjectFilename ( sourceFilename );\r
+MingwModuleHandler::GenerateWindresCommand (\r
+       const string& sourceFilename,\r
+       const string& windresflagsMacro )\r
+{\r
+       string objectFilename =\r
+               GetObjectFilename ( sourceFilename, &clean_files );\r
+       string rciFilename = ros_temp +\r
+               ReplaceExtension ( sourceFilename, ".rci" );\r
+       string resFilename = ros_temp +\r
+               ReplaceExtension ( sourceFilename, ".res" );\r
        fprintf ( fMakefile,\r
-                 "%s: %s\n",\r
+                 "%s: %s %s $(WRC_TARGET)\n",\r
                  objectFilename.c_str (),\r
-                 sourceFilename.c_str () );\r
+                 sourceFilename.c_str (),\r
+                 GetDirectory ( objectFilename ).c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_WRC)\n" );\r
        fprintf ( fMakefile,\r
-                "\t%s %s -o %s ${%s}\n",\r
-                "${windres}",\r
+                "\t${gcc} -xc -E -DRC_INVOKED ${%s} %s > %s\n",\r
+                windresflagsMacro.c_str (),\r
                 sourceFilename.c_str (),\r
-                objectFilename.c_str (),\r
-                windresflagsMacro.c_str () );\r
+                rciFilename.c_str () );\r
+       fprintf ( fMakefile,\r
+                "\t$(Q)$(WRC_TARGET) ${%s} %s %s\n",\r
+                windresflagsMacro.c_str (),\r
+                rciFilename.c_str (),\r
+                resFilename.c_str () );\r
+       fprintf ( fMakefile,\r
+                "\t-@${rm} %s 2>$(NUL)\n",\r
+                rciFilename.c_str () );\r
+       fprintf ( fMakefile,\r
+                "\t${windres} %s -o $@\n",\r
+                resFilename.c_str () );\r
+       fprintf ( fMakefile,\r
+                "\t-@${rm} %s 2>$(NUL)\n",\r
+                resFilename.c_str () );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateWinebuildCommands ( const Module& module,\r
-                                                const string& sourceFilename ) const\r
+MingwModuleHandler::GenerateWinebuildCommands (\r
+       const string& sourceFilename )\r
 {\r
        string basename = GetBasename ( sourceFilename );\r
+\r
+       string def_file = PassThruCacheDirectory (\r
+               basename + ".spec.def",\r
+               false );\r
+       CLEAN_FILE(def_file);\r
+\r
+       string stub_file = PassThruCacheDirectory (\r
+               basename + ".stubs.c",\r
+               false );\r
+       CLEAN_FILE(stub_file)\r
+\r
        fprintf ( fMakefile,\r
-                 "%s.def: %s\n",\r
-                 basename.c_str (),\r
+                 "%s: %s $(WINEBUILD_TARGET)\n",\r
+                 def_file.c_str (),\r
                  sourceFilename.c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );\r
        fprintf ( fMakefile,\r
-                 "\t%s --def=%s -o %s.def\n",\r
-                 "${winebuild}",\r
+                 "\t%s --def=%s -o %s\n",\r
+                 "$(Q)$(WINEBUILD_TARGET)",\r
                  sourceFilename.c_str (),\r
-                 basename.c_str () );\r
+                 def_file.c_str () );\r
 \r
        fprintf ( fMakefile,\r
-                 "%s.stubs.c: %s\n",\r
-                 basename.c_str (),\r
+                 "%s: %s\n",\r
+                 stub_file.c_str (),\r
                  sourceFilename.c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_WINEBLD)\n" );\r
        fprintf ( fMakefile,\r
-                 "\t%s --pedll=%s -o %s.stubs.c\n",\r
-                 "${winebuild}",\r
+                 "\t%s --pedll=%s -o %s\n",\r
+                 "$(Q)$(WINEBUILD_TARGET)",\r
                  sourceFilename.c_str (),\r
-                 basename.c_str () );\r
+                 stub_file.c_str () );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateCommands ( const Module& module,\r
-                                       const string& sourceFilename,\r
-                                       const string& cc,\r
-                                       const string& cflagsMacro,\r
-                                       const string& nasmflagsMacro,\r
-                                       const string& windresflagsMacro ) const\r
+MingwModuleHandler::GenerateCommands (\r
+       const string& sourceFilename,\r
+       const string& cc,\r
+       const string& cppc,\r
+       const string& cflagsMacro,\r
+       const string& nasmflagsMacro,\r
+       const string& windresflagsMacro )\r
 {\r
        string extension = GetExtension ( sourceFilename );\r
        if ( extension == ".c" || extension == ".C" )\r
        {\r
-               GenerateGccCommand ( module,\r
-                                    sourceFilename,\r
+               GenerateGccCommand ( sourceFilename,\r
                                     cc,\r
                                     cflagsMacro );\r
                return;\r
        }\r
+       else if ( extension == ".cc" || extension == ".CC" ||\r
+                 extension == ".cpp" || extension == ".CPP" ||\r
+                 extension == ".cxx" || extension == ".CXX" )\r
+       {\r
+               GenerateGccCommand ( sourceFilename,\r
+                                    cppc,\r
+                                    cflagsMacro );\r
+               return;\r
+       }\r
        else if ( extension == ".s" || extension == ".S" )\r
        {\r
-               GenerateGccAssemblerCommand ( module,\r
-                                             sourceFilename,\r
+               GenerateGccAssemblerCommand ( sourceFilename,\r
                                              cc,\r
                                              cflagsMacro );\r
                return;\r
        }\r
        else if ( extension == ".asm" || extension == ".ASM" )\r
        {\r
-               GenerateNasmCommand ( module,\r
-                                     sourceFilename,\r
+               GenerateNasmCommand ( sourceFilename,\r
                                      nasmflagsMacro );\r
                return;\r
        }\r
        else if ( extension == ".rc" || extension == ".RC" )\r
        {\r
-               GenerateWindresCommand ( module,\r
-                                        sourceFilename,\r
+               GenerateWindresCommand ( sourceFilename,\r
                                         windresflagsMacro );\r
                return;\r
        }\r
        else if ( extension == ".spec" || extension == ".SPEC" )\r
        {\r
-               GenerateWinebuildCommands ( module,\r
-                                           sourceFilename );\r
-               GenerateGccCommand ( module,\r
-                                    GetActualSourceFilename ( sourceFilename ),\r
+               GenerateWinebuildCommands ( sourceFilename );\r
+               GenerateGccCommand ( GetActualSourceFilename ( sourceFilename ),\r
                                     cc,\r
                                     cflagsMacro );\r
                return;\r
@@ -693,20 +915,32 @@ MingwModuleHandler::GenerateCommands ( const Module& module,
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateLinkerCommand ( const Module& module,\r
-                                            const string& linker,\r
-                                            const string& linkerParameters,\r
-                                            const string& objectFilenames ) const\r
+MingwModuleHandler::GenerateLinkerCommand (\r
+       const string& dependencies,\r
+       const string& linker,\r
+       const string& linkerParameters,\r
+       const string& objectsMacro,\r
+       const string& libsMacro )\r
 {\r
+       string target ( GetTargetMacro ( module ) );\r
+       string target_folder ( GetDirectory ( GetTargetFilename ( module, NULL ) ) );\r
+\r
+       fprintf ( fMakefile,\r
+               "%s: %s %s $(RSYM_TARGET)\n",\r
+               target.c_str (),\r
+               dependencies.c_str (),\r
+               target_folder.c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_LD)\n" );\r
        string targetName ( module.GetTargetName () );\r
-       string target ( FixupTargetFilename ( module.GetPath () ) );\r
-       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
        if ( module.importLibrary != NULL )\r
        {\r
-               static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-               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 base_tmp = ros_temp + module.name + ".base.tmp";\r
+               CLEAN_FILE ( base_tmp );\r
+               string junk_tmp = ros_temp + module.name + ".junk.tmp";\r
+               CLEAN_FILE ( junk_tmp );\r
+               string temp_exp = ros_temp + module.name + ".temp.exp";\r
+               CLEAN_FILE ( temp_exp );\r
+               string def_file = module.GetBasePath () + SSEP + module.importLibrary->definition;\r
 \r
                fprintf ( fMakefile,\r
                          "\t%s %s -Wl,--base-file,%s -o %s %s %s %s\n",\r
@@ -714,69 +948,87 @@ MingwModuleHandler::GenerateLinkerCommand ( const Module& module,
                          linkerParameters.c_str (),\r
                          base_tmp.c_str (),\r
                          junk_tmp.c_str (),\r
-                         objectFilenames.c_str (),\r
-                         importLibraryDependencies.c_str (),\r
-                         GetLinkerMacro ( module ).c_str () );\r
+                         objectsMacro.c_str (),\r
+                         libsMacro.c_str (),\r
+                         GetLinkerMacro ().c_str () );\r
 \r
                fprintf ( fMakefile,\r
-                         "\t${rm} %s\n",\r
+                         "\t-@${rm} %s 2>$(NUL)\n",\r
                          junk_tmp.c_str () );\r
 \r
+               string killAt = module.mangledSymbols ? "" : "--kill-at";\r
                fprintf ( fMakefile,\r
-                         "\t${dlltool} --dllname %s --base-file %s --def %s --output-exp %s --kill-at\n",\r
+                         "\t${dlltool} --dllname %s --base-file %s --def %s --output-exp %s %s\n",\r
                          targetName.c_str (),\r
                          base_tmp.c_str (),\r
-                         ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
-                         temp_exp.c_str () );\r
+                         def_file.c_str (),\r
+                         temp_exp.c_str (),\r
+                         killAt.c_str () );\r
 \r
                fprintf ( fMakefile,\r
-                         "\t${rm} %s\n",\r
+                         "\t-@${rm} %s 2>$(NUL)\n",\r
                          base_tmp.c_str () );\r
 \r
                fprintf ( fMakefile,\r
-                         "\t%s %s %s -o %s %s %s %s\n\n",\r
+                         "\t%s %s %s -o %s %s %s %s\n",\r
                          linker.c_str (),\r
                          linkerParameters.c_str (),\r
                          temp_exp.c_str (),\r
                          target.c_str (),\r
-                         objectFilenames.c_str (),\r
-                         importLibraryDependencies.c_str (),\r
-                         GetLinkerMacro ( module ).c_str () );\r
+                         objectsMacro.c_str (),\r
+                         libsMacro.c_str (),\r
+                         GetLinkerMacro ().c_str () );\r
 \r
                fprintf ( fMakefile,\r
-                         "\t${rm} %s\n\n",\r
+                         "\t-@${rm} %s 2>$(NUL)\n",\r
                          temp_exp.c_str () );\r
        }\r
        else\r
        {\r
                fprintf ( fMakefile,\r
-                         "\t%s %s -o %s %s %s %s\n\n",\r
+                         "\t%s %s -o %s %s %s %s\n",\r
                          linker.c_str (),\r
                          linkerParameters.c_str (),\r
                          target.c_str (),\r
-                         objectFilenames.c_str (),\r
-                         importLibraryDependencies.c_str (),\r
-                         GetLinkerMacro ( module ).c_str () );\r
+                         objectsMacro.c_str (),\r
+                         libsMacro.c_str (),\r
+                         GetLinkerMacro ().c_str () );\r
        }\r
+\r
+       fprintf ( fMakefile, "\t$(ECHO_RSYM)\n" );\r
+       fprintf ( fMakefile,\r
+                 "\t$(Q)$(RSYM_TARGET) $@ $@\n\n" );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GeneratePhonyTarget() const\r
+{\r
+       string targetMacro ( GetTargetMacro(module) );\r
+       fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+                 targetMacro.c_str ());\r
+       fprintf ( fMakefile, "%s: %s\n",\r
+                 targetMacro.c_str (),\r
+                 GetDirectory(GetTargetFilename(module,NULL)).c_str () );\r
 }\r
 \r
 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,\r
-                                                const string& windresflagsMacro ) const\r
+MingwModuleHandler::GenerateObjectFileTargets (\r
+       const IfableData& data,\r
+       const string& cc,\r
+       const string& cppc,\r
+       const string& cflagsMacro,\r
+       const string& nasmflagsMacro,\r
+       const string& windresflagsMacro )\r
 {\r
        size_t i;\r
 \r
+       const vector<File*>& files = data.files;\r
        for ( i = 0; i < files.size (); i++ )\r
        {\r
                string sourceFilename = files[i]->name;\r
-               GenerateCommands ( module,\r
-                                  sourceFilename,\r
+               GenerateCommands ( sourceFilename,\r
                                   cc,\r
+                                  cppc,\r
                                   cflagsMacro,\r
                                   nasmflagsMacro,\r
                                   windresflagsMacro );\r
@@ -784,12 +1036,12 @@ MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,
                          "\n" );\r
        }\r
 \r
+       const vector<If*>& ifs = data.ifs;\r
        for ( i = 0; i < ifs.size(); i++ )\r
        {\r
-               GenerateObjectFileTargets ( module,\r
-                                           ifs[i]->files,\r
-                                           ifs[i]->ifs,\r
+               GenerateObjectFileTargets ( ifs[i]->data,\r
                                            cc,\r
+                                           cppc,\r
                                            cflagsMacro,\r
                                            nasmflagsMacro,\r
                                            windresflagsMacro );\r
@@ -797,218 +1049,277 @@ MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,\r
-                                                const string& cc,\r
-                                                const string& cflagsMacro,\r
-                                                const string& nasmflagsMacro,\r
-                                                const string& windresflagsMacro ) const\r
+MingwModuleHandler::GenerateObjectFileTargets (\r
+       const string& cc,\r
+       const string& cppc,\r
+       const string& cflagsMacro,\r
+       const string& nasmflagsMacro,\r
+       const string& windresflagsMacro )\r
 {\r
-       GenerateObjectFileTargets ( module,\r
-                                   module.files,\r
-                                   module.ifs,\r
+       if ( module.pch )\r
+       {\r
+               const string& pch_file = module.pch->header;\r
+               string gch_file = pch_file + ".gch";\r
+               CLEAN_FILE(gch_file);\r
+               if ( use_pch )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "%s: %s\n",\r
+                               gch_file.c_str(),\r
+                               pch_file.c_str() );\r
+                       fprintf ( fMakefile, "\t$(ECHO_PCH)\n" );\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "\t%s -o %s %s -g %s\n\n",\r
+                               ( module.cplusplus ? cppc.c_str() : cc.c_str() ),\r
+                               gch_file.c_str(),\r
+                               cflagsMacro.c_str(),\r
+                               pch_file.c_str() );\r
+               }\r
+       }\r
+\r
+       GenerateObjectFileTargets ( module.non_if_data,\r
                                    cc,\r
+                                   cppc,\r
                                    cflagsMacro,\r
                                    nasmflagsMacro,\r
                                    windresflagsMacro );\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
+MingwModuleHandler::GenerateArchiveTarget ( const string& ar,\r
                                             const string& objs_macro ) const\r
 {\r
-       string archiveFilename = GetModuleArchiveFilename ( module );\r
+       string archiveFilename ( GetModuleArchiveFilename () );\r
        \r
        fprintf ( fMakefile,\r
-                 "%s: %s\n",\r
+                 "%s: %s %s\n",\r
                  archiveFilename.c_str (),\r
-                 objs_macro.c_str ());\r
+                 objs_macro.c_str (),\r
+                 GetDirectory(archiveFilename).c_str() );\r
+\r
+       fprintf ( fMakefile, "\t$(ECHO_AR)\n" );\r
 \r
        fprintf ( fMakefile,\r
-                 "\t%s -rc %s %s\n\n",\r
+                 "\t%s -rc $@ %s\n\n",\r
                  ar.c_str (),\r
-                 archiveFilename.c_str (),\r
                  objs_macro.c_str ());\r
 \r
        return archiveFilename;\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetCFlagsMacro ( const Module& module ) const\r
+MingwModuleHandler::GetCFlagsMacro () const\r
 {\r
        return ssprintf ( "$(%s_CFLAGS)",\r
                          module.name.c_str () );\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetObjectsMacro ( const Module& module ) const\r
+/*static*/ string\r
+MingwModuleHandler::GetObjectsMacro ( const Module& module )\r
 {\r
        return ssprintf ( "$(%s_OBJS)",\r
                          module.name.c_str () );\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetLinkerMacro ( const Module& module ) const\r
+MingwModuleHandler::GetLinkingDependenciesMacro () const\r
+{\r
+       return ssprintf ( "$(%s_LINKDEPS)", module.name.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetLibsMacro () const\r
+{\r
+       return ssprintf ( "$(%s_LIBS)", module.name.c_str () );\r
+}\r
+\r
+string\r
+MingwModuleHandler::GetLinkerMacro () const\r
 {\r
        return ssprintf ( "$(%s_LFLAGS)",\r
                          module.name.c_str () );\r
 }\r
-                                           \r
+\r
+string\r
+MingwModuleHandler::GetModuleTargets ( const Module& module )\r
+{\r
+       if ( module.type == ObjectLibrary )\r
+               return GetObjectsMacro ( module );\r
+       else\r
+               return GetTargetFilename ( module, NULL );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateObjectMacro ()\r
+{\r
+       objectsMacro = ssprintf ("%s_OBJS", module.name.c_str ());\r
+\r
+       GenerateObjectMacros (\r
+               "=",\r
+               module.non_if_data,\r
+               &module.compilerFlags,\r
+               &module.linkerFlags );\r
+\r
+       // future references to the macro will be to get its values\r
+       objectsMacro = ssprintf ("$(%s)", objectsMacro.c_str ());\r
+}\r
+\r
 void\r
-MingwModuleHandler::GenerateMacrosAndTargets (\r
-       const Module& module,\r
-       const string& cc,\r
-       const string& ar,\r
-       const string* cflags ) const\r
+MingwModuleHandler::GenerateTargetMacro ()\r
+{\r
+       fprintf ( fMakefile,\r
+               "%s := %s\n",\r
+               GetTargetMacro ( module, false ).c_str (),\r
+               GetModuleTargets ( module ).c_str () );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GenerateOtherMacros ()\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
-       string linkerFlagsMacro = ssprintf ("%s_LFLAGS", module.name.c_str ());\r
-       string objectsMacro = ssprintf ("%s_OBJS", module.name.c_str ());\r
+       cflagsMacro = ssprintf ("%s_CFLAGS", module.name.c_str ());\r
+       nasmflagsMacro = ssprintf ("%s_NASMFLAGS", module.name.c_str ());\r
+       windresflagsMacro = ssprintf ("%s_RCFLAGS", module.name.c_str ());\r
+       linkerflagsMacro = ssprintf ("%s_LFLAGS", module.name.c_str ());\r
+       libsMacro = ssprintf("%s_LIBS", module.name.c_str ());\r
+       linkDepsMacro = ssprintf ("%s_LINKDEPS", module.name.c_str ());\r
+\r
+       GenerateMacros (\r
+               "=",\r
+               module.non_if_data,\r
+               &module.compilerFlags,\r
+               &module.linkerFlags );\r
+\r
+       if ( module.importLibrary )\r
+       {\r
+               string_list s;\r
+               const vector<File*>& files = module.non_if_data.files;\r
+               for ( size_t i = 0; i < files.size (); i++ )\r
+               {\r
+                       File& file = *files[i];\r
+                       string extension = GetExtension ( file.name );\r
+                       if ( extension == ".spec" || extension == ".SPEC" )\r
+                               GetSpecObjectDependencies ( s, file.name );\r
+               }\r
+               if ( s.size () > 0 )\r
+               {\r
+                       fprintf (\r
+                               fMakefile,\r
+                               "%s +=",\r
+                               linkDepsMacro.c_str() );\r
+                       for ( size_t i = 0; i < s.size(); i++ )\r
+                               fprintf ( fMakefile,\r
+                                         " %s",\r
+                                         s[i].c_str () );\r
+                       fprintf ( fMakefile, "\n" );\r
+               }\r
+       }\r
+\r
+       fprintf (\r
+               fMakefile,\r
+               "%s += $(PROJECT_CFLAGS)\n",\r
+               cflagsMacro.c_str () );\r
+\r
+       fprintf (\r
+               fMakefile,\r
+               "%s += $(PROJECT_RCFLAGS)\n",\r
+               windresflagsMacro.c_str () );\r
 \r
-       GenerateMacros ( module,\r
-                       cflagsMacro,\r
-                       nasmflagsMacro,\r
-                       windresflagsMacro,\r
-                       linkerFlagsMacro,\r
-                       objectsMacro );\r
+       fprintf (\r
+               fMakefile,\r
+               "%s_LFLAGS += $(PROJECT_LFLAGS)\n",\r
+               module.name.c_str () );\r
+\r
+       fprintf (\r
+               fMakefile,\r
+               "%s += $(%s)\n",\r
+               linkDepsMacro.c_str (),\r
+               libsMacro.c_str () );\r
 \r
-       if ( cflags != NULL )\r
+       string cflags = TypeSpecificCFlags();\r
+       if ( cflags.size() > 0 )\r
        {\r
                fprintf ( fMakefile,\r
                          "%s += %s\n\n",\r
                          cflagsMacro.c_str (),\r
-                         cflags->c_str () );\r
+                         cflags.c_str () );\r
        }\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
+       string nasmflags = TypeSpecificNasmFlags();\r
+       if ( nasmflags.size () > 0 )\r
+       {\r
+               fprintf ( fMakefile,\r
+                         "%s += %s\n\n",\r
+                         nasmflagsMacro.c_str (),\r
+                         nasmflags.c_str () );\r
+       }\r
+\r
+       fprintf ( fMakefile, "\n\n" );\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
 \r
-       string ar_target = GenerateArchiveTarget ( module, ar, objectsMacro );\r
-       GenerateObjectFileTargets ( module,\r
-                                   cc,\r
-                                   cflagsMacro,\r
-                                   nasmflagsMacro,\r
-                                   windresflagsMacro );\r
+void\r
+MingwModuleHandler::GenerateRules ()\r
+{\r
+       string cc = ( module.host == HostTrue ? "${host_gcc}" : "${gcc}" );\r
+       string cppc = ( module.host == HostTrue ? "${host_gpp}" : "${gpp}" );\r
+       string ar = ( module.host == HostTrue ? "${host_ar}" : "${ar}" );\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
+       string targetMacro = GetTargetMacro ( module );\r
 \r
-       fprintf ( fMakefile, "clean::\n\t-@$(rm)" );\r
-       for ( size_t i = 0; i < clean_files.size(); i++ )\r
+       CLEAN_FILE ( targetMacro );\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
+               GetTargetMacro ( module ).c_str () );\r
+\r
+       if ( module.type != ObjectLibrary )\r
        {\r
-               if ( 9==(i%10) )\r
-                       fprintf ( fMakefile, " 2>$(NUL)\n\t-@$(rm)" );\r
-               fprintf ( fMakefile, " %s", clean_files[i].c_str() );\r
+               string ar_target ( GenerateArchiveTarget ( ar, objectsMacro ) );\r
+               if ( targetMacro != ar_target )\r
+               {\r
+                       CLEAN_FILE ( ar_target );\r
+               }\r
        }\r
-       fprintf ( fMakefile, " 2>$(NUL)\n\n" );\r
-}\r
 \r
-void\r
-MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module& module ) const\r
-{\r
-       GenerateMacrosAndTargets ( module, "${host_gcc}", "${host_ar}", NULL );\r
-}\r
-\r
-void\r
-MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module ) const\r
-{\r
-       GenerateMacrosAndTargetsTarget ( module,\r
-                                        NULL );\r
+       GenerateObjectFileTargets ( cc,\r
+                                                               cppc,\r
+                                                               cflagsMacro,\r
+                                                               nasmflagsMacro,\r
+                                                               windresflagsMacro );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module& module,\r
-                                                        const string* clags ) const\r
-{\r
-       GenerateMacrosAndTargets ( module, "${gcc}", "${ar}", clags );\r
-}\r
-\r
-string\r
-MingwModuleHandler::GetInvocationDependencies ( const Module& module ) const\r
+MingwModuleHandler::GetInvocationDependencies (\r
+       const Module& module,\r
+       string_list& dependencies )\r
 {\r
-       string dependencies;\r
        for ( size_t i = 0; i < module.invocations.size (); i++ )\r
        {\r
                Invoke& invoke = *module.invocations[i];\r
-               if (invoke.invokeModule == &module)\r
+               if ( invoke.invokeModule == &module )\r
                        /* Protect against circular dependencies */\r
                        continue;\r
-               if ( dependencies.length () > 0 )\r
-                       dependencies += " ";\r
-               dependencies += invoke.GetTargets ();\r
-       }\r
-       return dependencies;\r
-}\r
-\r
-string\r
-MingwModuleHandler::GetInvocationParameters ( const Invoke& invoke ) const\r
-{\r
-       string parameters ( "" );\r
-       size_t i;\r
-       for (i = 0; i < invoke.output.size (); i++)\r
-       {\r
-               if (parameters.length () > 0)\r
-                       parameters += " ";\r
-               InvokeFile& invokeFile = *invoke.output[i];\r
-               if (invokeFile.switches.length () > 0)\r
-               {\r
-                       parameters += invokeFile.switches;\r
-                       parameters += " ";\r
-               }\r
-               parameters += invokeFile.name;\r
-       }\r
-\r
-       for (i = 0; i < invoke.input.size (); i++)\r
-       {\r
-               if (parameters.length () > 0)\r
-                       parameters += " ";\r
-               InvokeFile& invokeFile = *invoke.input[i];\r
-               if (invokeFile.switches.length () > 0)\r
-               {\r
-                       parameters += invokeFile.switches;\r
-                       parameters += " ";\r
-               }\r
-               parameters += invokeFile.name;\r
+               invoke.GetTargets ( dependencies );\r
        }\r
-\r
-       return parameters;\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateInvocations ( const Module& module ) const\r
+MingwModuleHandler::GenerateInvocations () const\r
 {\r
        if ( module.invocations.size () == 0 )\r
                return;\r
        \r
-       for ( size_t i = 0; i < module.invocations.size (); i++ )\r
+       size_t iend = module.invocations.size ();\r
+       for ( size_t i = 0; i < iend; i++ )\r
        {\r
                const Invoke& invoke = *module.invocations[i];\r
 \r
@@ -1019,525 +1330,991 @@ MingwModuleHandler::GenerateInvocations ( const Module& module ) const
                }\r
 \r
                string invokeTarget = module.GetInvocationTarget ( i );\r
+               string_list invoke_targets;\r
+               assert ( invoke_targets.size() );\r
+               invoke.GetTargets ( invoke_targets );\r
                fprintf ( fMakefile,\r
-                         "%s: %s\n\n",\r
-                         invoke.GetTargets ().c_str (),\r
+                         ".PHONY: %s\n\n",\r
                          invokeTarget.c_str () );\r
                fprintf ( fMakefile,\r
-                         "%s: %s\n",\r
-                         invokeTarget.c_str (),\r
+                         "%s:",\r
+                         invokeTarget.c_str () );\r
+               size_t j, jend = invoke_targets.size();\r
+               for ( j = 0; j < jend; j++ )\r
+               {\r
+                       fprintf ( fMakefile,\r
+                                 " %s",\r
+                                 invoke_targets[i].c_str () );\r
+               }\r
+               fprintf ( fMakefile, "\n\n%s", invoke_targets[0].c_str () );\r
+               for ( j = 1; j < jend; j++ )\r
+                       fprintf ( fMakefile,\r
+                                 " %s",\r
+                                 invoke_targets[i].c_str () );\r
+               fprintf ( fMakefile,\r
+                         ": %s\n",\r
                          FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str () );\r
+               fprintf ( fMakefile, "\t$(ECHO_INVOKE)\n" );\r
                fprintf ( fMakefile,\r
                          "\t%s %s\n\n",\r
                          FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str (),\r
-                         GetInvocationParameters ( invoke ).c_str () );\r
-               fprintf ( fMakefile,\r
-                         ".PNONY: %s\n\n",\r
-                         invokeTarget.c_str () );\r
+                         invoke.GetParameters ().c_str () );\r
        }\r
 }\r
 \r
 string\r
-MingwModuleHandler::GetPreconditionDependenciesName ( const Module& module ) const\r
+MingwModuleHandler::GetPreconditionDependenciesName () const\r
 {\r
-       return ssprintf ( "%s_precondition",\r
-                         module.name.c_str () );\r
+       return module.name + "_precondition";\r
 }\r
 \r
 void\r
-MingwModuleHandler::GeneratePreconditionDependencies ( const Module& module ) const\r
+MingwModuleHandler::GetDefaultDependencies (\r
+       string_list& dependencies ) const\r
 {\r
-       string preconditionDependenciesName = GetPreconditionDependenciesName ( module );\r
-       string sourceFilenames = GetSourceFilenames ( module );\r
-       string dependencies = GetModuleDependencies ( module );\r
-       string s = GetInvocationDependencies ( module );\r
-       if ( s.length () > 0 )\r
+       /* Avoid circular dependency */\r
+       if ( module.type != BuildTool\r
+               && module.name != "zlib"\r
+               && module.name != "hostzlib" )\r
+\r
+               dependencies.push_back ( "$(INIT)" );\r
+}\r
+\r
+void\r
+MingwModuleHandler::GeneratePreconditionDependencies ()\r
+{\r
+       string preconditionDependenciesName = GetPreconditionDependenciesName ();\r
+       string_list sourceFilenames;\r
+       GetSourceFilenamesWithoutGeneratedFiles ( sourceFilenames );\r
+       string_list dependencies;\r
+       GetDefaultDependencies ( dependencies );\r
+       GetModuleDependencies ( dependencies );\r
+\r
+       GetInvocationDependencies ( module, dependencies );\r
+       \r
+       if ( dependencies.size() )\r
        {\r
-               if ( dependencies.length () > 0 )\r
-                       dependencies += " ";\r
-               dependencies += s;\r
+               fprintf ( fMakefile,\r
+                         "%s =",\r
+                         preconditionDependenciesName.c_str () );\r
+               for ( size_t i = 0; i < dependencies.size(); i++ )\r
+                       fprintf ( fMakefile,\r
+                                 " %s",\r
+                                 dependencies[i].c_str () );\r
+               fprintf ( fMakefile, "\n\n" );\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
-       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
+\r
+       for ( size_t i = 0; i < sourceFilenames.size(); i++ )\r
+       {\r
                fprintf ( fMakefile,\r
-                         "%.*s: %s\n",\r
-                         p2-p,\r
-                         p,\r
+                         "%s: ${%s}\n",\r
+                         sourceFilenames[i].c_str(),\r
                          preconditionDependenciesName.c_str ());\r
-               p = p2;\r
-               p += strspn ( p, " \t" );\r
        }\r
        fprintf ( fMakefile, "\n" );\r
 }\r
 \r
 void\r
-MingwModuleHandler::GenerateImportLibraryTargetIfNeeded ( const Module& module ) const\r
+MingwModuleHandler::GenerateImportLibraryTargetIfNeeded ()\r
 {\r
        if ( module.importLibrary != NULL )\r
        {\r
-               string definitionDependencies = GetDefinitionDependencies ( module );\r
-               fprintf ( fMakefile, "%s: %s\n",\r
-                         FixupTargetFilename( module.GetDependencyPath () ).c_str (),\r
-                         definitionDependencies.c_str () );\r
+               string library_target (\r
+                       GetImportLibraryFilename ( module, &clean_files ) );\r
+\r
+               string_list deps;\r
+               GetDefinitionDependencies ( deps );\r
+\r
+               fprintf ( fMakefile, "# IMPORT LIBRARY RULE:\n" );\r
+\r
+               fprintf ( fMakefile, "%s:",\r
+                         library_target.c_str () );\r
+\r
+               size_t i, iend = deps.size();\r
+               for ( i = 0; i < iend; i++ )\r
+                       fprintf ( fMakefile, " %s",\r
+                                 deps[i].c_str () );\r
+\r
+               fprintf ( fMakefile, " %s\n",\r
+                         GetDirectory(GetTargetFilename(module,NULL)).c_str () );\r
 \r
+               fprintf ( fMakefile, "\t$(ECHO_DLLTOOL)\n" );\r
+\r
+               string killAt = module.mangledSymbols ? "" : "--kill-at";\r
                fprintf ( fMakefile,\r
-                         "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
+                         "\t${dlltool} --dllname %s --def %s --output-lib %s %s\n\n",\r
                          module.GetTargetName ().c_str (),\r
                          ( module.GetBasePath () + SSEP + module.importLibrary->definition ).c_str (),\r
-                         FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+                         library_target.c_str (),\r
+                         killAt.c_str () );\r
        }\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetSpecObjectDependencies ( const string& filename ) const\r
+void\r
+MingwModuleHandler::GetSpecObjectDependencies (\r
+       string_list& dependencies,\r
+       const string& filename ) const\r
 {\r
        string basename = GetBasename ( filename );\r
-       return basename + ".def" + " " + basename + ".stubs.c";\r
+       dependencies.push_back ( basename + ".spec.def" );\r
+       dependencies.push_back ( basename + ".stubs.c" );\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetDefinitionDependencies ( const Module& module ) const\r
-{\r
-       string dependencies;\r
-       for ( size_t i = 0; i < module.files.size (); i++ )\r
+void\r
+MingwModuleHandler::GetDefinitionDependencies (\r
+       string_list& dependencies ) const\r
+{\r
+       string dkNkmLibNoFixup = "dk/nkm/lib";\r
+       // TODO FIXME - verify this is the correct dependency...\r
+       // easiest way to tell is to remove it and see what breaks\r
+       /*dependencies += PassThruCacheDirectory (\r
+               FixupTargetFilename ( dkNkmLibNoFixup ),\r
+               false, NULL );*/\r
+       const vector<File*>& files = module.non_if_data.files;\r
+       for ( size_t i = 0; i < files.size (); i++ )\r
        {\r
-               File& file = *module.files[i];\r
+               File& file = *files[i];\r
                string extension = GetExtension ( file.name );\r
                if ( extension == ".spec" || extension == ".SPEC" )\r
                {\r
-                       if ( dependencies.length () > 0 )\r
-                               dependencies += " ";\r
-                       dependencies += GetSpecObjectDependencies ( file.name );\r
+                       GetSpecObjectDependencies ( dependencies, file.name );\r
                }\r
        }\r
-       return dependencies;\r
 }\r
 \r
-string\r
-MingwModuleHandler::GetLinkingDependencies ( const Module& module ) const\r
-{\r
-       string dependencies = GetImportLibraryDependencies ( module );\r
-       string s = GetDefinitionDependencies ( module );\r
-       if ( s.length () > 0 )\r
-       {\r
-               dependencies += " ";\r
-               dependencies += s;\r
-       }\r
-       return dependencies;\r
-}\r
-\r
-\r
-static MingwBuildToolModuleHandler buildtool_handler;\r
-\r
-MingwBuildToolModuleHandler::MingwBuildToolModuleHandler()\r
-       : MingwModuleHandler ( BuildTool )\r
+MingwBuildToolModuleHandler::MingwBuildToolModuleHandler ( const Module& module_ )\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwBuildToolModuleHandler::Process ( const Module& module )\r
+MingwBuildToolModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateBuildToolModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateBuildToolModuleTarget ();\r
 }\r
 \r
 void\r
-MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& module )\r
+MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ()\r
 {\r
-       string target ( FixupTargetFilename ( module.GetPath () ) );\r
-       string archiveFilename = GetModuleArchiveFilename ( module );\r
+       string targetMacro ( GetTargetMacro (module) );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
 \r
-       GenerateMacrosAndTargetsHost ( module );\r
+       GenerateRules ();\r
 \r
-       fprintf ( fMakefile, "%s: %s\n",\r
-                 target.c_str (),\r
-                 archiveFilename.c_str () );\r
+       string linker;\r
+       if ( module.cplusplus )\r
+               linker = "${host_gpp}";\r
+       else\r
+               linker = "${host_gcc}";\r
+       \r
+       fprintf ( fMakefile, "%s: %s %s %s\n",\r
+                 targetMacro.c_str (),\r
+                 objectsMacro.c_str (),\r
+                 linkDepsMacro.c_str (),\r
+                 GetDirectory(GetTargetFilename(module,NULL)).c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_LD)\n" );\r
        fprintf ( fMakefile,\r
-                 "\t${host_gcc} %s -o %s %s\n\n",\r
-                 GetLinkerMacro ( module ).c_str (),\r
-                 target.c_str (),\r
-                 archiveFilename.c_str () );\r
+                 "\t%s %s -o $@ %s %s\n\n",\r
+                 linker.c_str (),\r
+                 GetLinkerMacro ().c_str (),\r
+                 objectsMacro.c_str (),\r
+                 libsMacro.c_str () );\r
 }\r
 \r
-static MingwKernelModuleHandler kernelmodule_handler;\r
 \r
-MingwKernelModuleHandler::MingwKernelModuleHandler ()\r
-       : MingwModuleHandler ( Kernel )\r
+MingwKernelModuleHandler::MingwKernelModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwKernelModuleHandler::Process ( const Module& module )\r
+MingwKernelModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateKernelModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateKernelModuleTarget ();\r
 }\r
 \r
 void\r
-MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module& module )\r
+MingwKernelModuleHandler::GenerateKernelModuleTarget ()\r
 {\r
-       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-       string targetName ( module.GetTargetName () );\r
-       string target ( FixupTargetFilename (module.GetPath ()) );\r
+       string targetName ( module.GetTargetName () ); // i.e. "ntoskrnl.exe"\r
+       string targetMacro ( GetTargetMacro (module) ); // i.e. "$(NTOSKRNL_TARGET)"\r
        string workingDirectory = GetWorkingDirectory ();\r
        string objectsMacro = GetObjectsMacro ( module );\r
-       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
-       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
-       GenerateImportLibraryTargetIfNeeded ( module );\r
-\r
-       fprintf ( fMakefile, "%s: %s %s\n",\r
-                 target.c_str (),\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
+       string base_tmp = ros_temp + module.name + ".base.tmp";\r
+       CLEAN_FILE ( base_tmp );\r
+       string junk_tmp = ros_temp + module.name + ".junk.tmp";\r
+       CLEAN_FILE ( junk_tmp );\r
+       string temp_exp = ros_temp + module.name + ".temp.exp";\r
+       CLEAN_FILE ( temp_exp );\r
+       string gccOptions = ssprintf ("-Wl,-T,%s" SSEP "ntoskrnl.lnk -Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+                                     module.GetBasePath ().c_str (),\r
+                                     module.entrypoint.c_str (),\r
+                                     module.baseaddress.c_str () );\r
+\r
+       GenerateRules ();\r
+\r
+       GenerateImportLibraryTargetIfNeeded ();\r
+\r
+       fprintf ( fMakefile, "%s: %s %s %s $(RSYM_TARGET)\n",\r
+                 targetMacro.c_str (),\r
                  objectsMacro.c_str (),\r
-                 importLibraryDependencies.c_str () );\r
+                 linkDepsMacro.c_str (),\r
+                 GetDirectory(GetTargetFilename(module,NULL)).c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_LD)\n" );\r
        fprintf ( fMakefile,\r
                  "\t${gcc} %s %s -Wl,--base-file,%s -o %s %s %s\n",\r
-                 GetLinkerMacro ( module ).c_str (),\r
+                 GetLinkerMacro ().c_str (),\r
                  gccOptions.c_str (),\r
                  base_tmp.c_str (),\r
                  junk_tmp.c_str (),\r
                  objectsMacro.c_str (),\r
-                 importLibraryDependencies.c_str () );\r
+                 linkDepsMacro.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${rm} %s\n",\r
+                 "\t-@${rm} %s 2>$(NUL)\n",\r
                  junk_tmp.c_str () );\r
+       string killAt = module.mangledSymbols ? "" : "--kill-at";\r
        fprintf ( fMakefile,\r
-                 "\t${dlltool} --dllname %s --base-file %s --def ntoskrnl/ntoskrnl.def --output-exp %s --kill-at\n",\r
+                 "\t${dlltool} --dllname %s --base-file %s --def ntoskrnl/ntoskrnl.def --output-exp %s %s\n",\r
                  targetName.c_str (),\r
                  base_tmp.c_str (),\r
-                 temp_exp.c_str () );\r
+                 temp_exp.c_str (),\r
+                 killAt.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${rm} %s\n",\r
+                 "\t-@${rm} %s 2>$(NUL)\n",\r
                  base_tmp.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${gcc} %s %s -Wl,%s -o %s %s %s\n",\r
-                 GetLinkerMacro ( module ).c_str (),\r
+                 "\t${gcc} %s %s -Wl,%s -o $@ %s %s\n",\r
+                 GetLinkerMacro ().c_str (),\r
                  gccOptions.c_str (),\r
                  temp_exp.c_str (),\r
-                 target.c_str (),\r
                  objectsMacro.c_str (),\r
-                 importLibraryDependencies.c_str () );\r
+                 linkDepsMacro.c_str () );\r
        fprintf ( fMakefile,\r
-                 "\t${rm} %s\n\n",\r
+                 "\t-@${rm} %s 2>$(NUL)\n",\r
                  temp_exp.c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_RSYM)\n" );\r
+       fprintf ( fMakefile,\r
+                 "\t$(Q)$(RSYM_TARGET) $@ $@\n\n" );\r
+}\r
+\r
+\r
+MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
 }\r
 \r
+void\r
+MingwStaticLibraryModuleHandler::Process ()\r
+{\r
+       GenerateStaticLibraryModuleTarget ();\r
+}\r
 \r
-static MingwStaticLibraryModuleHandler staticlibrary_handler;\r
+void\r
+MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ()\r
+{\r
+       GenerateRules ();\r
+}\r
 \r
-MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ()\r
-       : MingwModuleHandler ( StaticLibrary )\r
+\r
+MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwStaticLibraryModuleHandler::Process ( const Module& module )\r
+MingwObjectLibraryModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateStaticLibraryModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateObjectLibraryModuleTarget ();\r
 }\r
 \r
 void\r
-MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module& module )\r
+MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ()\r
 {\r
-       GenerateMacrosAndTargetsTarget ( module );\r
+       GenerateRules ();\r
 }\r
 \r
 \r
-static MingwKernelModeDLLModuleHandler kernelmodedll_handler;\r
+MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler (\r
+       const Module& module_ )\r
 \r
-MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()\r
-       : MingwModuleHandler ( KernelModeDLL )\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwKernelModeDLLModuleHandler::Process ( const Module& module )\r
+MingwKernelModeDLLModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateKernelModeDLLModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateKernelModeDLLModuleTarget ();\r
 }\r
 \r
 void\r
-MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Module& module )\r
+MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ()\r
 {\r
-       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string targetMacro ( GetTargetMacro (module) );\r
        string workingDirectory = GetWorkingDirectory ( );\r
-       string archiveFilename = GetModuleArchiveFilename ( module );\r
-       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
 \r
-       GenerateImportLibraryTargetIfNeeded ( module );\r
+       GenerateImportLibraryTargetIfNeeded ();\r
 \r
-       if ( module.files.size () > 0 )\r
+       if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module );\r
+               GenerateRules ();\r
 \r
-               fprintf ( fMakefile, "%s: %s %s\n",\r
-                         target.c_str (),\r
-                         archiveFilename.c_str (),\r
-                         importLibraryDependencies.c_str () );\r
+               string dependencies =\r
+                       objectsMacro + " " + linkDepsMacro;\r
 \r
-               string linkerParameters ( "-Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll" );\r
-               GenerateLinkerCommand ( module,\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
                                        "${gcc}",\r
                                        linkerParameters,\r
-                                       archiveFilename );\r
+                                       objectsMacro,\r
+                                       libsMacro );\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
+               GeneratePhonyTarget();\r
        }\r
 }\r
 \r
 \r
-static MingwKernelModeDriverModuleHandler kernelmodedriver_handler;\r
+MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler (\r
+       const Module& module_ )\r
 \r
-MingwKernelModeDriverModuleHandler::MingwKernelModeDriverModuleHandler ()\r
-       : MingwModuleHandler ( KernelModeDriver )\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwKernelModeDriverModuleHandler::Process ( const Module& module )\r
+MingwKernelModeDriverModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateKernelModeDriverModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateKernelModeDriverModuleTarget ();\r
 }\r
 \r
 \r
 void\r
-MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget ( const Module& module )\r
+MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget ()\r
 {\r
-       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-       string target ( PassThruCacheDirectory( FixupTargetFilename ( module.GetPath () ) ) );\r
-       string workingDirectory = GetWorkingDirectory ( );\r
-       string archiveFilename = GetModuleArchiveFilename ( module );\r
-       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+       string targetMacro ( GetTargetMacro (module) );\r
+       string workingDirectory = GetWorkingDirectory ();\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
 \r
-       GenerateImportLibraryTargetIfNeeded ( module );\r
+       GenerateImportLibraryTargetIfNeeded ();\r
 \r
-       if ( module.files.size () > 0 )\r
+       if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               string* cflags = new string ( "-D__NTDRIVER__" );\r
-               GenerateMacrosAndTargetsTarget ( module,\r
-                                                cflags );\r
-               delete cflags;\r
+               GenerateRules ();\r
 \r
-               fprintf ( fMakefile, "%s: %s %s\n",\r
-                         target.c_str (),\r
-                         archiveFilename.c_str (),\r
-                         importLibraryDependencies.c_str () );\r
+               string dependencies = objectsMacro + " " + linkDepsMacro;\r
 \r
-               string linkerParameters ( "-Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll" );\r
-               GenerateLinkerCommand ( module,\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
                                        "${gcc}",\r
                                        linkerParameters,\r
-                                       archiveFilename );\r
+                                       objectsMacro,\r
+                                       libsMacro );\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
+               GeneratePhonyTarget();\r
        }\r
 }\r
 \r
 \r
-static MingwNativeDLLModuleHandler nativedll_handler;\r
+MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler (\r
+       const Module& module_ )\r
 \r
-MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()\r
-       : MingwModuleHandler ( NativeDLL )\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwNativeDLLModuleHandler::Process ( const Module& module )\r
+MingwNativeDLLModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateNativeDLLModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateNativeDLLModuleTarget ();\r
 }\r
 \r
 void\r
-MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module& module )\r
+MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ()\r
 {\r
-       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string targetMacro ( GetTargetMacro (module) );\r
        string workingDirectory = GetWorkingDirectory ( );\r
-       string objectFilenames = GetObjectFilenames ( module );\r
-       string archiveFilename = GetModuleArchiveFilename ( module );\r
-       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
        \r
-       GenerateImportLibraryTargetIfNeeded ( module );\r
+       GenerateImportLibraryTargetIfNeeded ();\r
 \r
-       if ( module.files.size () > 0 )\r
+       if ( module.non_if_data.files.size () > 0 )\r
        {\r
+               GenerateRules ();\r
 \r
-               fprintf ( fMakefile,\r
-                         "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",\r
-                         module.GetTargetName ().c_str (),\r
-                         (module.GetBasePath () + SSEP + module.importLibrary->definition).c_str (),\r
-                         FixupTargetFilename ( module.GetDependencyPath () ).c_str () );\r
+               string dependencies =\r
+                       objectsMacro + " " + linkDepsMacro;\r
+\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
+                                       "${gcc}",\r
+                                       linkerParameters,\r
+                                       objectsMacro,\r
+                                       libsMacro );\r
+       }\r
+       else\r
+       {\r
+               GeneratePhonyTarget();\r
        }\r
+}\r
+\r
+\r
+MingwNativeCUIModuleHandler::MingwNativeCUIModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
+}\r
+\r
+void\r
+MingwNativeCUIModuleHandler::Process ()\r
+{\r
+       GenerateNativeCUIModuleTarget ();\r
+}\r
+\r
+void\r
+MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ()\r
+{\r
+       string targetMacro ( GetTargetMacro (module) );\r
+       string workingDirectory = GetWorkingDirectory ( );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
+       \r
+       GenerateImportLibraryTargetIfNeeded ();\r
 \r
-       if (module.files.size () > 0)\r
+       if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module );\r
+               GenerateRules ();\r
 \r
-               fprintf ( fMakefile, "%s: %s %s\n",\r
-                         target.c_str (),\r
-                         archiveFilename.c_str (),\r
-                         importLibraryDependencies.c_str () );\r
+               string dependencies =\r
+                       objectsMacro + " " + linkDepsMacro;\r
 \r
-               string linkerParameters ( "-Wl,--subsystem,native -Wl,--entry,_DllMainCRTStartup@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll" );\r
-               GenerateLinkerCommand ( module,\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
                                        "${gcc}",\r
                                        linkerParameters,\r
-                                       objectFilenames );\r
+                                       objectsMacro,\r
+                                       libsMacro );\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
+               GeneratePhonyTarget();\r
        }\r
 }\r
 \r
 \r
-static MingwWin32DLLModuleHandler win32dll_handler;\r
+MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler (\r
+       const Module& module_ )\r
 \r
-MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ()\r
-       : MingwModuleHandler ( Win32DLL )\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwWin32DLLModuleHandler::Process ( const Module& module )\r
+MingwWin32DLLModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateWin32DLLModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateExtractWineDLLResourcesTarget ();\r
+       GenerateWin32DLLModuleTarget ();\r
+}\r
+\r
+void\r
+MingwWin32DLLModuleHandler::GenerateExtractWineDLLResourcesTarget ()\r
+{\r
+       fprintf ( fMakefile, ".PHONY: %s_extractresources\n\n",\r
+                 module.name.c_str () );\r
+       fprintf ( fMakefile, "%s_extractresources: $(BIN2RES_TARGET)\n",\r
+                 module.name.c_str () );\r
+       const vector<File*>& files = module.non_if_data.files;\r
+       for ( size_t i = 0; i < files.size (); i++ )\r
+       {\r
+               File& file = *files[i];\r
+               string extension = GetExtension ( file.name );\r
+               if ( extension == ".rc" || extension == ".RC" )\r
+               {\r
+                       string resource = FixupTargetFilename ( file.name );\r
+                       fprintf ( fMakefile, "\t$(ECHO_BIN2RES)\n" );\r
+                       fprintf ( fMakefile, "\t@:echo ${bin2res} -f -x %s\n",\r
+                                 resource.c_str () );\r
+               }\r
+       }\r
+       fprintf ( fMakefile, "\n");\r
 }\r
 \r
 void\r
-MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module& module )\r
+MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ()\r
 {\r
-       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string targetMacro ( GetTargetMacro (module) );\r
        string workingDirectory = GetWorkingDirectory ( );\r
-       string objectFilenames = GetObjectFilenames ( module );\r
-       string linkingDependencies = GetLinkingDependencies ( module );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
+\r
+       GenerateImportLibraryTargetIfNeeded ();\r
 \r
-       GenerateImportLibraryTargetIfNeeded ( module );\r
-       if ( module.files.size () > 0 )\r
+       if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module );\r
+               GenerateRules ();\r
 \r
-               fprintf ( fMakefile, "%s: %s %s\n",\r
-                         target.c_str (),\r
-                         objectFilenames.c_str (),\r
-                         linkingDependencies.c_str () );\r
+               string dependencies = objectsMacro + " " + linkDepsMacro;\r
 \r
-               string linkerParameters ( "-Wl,--subsystem,console -Wl,--entry,_DllMain@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -mdll" );\r
-               GenerateLinkerCommand ( module,\r
-                                       "${gcc}",\r
+               string linker;\r
+               if ( module.cplusplus )\r
+                       linker = "${gpp}";\r
+               else\r
+                       linker = "${gcc}";\r
+\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -mdll",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
+                                       linker,\r
                                        linkerParameters,\r
-                                       objectFilenames );\r
+                                       objectsMacro,\r
+                                       libsMacro );\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
+               GeneratePhonyTarget();\r
        }\r
 }\r
 \r
 \r
-static MingwWin32GUIModuleHandler win32gui_handler;\r
+MingwWin32CUIModuleHandler::MingwWin32CUIModuleHandler (\r
+       const Module& module_ )\r
 \r
-MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler ()\r
-       : MingwModuleHandler ( Win32GUI )\r
+       : MingwModuleHandler ( module_ )\r
 {\r
 }\r
 \r
 void\r
-MingwWin32GUIModuleHandler::Process ( const Module& module )\r
+MingwWin32CUIModuleHandler::Process ()\r
 {\r
-       GeneratePreconditionDependencies ( module );\r
-       GenerateWin32GUIModuleTarget ( module );\r
-       GenerateInvocations ( module );\r
+       GenerateWin32CUIModuleTarget ();\r
 }\r
 \r
 void\r
-MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module )\r
+MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ()\r
 {\r
-       static string ros_junk ( "$(ROS_TEMPORARY)" );\r
-       string target ( FixupTargetFilename ( module.GetPath () ) );\r
+       string targetMacro ( GetTargetMacro (module) );\r
        string workingDirectory = GetWorkingDirectory ( );\r
-       string objectFilenames = GetObjectFilenames ( module );\r
-       string importLibraryDependencies = GetImportLibraryDependencies ( module );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
 \r
-       GenerateImportLibraryTargetIfNeeded ( module );\r
+       GenerateImportLibraryTargetIfNeeded ();\r
 \r
-       if ( module.files.size () > 0 )\r
+       if ( module.non_if_data.files.size () > 0 )\r
        {\r
-               GenerateMacrosAndTargetsTarget ( module );\r
+               GenerateRules ();\r
+\r
+               string dependencies =\r
+                       objectsMacro + " " + linkDepsMacro;\r
+\r
+               string linker;\r
+               if ( module.cplusplus )\r
+                       linker = "${gpp}";\r
+               else\r
+                       linker = "${gcc}";\r
+\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
+                                       linker,\r
+                                       linkerParameters,\r
+                                       objectsMacro,\r
+                                       libsMacro );\r
+       }\r
+       else\r
+       {\r
+               GeneratePhonyTarget();\r
+       }\r
+}\r
 \r
-               fprintf ( fMakefile, "%s: %s %s\n",\r
-                         target.c_str (),\r
-                         objectFilenames.c_str (),\r
-                         importLibraryDependencies.c_str () );\r
 \r
-               string linkerParameters ( "-Wl,--subsystem,windows -Wl,--entry,_WinMainCRTStartup -Wl,--image-base,0x00400000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000" );\r
-               GenerateLinkerCommand ( module,\r
-                                       "${gcc}",\r
+MingwWin32GUIModuleHandler::MingwWin32GUIModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
+}\r
+\r
+void\r
+MingwWin32GUIModuleHandler::Process ()\r
+{\r
+       GenerateWin32GUIModuleTarget ();\r
+}\r
+\r
+void\r
+MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ()\r
+{\r
+       string targetMacro ( GetTargetMacro (module) );\r
+       string workingDirectory = GetWorkingDirectory ( );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
+\r
+       GenerateImportLibraryTargetIfNeeded ();\r
+\r
+       if ( module.non_if_data.files.size () > 0 )\r
+       {\r
+               GenerateRules ();\r
+\r
+               string dependencies =\r
+                       objectsMacro + " " + linkDepsMacro;\r
+\r
+               string linker;\r
+               if ( module.cplusplus )\r
+                       linker = "${gpp}";\r
+               else\r
+                       linker = "${gcc}";\r
+\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,windows -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
+                                       linker,\r
+                                       linkerParameters,\r
+                                       objectsMacro,\r
+                                       libsMacro );\r
+       }\r
+       else\r
+       {\r
+               GeneratePhonyTarget();\r
+       }\r
+}\r
+\r
+\r
+MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
+}\r
+\r
+void\r
+MingwBootLoaderModuleHandler::Process ()\r
+{\r
+       GenerateBootLoaderModuleTarget ();\r
+}\r
+\r
+void\r
+MingwBootLoaderModuleHandler::GenerateBootLoaderModuleTarget ()\r
+{\r
+       string targetName ( module.GetTargetName () );\r
+       string targetMacro ( GetTargetMacro (module) );\r
+       string workingDirectory = GetWorkingDirectory ();\r
+       string junk_tmp = ros_temp + module.name + ".junk.tmp";\r
+       CLEAN_FILE ( junk_tmp );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
+\r
+       GenerateRules ();\r
+\r
+       fprintf ( fMakefile, "%s: %s %s %s\n",\r
+                 targetMacro.c_str (),\r
+                 objectsMacro.c_str (),\r
+                 linkDepsMacro.c_str (),\r
+                 GetDirectory(GetTargetFilename(module,NULL)).c_str () );\r
+\r
+       fprintf ( fMakefile, "\t$(ECHO_LD)\n" );\r
+\r
+       fprintf ( fMakefile,\r
+                 "\t${ld} %s -N -Ttext=0x8000 -o %s %s %s\n",\r
+                 GetLinkerMacro ().c_str (),\r
+                 junk_tmp.c_str (),\r
+                 objectsMacro.c_str (),\r
+                 linkDepsMacro.c_str () );\r
+       fprintf ( fMakefile,\r
+                 "\t${objcopy} -O binary %s $@\n",\r
+                 junk_tmp.c_str () );\r
+       fprintf ( fMakefile,\r
+                 "\t-@${rm} %s 2>$(NUL)\n",\r
+                 junk_tmp.c_str () );\r
+}\r
+\r
+\r
+MingwBootSectorModuleHandler::MingwBootSectorModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
+}\r
+\r
+void\r
+MingwBootSectorModuleHandler::Process ()\r
+{\r
+       GenerateBootSectorModuleTarget ();\r
+}\r
+\r
+void\r
+MingwBootSectorModuleHandler::GenerateBootSectorModuleTarget ()\r
+{\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+\r
+       GenerateRules ();\r
+\r
+       fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+                 module.name.c_str ());\r
+       fprintf ( fMakefile,\r
+                 "%s: %s\n",\r
+                 module.name.c_str (),\r
+                 objectsMacro.c_str () );\r
+}\r
+\r
+\r
+MingwIsoModuleHandler::MingwIsoModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::Process ()\r
+{\r
+       GenerateIsoModuleTarget ();\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::OutputBootstrapfileCopyCommands (\r
+       const string& bootcdDirectory )\r
+{\r
+       for ( size_t i = 0; i < module.project.modules.size (); i++ )\r
+       {\r
+               const Module& m = *module.project.modules[i];\r
+               if ( m.bootstrap != NULL )\r
+               {\r
+                       string targetFilenameNoFixup ( bootcdDirectory + SSEP + m.bootstrap->base + SSEP + m.bootstrap->nameoncd );\r
+                       string targetFilename ( GetTargetMacro ( module ) );\r
+                       fprintf ( fMakefile,\r
+                                 "\t${cp} %s %s\n",\r
+                                 m.GetPath ().c_str (),\r
+                                 targetFilename.c_str () );\r
+               }\r
+       }\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::OutputCdfileCopyCommands (\r
+       const string& bootcdDirectory )\r
+{\r
+       for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )\r
+       {\r
+               const CDFile& cdfile = *module.project.cdfiles[i];\r
+               string targetFilenameNoFixup = bootcdDirectory + SSEP + cdfile.base + SSEP + cdfile.nameoncd;\r
+               string targetFilename = GetTargetMacro(module);\r
+               fprintf ( fMakefile,\r
+                         "\t${cp} %s %s\n",\r
+                         cdfile.GetPath ().c_str (),\r
+                         targetFilename.c_str () );\r
+       }\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetBootstrapCdDirectories ( const string& bootcdDirectory )\r
+{\r
+       string directories;\r
+       for ( size_t i = 0; i < module.project.modules.size (); i++ )\r
+       {\r
+               const Module& m = *module.project.modules[i];\r
+               if ( m.bootstrap != NULL )\r
+               {\r
+                       string targetDirectory ( bootcdDirectory + SSEP + m.bootstrap->base );\r
+                       if ( directories.size () > 0 )\r
+                               directories += " ";\r
+                       directories += PassThruCacheDirectory (\r
+                               FixupTargetFilename ( targetDirectory ),\r
+                               true );\r
+               }\r
+       }\r
+       return directories;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetNonModuleCdDirectories ( const string& bootcdDirectory )\r
+{\r
+       string directories;\r
+       for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )\r
+       {\r
+               const CDFile& cdfile = *module.project.cdfiles[i];\r
+               string targetDirectory ( bootcdDirectory + SSEP + cdfile.base );\r
+               if ( directories.size () > 0 )\r
+                       directories += " ";\r
+               directories += PassThruCacheDirectory (\r
+                       FixupTargetFilename ( targetDirectory ),\r
+                       true );\r
+       }\r
+       return directories;\r
+}\r
+\r
+string\r
+MingwIsoModuleHandler::GetCdDirectories ( const string& bootcdDirectory )\r
+{\r
+       string directories = GetBootstrapCdDirectories ( bootcdDirectory );\r
+       directories += " " + GetNonModuleCdDirectories ( bootcdDirectory );\r
+       return directories;\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::GetBootstrapCdFiles (\r
+       vector<string>& out ) const\r
+{\r
+       for ( size_t i = 0; i < module.project.modules.size (); i++ )\r
+       {\r
+               const Module& m = *module.project.modules[i];\r
+               if ( m.bootstrap != NULL )\r
+                       out.push_back ( FixupTargetFilename ( m.GetPath () ) );\r
+       }\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::GetNonModuleCdFiles (\r
+       vector<string>& out ) const\r
+{\r
+       for ( size_t i = 0; i < module.project.cdfiles.size (); i++ )\r
+       {\r
+               const CDFile& cdfile = *module.project.cdfiles[i];\r
+               out.push_back ( NormalizeFilename ( cdfile.GetPath () ) );\r
+       }\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::GetCdFiles (\r
+       vector<string>& out ) const\r
+{\r
+       GetBootstrapCdFiles ( out );\r
+       GetNonModuleCdFiles ( out );\r
+}\r
+\r
+void\r
+MingwIsoModuleHandler::GenerateIsoModuleTarget ()\r
+{\r
+       string bootcdDirectory = "cd";\r
+       string isoboot = FixupTargetFilename ( "boot/freeldr/bootsect/isoboot.o" );\r
+       string bootcdReactosNoFixup = bootcdDirectory + "/reactos";\r
+       string bootcdReactos = PassThruCacheDirectory (\r
+               FixupTargetFilename ( bootcdReactosNoFixup ),\r
+               true );\r
+       CLEAN_FILE ( bootcdReactos );\r
+       string reactosInf = ros_temp + FixupTargetFilename ( bootcdReactosNoFixup + "/reactos.inf" );\r
+       string reactosDff = NormalizeFilename ( "bootdata/packages/reactos.dff" );\r
+       string cdDirectories = GetCdDirectories ( bootcdDirectory );\r
+       vector<string> vCdFiles;\r
+       GetCdFiles ( vCdFiles );\r
+       string cdFiles = v2s ( vCdFiles, 5 );\r
+\r
+       fprintf ( fMakefile, ".PHONY: %s\n\n",\r
+                 module.name.c_str ());\r
+       fprintf ( fMakefile,\r
+                 "%s: all %s %s %s %s $(CABMAN_TARGET) $(CDMAKE_TARGET)\n",\r
+                 module.name.c_str (),\r
+                 isoboot.c_str (),\r
+                 bootcdReactos.c_str (),\r
+                 cdDirectories.c_str (),\r
+                 cdFiles.c_str () );\r
+       fprintf ( fMakefile, "\t$(ECHO_CABMAN)\n" );\r
+       fprintf ( fMakefile,\r
+                 "\t$(Q)$(CABMAN_TARGET) -C %s -L %s -I\n",\r
+                 reactosDff.c_str (),\r
+                 bootcdReactos.c_str () );\r
+       fprintf ( fMakefile,\r
+                 "\t$(Q)$(CABMAN_TARGET) -C %s -RC %s -L %s -N -P $(OUTPUT)\n",\r
+                 reactosDff.c_str (),\r
+                 reactosInf.c_str (),\r
+                 bootcdReactos.c_str ());\r
+       fprintf ( fMakefile,\r
+                 "\t-@${rm} %s 2>$(NUL)\n",\r
+                 reactosInf.c_str () );\r
+       OutputBootstrapfileCopyCommands ( bootcdDirectory );\r
+       OutputCdfileCopyCommands ( bootcdDirectory );\r
+       fprintf ( fMakefile, "\t$(ECHO_CDMAKE)\n" );\r
+       fprintf ( fMakefile,\r
+                 "\t$(Q)$(CDMAKE_TARGET) -v -m -b %s %s REACTOS ReactOS.iso\n",\r
+                 isoboot.c_str (),\r
+                 bootcdDirectory.c_str () );\r
+       fprintf ( fMakefile,\r
+                 "\n" );\r
+}\r
+\r
+\r
+MingwTestModuleHandler::MingwTestModuleHandler (\r
+       const Module& module_ )\r
+\r
+       : MingwModuleHandler ( module_ )\r
+{\r
+}\r
+\r
+void\r
+MingwTestModuleHandler::Process ()\r
+{\r
+       GenerateTestModuleTarget ();\r
+}\r
+\r
+void\r
+MingwTestModuleHandler::GenerateTestModuleTarget ()\r
+{\r
+       string targetMacro ( GetTargetMacro (module) );\r
+       string workingDirectory = GetWorkingDirectory ( );\r
+       string objectsMacro = GetObjectsMacro ( module );\r
+       string linkDepsMacro = GetLinkingDependenciesMacro ();\r
+       string libsMacro = GetLibsMacro ();\r
+\r
+       GenerateImportLibraryTargetIfNeeded ();\r
+\r
+       if ( module.non_if_data.files.size () > 0 )\r
+       {\r
+               GenerateRules ();\r
+\r
+               string dependencies = objectsMacro + " " + linkDepsMacro;\r
+\r
+               string linker;\r
+               if ( module.cplusplus )\r
+                       linker = "${gpp}";\r
+               else\r
+                       linker = "${gcc}";\r
+\r
+               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",\r
+                                                    module.entrypoint.c_str (),\r
+                                                    module.baseaddress.c_str () );\r
+               GenerateLinkerCommand ( dependencies,\r
+                                       linker,\r
                                        linkerParameters,\r
-                                       objectFilenames );\r
+                                       objectsMacro,\r
+                                       libsMacro );\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
+               GeneratePhonyTarget();\r
        }\r
 }\r