Fix a typo
[reactos.git] / reactos / tools / rbuild / backend / mingw / modulehandler.cpp
index bd2bdc9..2a06f29 100644 (file)
@@ -190,6 +190,7 @@ MingwModuleHandler::InstanciateHandler (
                case Win32GUI:
                        handler = new MingwWin32GUIModuleHandler ( module );
                        break;
+               case KeyboardLayout:
                case KernelModeDLL:
                        handler = new MingwKernelModeDLLModuleHandler ( module );
                        break;
@@ -241,6 +242,9 @@ MingwModuleHandler::InstanciateHandler (
                case Alias:
                        handler = new MingwAliasModuleHandler ( module );
                        break;
+               case MessageHeader:
+                       handler = new MingwMessageHeaderModuleHandler (module);
+                       break;
                case IdlHeader:
                        handler = new MingwIdlHeaderModuleHandler ( module );
                        break;
@@ -277,49 +281,6 @@ MingwModuleHandler::GetBasename ( const string& filename ) const
        return "";
 }
 
-/* caller needs to delete the returned object */
-const FileLocation*
-MingwModuleHandler::GetActualSourceFilename (
-       const FileLocation* file ) const
-{
-       string filename = file->name;
-
-       string extension = GetExtension ( *file );
-       if ( extension == ".spec" || extension == ".SPEC" )
-       {
-               const FileLocation *objectFile = GetObjectFilename ( file, module );
-               FileLocation *sourceFile = new FileLocation (
-                       objectFile->directory,
-                       objectFile->relative_path,
-                       ReplaceExtension ( objectFile->name, ".c" ) );
-               delete objectFile;
-               return sourceFile;
-       }
-       else if ( ( extension == ".idl" || extension == ".IDL" ) &&
-                 ( module.type == RpcServer || module.type == RpcClient || module.type == RpcProxy ) )
-       {
-               const FileLocation *objectFile = GetObjectFilename ( file, module );
-               FileLocation *sourceFile = new FileLocation (
-                       objectFile->directory,
-                       objectFile->relative_path,
-                       ReplaceExtension ( objectFile->name, ".c" ) );
-               delete objectFile;
-               return sourceFile;
-       }
-       else if ( extension == ".mc" || extension == ".MC" )
-       {
-               const FileLocation *objectFile = GetObjectFilename ( file, module );
-               FileLocation *sourceFile = new FileLocation (
-                       objectFile->directory,
-                       objectFile->relative_path,
-                       ReplaceExtension ( objectFile->name, ".rc" ) );
-               delete objectFile;
-               return sourceFile;
-       }
-       else
-               return new FileLocation ( *file );
-}
-
 string
 MingwModuleHandler::GetExtraDependencies (
        const FileLocation *file ) const
@@ -394,6 +355,8 @@ MingwModuleHandler::ReferenceObjects (
                return true;
        if ( module.type == IdlHeader )
                return true;
+       if ( module.type == MessageHeader)
+               return true;
        return false;
 }
 
@@ -482,56 +445,6 @@ MingwModuleHandler::GetModuleDependencies (
        }
 }
 
-void
-MingwModuleHandler::GetSourceFilenames ( vector<FileLocation>& list,
-                                         bool includeGeneratedFiles ) const
-{
-       size_t i;
-
-       const vector<CompilationUnit*>& compilationUnits = module.non_if_data.compilationUnits;
-       for ( i = 0; i < compilationUnits.size (); i++ )
-       {
-               if ( includeGeneratedFiles || !compilationUnits[i]->IsGeneratedFile () )
-               {
-                       const FileLocation& compilationName = compilationUnits[i]->GetFilename ();
-                       const FileLocation* sourceFileLocation = GetActualSourceFilename ( &compilationName );
-                       list.push_back ( *sourceFileLocation );
-                       delete sourceFileLocation;
-               }
-       }
-       // intentionally make a copy so that we can append more work in
-       // the middle of processing without having to go recursive
-       vector<If*> v = module.non_if_data.ifs;
-       for ( i = 0; i < v.size (); i++ )
-       {
-               size_t j;
-               If& rIf = *v[i];
-               // check for sub-ifs to add to list
-               const vector<If*>& ifs = rIf.data.ifs;
-               for ( j = 0; j < ifs.size (); j++ )
-                       v.push_back ( ifs[j] );
-               const vector<CompilationUnit*>& compilationUnits = rIf.data.compilationUnits;
-               for ( j = 0; j < compilationUnits.size (); j++ )
-               {
-                       CompilationUnit& compilationUnit = *compilationUnits[j];
-                       if ( includeGeneratedFiles || !compilationUnit.IsGeneratedFile () )
-                       {
-                               const FileLocation& compilationName = compilationUnit.GetFilename ();
-                               const FileLocation* sourceFileLocation = GetActualSourceFilename ( &compilationName );
-                               list.push_back ( *sourceFileLocation );
-                               delete sourceFileLocation;
-                       }
-               }
-       }
-}
-
-void
-MingwModuleHandler::GetSourceFilenamesWithoutGeneratedFiles (
-       vector<FileLocation>& list ) const
-{
-       GetSourceFilenames ( list, false );
-}
-
 /* caller needs to delete the returned object */
 const FileLocation*
 MingwModuleHandler::GetObjectFilename (
@@ -830,10 +743,9 @@ MingwModuleHandler::GenerateMacro (
        size_t i;
        bool generateAssignment;
 
+       generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0;
        if ( generatingCompilerMacro )
-               generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0 || data.compilerFlags.size () > 0;
-       else
-               generateAssignment = (use_pch && module.pch != NULL ) || data.includes.size () > 0 || data.defines.size () > 0;
+               generateAssignment |= data.compilerFlags.size () > 0;
        if ( generateAssignment )
        {
                fprintf ( fMakefile,
@@ -1244,7 +1156,7 @@ MingwModuleHandler::GetPrecompiledHeaderFilename () const
                return NULL;
        return new FileLocation ( IntermediateDirectory,
                                  module.pch->file->relative_path,
-                                 ReplaceExtension ( module.pch->file->name, "_" + module.name + ".gch" ) );
+                                 module.pch->file->name + ".gch" );
 }
 
 Rule arRule1 ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).a: $($(module_name)_OBJS) | $(INTERMEDIATE)$(SEP)$(source_dir)\n",
@@ -1259,7 +1171,7 @@ Rule arHostRule2 ( "\t$(ECHO_AR)\n"
 Rule gasRule ( "$(source): ${$(module_name)_precondition}\n"
                "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                "\t$(ECHO_GAS)\n"
-               "\t${gcc} -x assembler-with-cpp -c $< -o $@ -D__ASM__ $($(module_name)_CFLAGS)\n",
+               "\t${gcc} -x assembler-with-cpp -o $@ -D__ASM__ $($(module_name)_CFLAGS) -c $<\n",
                "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o",
                "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
 Rule bootRule ( "$(source): ${$(module_name)_precondition}\n"
@@ -1283,10 +1195,12 @@ Rule windresRule ( "$(source): ${$(module_name)_precondition}\n"
                    "\t-@${rm} $(TEMPORARY)$(SEP)$(module_name).$(source_name_noext).res.tmp 2>$(NUL)\n",
                    "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).coff",
                    "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
-Rule wmcRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h: $(WMC_TARGET) $(source)\n"
+Rule wmcRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h: $(WMC_TARGET) $(source) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                "\t$(ECHO_WMC)\n"
                "\t$(Q)$(WMC_TARGET) -i -H $(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h -o $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc $(source)\n",
-               "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc", "$(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h", NULL );
+               "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).rc",
+               "$(INTERMEDIATE)$(SEP)include$(SEP)reactos$(SEP)$(source_name_noext).h",
+               "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
 Rule winebuildRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec.def: $(source)$(dependencies) $(WINEBUILD_TARGET) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                      "\t$(ECHO_WINEBLD)\n"
                      "\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).spec.def --def -E $(source)\n"
@@ -1295,7 +1209,7 @@ Rule winebuildRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noex
                      "\t$(Q)$(WINEBUILD_TARGET) $(WINEBUILD_FLAGS) -o $(INTERMEDIATE)$(SEP)$(source_path)$(SEP)$(source_name_noext).stubs.c --pedll $(source_path)$(SEP)$(source_name_noext).spec\n"
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.c$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                      "\t$(ECHO_CC)\n"
-                     "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+                     "\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).spec.def",
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.c",
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).stubs.o",
@@ -1312,7 +1226,7 @@ Rule widlServerRule ( "$(source): ${$(module_name)_precondition}\n"
                       "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h -s -S $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c $(source)\n"
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                       "\t$(ECHO_CC)\n"
-                      "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+                      "\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.h",
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.c",
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_s.o",
@@ -1323,7 +1237,7 @@ Rule widlClientRule ( "$(source): ${$(module_name)_precondition}\n"
                       "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h -c -C $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c $(source)\n"
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                       "\t$(ECHO_CC)\n"
-                      "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+                      "\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.h",
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.c",
                       "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_c.o",
@@ -1334,7 +1248,7 @@ Rule widlProxyRule ( "$(source): ${$(module_name)_precondition}\n"
                      "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -h -H $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h -p -P $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c $(source)\n"
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.o: $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                       "\t$(ECHO_CC)\n"
-                      "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+                      "\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.h",
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.c",
                      "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_p.o",
@@ -1344,21 +1258,25 @@ Rule widlTlbRule ( "$(source): ${$(module_name)_precondition}\n"
                    "\t$(ECHO_WIDL)\n"
                    "\t$(Q)$(WIDL_TARGET) $($(module_name)_WIDLFLAGS) -t -T $(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext).tlb $(source)\n",
                    "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)", NULL );
-Rule gccRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+Rule gccRule ( "$(source): ${$(module_name)_precondition}\n"
+               "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                "\t$(ECHO_CC)\n"
-               "\t${gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+               "\t${gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
-Rule gccHostRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+Rule gccHostRule ( "$(source): ${$(module_name)_precondition}\n"
+                   "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                    "\t$(ECHO_CC)\n"
-                   "\t${host_gcc} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+                   "\t${host_gcc} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                    "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
-Rule gppRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+Rule gppRule ( "$(source): ${$(module_name)_precondition}\n"
+               "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                "\t$(ECHO_CC)\n"
-               "\t${gpp} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+               "\t${gpp} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
-Rule gppHostRule ( "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source) ${$(module_name)_precondition}$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
+Rule gppHostRule ( "$(source): ${$(module_name)_precondition}\n"
+                   "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o: $(source)$(dependencies) | $(INTERMEDIATE)$(SEP)$(source_dir)\n"
                    "\t$(ECHO_CC)\n"
-                   "\t${host_gpp} -c $< -o $@ $($(module_name)_CFLAGS)$(compiler_flags)\n",
+                   "\t${host_gpp} -o $@ $($(module_name)_CFLAGS)$(compiler_flags) -c $<\n",
                    "$(INTERMEDIATE)$(SEP)$(source_dir)$(SEP)$(source_name_noext)_$(module_name).o", NULL );
 Rule emptyRule ( "", NULL );
 
@@ -1368,7 +1286,6 @@ MingwModuleHandler::GenerateGccCommand (
        const Rule *rule,
        const string& extraDependencies )
 {
-       const FileLocation *generatedSourceFileName = GetActualSourceFilename ( sourceFile );
        const FileLocation *pchFilename = GetPrecompiledHeaderFilename ();
        string dependencies = extraDependencies;
 
@@ -1391,9 +1308,7 @@ MingwModuleHandler::GenerateGccCommand (
        if ( rpcDependencies.size () > 0 )
                dependencies += " " + v2s ( backend, rpcDependencies, 5 );
 
-       rule->Execute ( fMakefile, backend, module, generatedSourceFileName, clean_files, dependencies, flags );
-
-       delete generatedSourceFileName;
+       rule->Execute ( fMakefile, backend, module, sourceFile, clean_files, dependencies, flags );
 }
 
 string
@@ -1634,10 +1549,14 @@ MingwModuleHandler::GenerateCleanObjectsAsYouGoCode () const
 void
 MingwModuleHandler::GenerateRunRsymCode () const
 {
+       fprintf ( fMakefile,
+             "ifneq ($(ROS_GENERATE_RSYM),no)\n" );
        fprintf ( fMakefile,
                  "\t$(ECHO_RSYM)\n" );
        fprintf ( fMakefile,
                  "\t$(Q)$(RSYM_TARGET) $@ $@\n\n" );
+       fprintf ( fMakefile,
+             "endif\n" );
 }
 
 void
@@ -1661,7 +1580,7 @@ MingwModuleHandler::GenerateLinkerCommand (
 {
        const FileLocation *target_file = GetTargetFilename ( module, NULL );
        const FileLocation *definitionFilename = GetDefinitionFilename ();
-       string linker = module.cplusplus ? "${gpp}" : "${gcc}";
+       string linker = "${ld}";
        string objectsMacro = GetObjectsMacro ( module );
        string libsMacro = GetLibsMacro ();
 
@@ -1670,7 +1589,7 @@ MingwModuleHandler::GenerateLinkerCommand (
 
        string linkerScriptArgument;
        if ( module.linkerScript != NULL )
-               linkerScriptArgument = ssprintf ( " -Wl,-T,%s", backend->GetFullName ( *module.linkerScript->file ).c_str () );
+               linkerScriptArgument = ssprintf ( " -%s", backend->GetFullName ( *module.linkerScript->file ).c_str () );
        else
                linkerScriptArgument = "";
 
@@ -1683,19 +1602,24 @@ MingwModuleHandler::GenerateLinkerCommand (
        fprintf ( fMakefile, "\t$(ECHO_LD)\n" );
        string targetName ( module.output->name );
 
-       if ( !module.IsDLL () )
+       /* HACK: if we have C++ in kernel, link it with some user mode dlls (kernel32 + msvcrt) ... */
+       static const string libsCppKernel = " '$(shell ${TARGET_CC} -print-file-name=libkernel32.a)' '$(shell ${TARGET_CC} -print-file-name=libmsvcrt.a)'";
+
+       if ( !module.HasImportLibrary() )
        {
                fprintf ( fMakefile,
-                         "\t%s %s%s -o %s %s %s %s\n",
+                         "\t%s %s%s %s %s%s %s %s -o %s\n",
                          linker.c_str (),
                          linkerParameters.c_str (),
                          linkerScriptArgument.c_str (),
-                         target_macro.c_str (),
                          objectsMacro.c_str (),
+                         module.cplusplus ? "$(PROJECT_LPPFLAGS) " : "",
+                         module.cplusplus && (module.type == KernelModeDLL || module.type == KernelModeDriver) ? libsCppKernel.c_str () : "",
                          libsMacro.c_str (),
-                         GetLinkerMacro ().c_str () );
+                         GetLinkerMacro ().c_str (),
+                         target_macro.c_str () );
        }
-       else if ( module.HasImportLibrary () )
+       else
        {
                FileLocation temp_exp ( TemporaryDirectory,
                                        "",
@@ -1711,15 +1635,17 @@ MingwModuleHandler::GenerateLinkerCommand (
                          module.underscoreSymbols ? " --add-underscore" : "" );
 
                fprintf ( fMakefile,
-                         "\t%s %s%s %s -o %s %s %s %s\n",
+                         "\t%s %s%s %s %s %s%s %s %s -o %s\n",
                          linker.c_str (),
                          linkerParameters.c_str (),
                          linkerScriptArgument.c_str (),
                          backend->GetFullName ( temp_exp ).c_str (),
-                         target_macro.c_str (),
                          objectsMacro.c_str (),
+                         module.cplusplus ? "$(PROJECT_LPPFLAGS) " : "",
+                         module.cplusplus && (module.type == KernelModeDLL || module.type == KernelModeDriver) ? libsCppKernel.c_str () : "",
                          libsMacro.c_str (),
-                         GetLinkerMacro ().c_str () );
+                         GetLinkerMacro ().c_str (),
+                         target_macro.c_str () );
 
                fprintf ( fMakefile,
                          "\t$(Q)$(PEFIXUP_TARGET) %s -exports%s\n",
@@ -1730,24 +1656,6 @@ MingwModuleHandler::GenerateLinkerCommand (
                          "\t-@${rm} %s 2>$(NUL)\n",
                          backend->GetFullName ( temp_exp ).c_str () );
        }
-       else
-       {
-               /* XXX: need to workaround binutils bug, which exports
-                * all functions in a dll if no .def file or an empty
-                * one has been provided... */
-               /* See bug 1244 */
-               //printf ( "%s will have all its functions exported\n",
-               //         module.target->name.c_str () );
-               fprintf ( fMakefile,
-                         "\t%s %s%s -o %s %s %s %s\n",
-                         linker.c_str (),
-                         linkerParameters.c_str (),
-                         linkerScriptArgument.c_str (),
-                         target_macro.c_str (),
-                         objectsMacro.c_str (),
-                         libsMacro.c_str (),
-                         GetLinkerMacro ().c_str () );
-       }
 
        GenerateBuildMapCode ();
        GenerateBuildNonSymbolStrippedCode ();
@@ -1838,10 +1746,9 @@ MingwModuleHandler::GenerateObjectFileTargets ()
                if ( rpcDependencies.size () > 0 )
                        dependencies += " " + v2s ( backend, rpcDependencies, 5 );
                fprintf ( fMakefile,
-                         "%s: %s ${%s_precondition} | %s\n",
+                         "%s: %s | %s\n",
                          backend->GetFullName ( *pchFilename ).c_str(),
                          dependencies.c_str(),
-                         module.name.c_str (),
                          backend->GetFullPath ( *pchFilename ).c_str() );
                fprintf ( fMakefile, "\t$(ECHO_PCH)\n" );
                fprintf ( fMakefile,
@@ -2308,30 +2215,37 @@ MingwModuleHandler::GetDefaultDependencies (
                dependencies.push_back ( "$(DXSDK_TARGET) $(dxsdk_HEADERS)" );
        }
 
-       /* Check if any dependent library relies on the generated headers */
-       for ( size_t i = 0; i < module.project.modules.size (); i++ )
+       if (module.name != "errcodes" && 
+               module.name != "bugcodes" &&
+               module.name != "ntstatus")
        {
-               const Module& m = *module.project.modules[i];
-               for ( size_t j = 0; j < m.non_if_data.compilationUnits.size (); j++ )
-               {
-                       CompilationUnit& compilationUnit = *m.non_if_data.compilationUnits[j];
-                       const FileLocation& sourceFile = compilationUnit.GetFilename ();
-                       string extension = GetExtension ( sourceFile );
-                       if (extension == ".mc" || extension == ".MC" )
-                       {
-                               string dependency = ssprintf ( "$(%s_MCHEADERS)", m.name.c_str () );
-                               dependencies.push_back ( dependency );
-                       }
-               }
+               dependencies.push_back ( "$(ERRCODES_TARGET) $(ERRCODES_MCHEADERS)" );
+               dependencies.push_back ( "$(BUGCODES_TARGET) $(BUGCODES_MCHEADERS)" );
+               dependencies.push_back ( "$(NTSTATUS_TARGET) $(NTSTATUS_MCHEADERS)" );
        }
+
+       ///* Check if any dependent library relies on the generated headers */
+       //for ( size_t i = 0; i < module.project.modules.size (); i++ )
+       //{
+       //      const Module& m = *module.project.modules[i];
+       //      for ( size_t j = 0; j < m.non_if_data.compilationUnits.size (); j++ )
+       //      {
+       //              CompilationUnit& compilationUnit = *m.non_if_data.compilationUnits[j];
+       //              const FileLocation& sourceFile = compilationUnit.GetFilename ();
+       //              string extension = GetExtension ( sourceFile );
+       //              if (extension == ".mc" || extension == ".MC" )
+       //              {
+       //                      string dependency = ssprintf ( "$(%s_MCHEADERS)", m.name.c_str () );
+       //                      dependencies.push_back ( dependency );
+       //              }
+       //      }
+       //}
 }
 
 void
 MingwModuleHandler::GeneratePreconditionDependencies ()
 {
        string preconditionDependenciesName = GetPreconditionDependenciesName ();
-       vector<FileLocation> sourceFilenames;
-       GetSourceFilenamesWithoutGeneratedFiles ( sourceFilenames );
        string_list dependencies;
        GetDefaultDependencies ( dependencies );
        GetModuleDependencies ( dependencies );
@@ -2603,7 +2517,7 @@ MingwKernelModuleHandler::GenerateKernelModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s",
+               string linkerParameters = ssprintf ( "-subsystem=native -entry=%s -image-base=%s",
                                                     module.GetEntryPoint(!(Environment::GetArch() == "arm")).c_str (),
                                                     module.baseaddress.c_str () );
 
@@ -2726,7 +2640,7 @@ MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -shared",
+               string linkerParameters = ssprintf ( "-subsystem=native -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000 -shared",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -2775,7 +2689,7 @@ MingwKernelModeDriverModuleHandler::GenerateKernelModeDriverModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -shared",
+               string linkerParameters = ssprintf ( "-subsystem=native -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000 -shared",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -2823,7 +2737,7 @@ MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -shared",
+               string linkerParameters = ssprintf ( "-subsystem=native -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000 -shared",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -2871,7 +2785,7 @@ MingwNativeCUIModuleHandler::GenerateNativeCUIModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,native -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib",
+               string linkerParameters = ssprintf ( "-subsystem=native -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -2921,7 +2835,7 @@ MingwAddImplicitLibraries( Module &module )
          && module.type != Win32OCX
          && module.type != Win32CUI
          && module.type != Win32GUI
-         && module.type != Win32SCR )
+         && module.type != Win32SCR)
        {
                // no implicit libraries
                return;
@@ -2996,7 +2910,7 @@ MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -shared",
+               string linkerParameters = ssprintf ( "-subsystem=console -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000 -shared",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -3038,7 +2952,7 @@ MingwWin32OCXModuleHandler::GenerateWin32OCXModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -shared",
+               string linkerParameters = ssprintf ( "-subsystem=console -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000 -shared",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -3087,7 +3001,7 @@ MingwWin32CUIModuleHandler::GenerateWin32CUIModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",
+               string linkerParameters = ssprintf ( "-subsystem=console -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -3136,7 +3050,7 @@ MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,windows -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",
+               string linkerParameters = ssprintf ( "-subsystem=windows -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -3479,10 +3393,16 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ()
                vSourceFiles.push_back ( srcunattend );
 
        // bootsector
-       const Module* bootModule;
-       bootModule = module.project.LocateModule ( module.type == IsoRegTest
-                                                      ? "isobtrt"
-                                                      : "isoboot" );
+       const Module* bootModule = module.bootSector->bootSectorModule;
+
+       if (!bootModule)
+       {
+               throw InvalidOperationException ( module.node.location.c_str(),
+                                                                                 0,
+                                                                                 "Invalid bootsector. module '%s' requires <bootsector>",
+                                                                                 module.name.c_str ());
+       }
+
        const FileLocation *isoboot = bootModule->output;
        vSourceFiles.push_back ( *isoboot );
 
@@ -3496,13 +3416,11 @@ MingwIsoModuleHandler::GenerateIsoModuleTarget ()
 
        vSourceFiles.push_back ( reactosDff );
 
-       string IsoName;
-
-       if (module.type == IsoRegTest)
-               IsoName = "ReactOS-RegTest.iso";
-       else
-               IsoName = "ReactOS.iso";
-
+       /* 
+               We use only the name and not full FileLocation(ouput) because Iso/LiveIso are an exception to the general rule.
+               Iso/LiveIso outputs are generated in code base root 
+       */
+       string IsoName = module.output->name;
 
        string sourceFiles = v2s ( backend, vSourceFiles, 5 );
 
@@ -3666,15 +3584,24 @@ MingwLiveIsoModuleHandler::GenerateLiveIsoModuleTarget ()
 
        string IsoName;
 
-       const Module* bootModule;
-       bootModule = module.project.LocateModule ( module.name == "livecdregtest"
-                                                      ? "isobtrt"
-                                                      : "isoboot" );
+       // bootsector
+       const Module* bootModule = module.bootSector->bootSectorModule;
+
+       if (!bootModule)
+       {
+               throw InvalidOperationException ( module.node.location.c_str(),
+                                                                                 0,
+                                                                                 "Invalid bootsector. module '%s' requires <bootsector>",
+                                                                                 module.name.c_str ());
+       }
+
        const FileLocation *isoboot = bootModule->output;
-       if (module.name == "livecdregtest")
-               IsoName = "ReactOS-LiveCD-RegTest.iso";
-       else
-               IsoName = "ReactOS-LiveCD.iso";
+
+       /* 
+               We use only the name and not full FileLocation(ouput) because Iso/LiveIso are an exception to the general rule.
+               Iso/LiveIso outputs are generated in code base root 
+       */
+       IsoName = module.output->name;
 
        string reactosDirectory = "reactos";
        string livecdReactosNoFixup = livecdDirectory + sSep + reactosDirectory;
@@ -3745,7 +3672,7 @@ MingwTestModuleHandler::GenerateTestModuleTarget ()
 
                string dependencies = linkDepsMacro + " " + objectsMacro;
 
-               string linkerParameters = ssprintf ( "-Wl,--subsystem,console -Wl,--entry,%s -Wl,--image-base,%s -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000",
+               string linkerParameters = ssprintf ( "-subsystem=console -entry=%s -image-base=%s -file-alignment=0x1000 -section-alignment=0x1000",
                                                     module.GetEntryPoint(true).c_str (),
                                                     module.baseaddress.c_str () );
                GenerateLinkerCommand ( dependencies,
@@ -3813,6 +3740,19 @@ MingwAliasModuleHandler::Process ()
 {
 }
 
+MingwMessageHeaderModuleHandler::MingwMessageHeaderModuleHandler (
+       const Module& module_ )
+
+       : MingwModuleHandler ( module_ )
+{
+}
+
+void
+MingwMessageHeaderModuleHandler::Process ()
+{
+       GenerateRules ();
+}
+
 MingwIdlHeaderModuleHandler::MingwIdlHeaderModuleHandler (
        const Module& module_ )