* Build freeldr
* Add BootLoader and ObjectLibrary module types
* Add <compilerflag> tag
Modified: branches/xmlbuildsystem/reactos/ReactOS.xml
Added: branches/xmlbuildsystem/reactos/boot/boot.xml
Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr.xml
Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base.xml
Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base64k.xml
Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_main.xml
Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_startup.xml
Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr.xml
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h
Added: branches/xmlbuildsystem/reactos/tools/rbuild/compilerflag.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/makefile
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h

Modified: branches/xmlbuildsystem/reactos/ReactOS.xml
--- branches/xmlbuildsystem/reactos/ReactOS.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/ReactOS.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -21,6 +21,9 @@
 	<include>w32api/include</include>
 	<include>w32api/include/ddk</include>
 
+	<directory name="boot">
+		<xi:include href="boot/boot.xml" />
+	</directory>
 	<directory name="drivers">
 		<xi:include href="drivers/directory.xml" />
 	</directory>

Added: branches/xmlbuildsystem/reactos/boot/boot.xml
--- branches/xmlbuildsystem/reactos/boot/boot.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/boot.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,3 @@
+<directory name="freeldr">
+	<xi:include href="freeldr/freeldr.xml" />
+</directory>

Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr.xml
--- branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,6 @@
+<module name="freeldr" type="bootloader">
+	<library>freeldr_startup</library>
+	<library>freeldr_base64k</library>
+	<library>freeldr_base</library>
+	<library>freeldr_main</library>
+</module>

Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base.xml
--- branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,107 @@
+<module name="freeldr_base" type="objectlibrary">
+	<include base="freeldr_base">include</include>
+	<compilerflag>-nostdlib</compilerflag>
+	<compilerflag>-nostdinc</compilerflag>
+	<compilerflag>-ffreestanding</compilerflag>
+	<compilerflag>-fno-builtin</compilerflag>
+	<compilerflag>-fno-inline</compilerflag>
+	<compilerflag>-fno-zero-initialized-in-bss</compilerflag>
+	<compilerflag>-Os</compilerflag>
+	<directory name="arch">
+		<if property="ARCH" value="i386">
+			<directory name="i386">
+				<file>_alloca.S</file>
+				<file>archmach.c</file>
+				<file>hardware.c</file>
+				<file>hwacpi.c</file>
+				<file>hwapm.c</file>
+				<file>hwcpu.c</file>
+				<file>hwpci.c</file>
+				<file>i386disk.c</file>
+				<file>i386rtl.c</file>
+				<file>i386vid.c</file>
+				<file>machpc.c</file>
+				<file>machxbox.c</file>
+				<file>pccons.c</file>
+				<file>pcdisk.c</file>
+				<file>pcmem.c</file>
+				<file>pcrtc.c</file>
+				<file>pcvideo.c</file>
+				<file>portio.c</file>
+				<file>xboxcons.c</file>
+				<file>xboxdisk.c</file>
+				<file>xboxfont.c</file>
+				<file>xboxhw.c</file>
+				<file>xboxmem.c</file>
+				<file>xboxrtc.c</file>
+				<file>xboxvideo.c</file>
+			</directory>
+		</if>
+	</directory>
+	<directory name="cache">
+		<file>blocklist.c</file>
+		<file>cache.c</file>
+	</directory>
+	<directory name="comm">
+		<file>rs232.c</file>
+	</directory>
+	<directory name="disk">
+		<file>disk.c</file>
+		<file>partition.c</file>
+	</directory>
+	<directory name="fs">
+		<file>ext2.c</file>
+		<file>fat.c</file>
+		<file>fs.c</file>
+		<file>fsrec.c</file>
+		<file>iso.c</file>
+		<file>ntfs.c</file>
+	</directory>
+	<directory name="inifile">
+		<file>ini_init.c</file>
+		<file>inifile.c</file>
+		<file>parse.c</file>
+	</directory>
+	<directory name="math">
+		<file>libgcc2.c</file>
+	</directory>
+	<directory name="mm">
+		<file>meminit.c</file>
+		<file>mm.c</file>
+	</directory>
+	<directory name="reactos">
+		<file>arcname.c</file>
+		<file>binhive.c</file>
+		<file>reactos.c</file>
+		<file>registry.c</file>
+	</directory>
+	<directory name="rtl">
+		<file>list.c</file>
+		<file>memcmp.c</file>
+		<file>memcpy.c</file>
+		<file>memmove.c</file>
+		<file>memset.c</file>
+		<file>print.c</file>
+		<file>stdlib.c</file>
+		<file>string.c</file>
+	</directory>
+	<directory name="ui">
+		<file>gui.c</file>
+		<file>tui.c</file>
+		<file>tuimenu.c</file>
+		<file>ui.c</file>
+	</directory>
+	<directory name="video">
+		<file>bank.c</file>
+		<file>fade.c</file>
+		<file>palette.c</file>
+		<file>pixel.c</file>
+		<file>video.c</file>
+	</directory>
+	<file>freeldr.c</file>
+	<file>debug.c</file>
+	<file>multiboot.c</file>
+	<file>version.c</file>
+	<file>cmdline.c</file>
+	<file>machine.c</file>
+</module>

Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base64k.xml
--- branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base64k.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_base64k.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,25 @@
+<module name="freeldr_base64k" type="objectlibrary">
+	<include base="freeldr_base64k">include</include>
+	<compilerflag>-nostdlib</compilerflag>
+	<compilerflag>-nostdinc</compilerflag>
+	<compilerflag>-ffreestanding</compilerflag>
+	<compilerflag>-fno-builtin</compilerflag>
+	<compilerflag>-fno-inline</compilerflag>
+	<compilerflag>-fno-zero-initialized-in-bss</compilerflag>
+	<compilerflag>-Os</compilerflag>
+	<directory name="arch">
+		<if property="ARCH" value="i386">
+			<directory name="i386">
+				<file>boot.S</file>
+				<file>drvmap.S</file>
+				<file>i386cpu.S</file>
+				<file>i386idt.S</file>
+				<file>i386pnp.S</file>
+				<file>i386trap.S</file>
+				<file>int386.S</file>
+				<file>linux.S</file>
+				<file>mb.S</file>
+			</directory>
+		</if>
+	</directory>
+</module>

Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_main.xml
--- branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_main.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_main.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,20 @@
+<module name="freeldr_main" type="objectlibrary">
+	<include base="freeldr_main">include</include>
+	<compilerflag>-nostdlib</compilerflag>
+	<compilerflag>-nostdinc</compilerflag>
+	<compilerflag>-ffreestanding</compilerflag>
+	<compilerflag>-fno-builtin</compilerflag>
+	<compilerflag>-fno-inline</compilerflag>
+	<compilerflag>-fno-zero-initialized-in-bss</compilerflag>
+	<compilerflag>-Os</compilerflag>
+	<directory name="inffile">
+		<file>inffile.c</file>
+	</directory>
+	<file>bootmgr.c</file>
+	<file>drivemap.c</file>
+	<file>miscboot.c</file>
+	<file>options.c</file>
+	<file>linuxboot.c</file>
+	<file>oslist.c</file>
+	<file>custom.c</file>
+</module>

Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_startup.xml
--- branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_startup.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/freeldr/freeldr/freeldr_startup.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,17 @@
+<module name="freeldr_startup" type="objectlibrary">
+	<include base="freeldr_startup">include</include>
+	<compilerflag>-nostdlib</compilerflag>
+	<compilerflag>-nostdinc</compilerflag>
+	<compilerflag>-ffreestanding</compilerflag>
+	<compilerflag>-fno-builtin</compilerflag>
+	<compilerflag>-fno-inline</compilerflag>
+	<compilerflag>-fno-zero-initialized-in-bss</compilerflag>
+	<directory name="arch">
+		<if property="ARCH" value="i386">
+			<directory name="i386">
+				<file first="true">fathelp.asm</file>
+				<file>arch.S</file>
+			</directory>
+		</if>
+	</directory>
+</module>

Added: branches/xmlbuildsystem/reactos/boot/freeldr/freeldr.xml
--- branches/xmlbuildsystem/reactos/boot/freeldr/freeldr.xml	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/boot/freeldr/freeldr.xml	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,25 @@
+<!--<module name="bootsector" type="bootsector">
+	<include base="bootsector">freeldr/include</include>
+	<compilerflag>-nostdlib</compilerflag>
+	<compilerflag>-nostdinc</compilerflag>
+	<compilerflag>-ffreestanding</compilerflag>
+	<compilerflag>-no-builtin</compilerflag>
+	<compilerflag>-no-inline</compilerflag>
+	<compilerflag>-no-zero-initialized-in-bss</compilerflag>
+	<directory name="bootsect">
+		<file>dosmbr.asm</file>
+		<file>ext2.asm</file>
+		<file>fat32.asm</file>
+		<file>fat.asm</file>
+		<file>isoboot.asm</file>
+		<file>win2k.asm</file>
+		<file>wxpfat16.asm</file>
+	</directory>
+</module>-->
+<directory name="freeldr">
+	<xi:include href="freeldr/freeldr_startup.xml" />
+	<xi:include href="freeldr/freeldr_base64k.xml" />
+	<xi:include href="freeldr/freeldr_base.xml" />
+	<xi:include href="freeldr/freeldr_main.xml" />
+	<xi:include href="freeldr/freeldr.xml" />
+</directory>

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-01-22 14:07:45 UTC (rev 13211)
@@ -162,22 +162,26 @@
 {
 #ifdef WIN32
 	fprintf ( fMakefile, "host_gcc = gcc\n" );
+	fprintf ( fMakefile, "host_ld = ld\n" );
 	fprintf ( fMakefile, "host_ar = ar\n" );
-	fprintf ( fMakefile, "host_ld = ld\n" );
+	fprintf ( fMakefile, "host_objcopy = objcopy\n" );
 	fprintf ( fMakefile, "rm = del /f /q\n" );
 	fprintf ( fMakefile, "gcc = gcc\n" );
 	fprintf ( fMakefile, "ld = ld\n" );
 	fprintf ( fMakefile, "ar = ar\n" );
+	fprintf ( fMakefile, "objcopy = objcopy\n" );
 	fprintf ( fMakefile, "dlltool = dlltool\n" );
 	fprintf ( fMakefile, "windres = windres\n" );
 #else
 	fprintf ( fMakefile, "host_gcc = gcc\n" );
+	fprintf ( fMakefile, "host_ld = ld\n" );
 	fprintf ( fMakefile, "host_ar = ar\n" );
-	fprintf ( fMakefile, "host_ld = ld\n" );
+	fprintf ( fMakefile, "host_objcopy = objcopy\n" );
 	fprintf ( fMakefile, "rm = rm -f\n" );
 	fprintf ( fMakefile, "gcc = mingw32-gcc\n" );
 	fprintf ( fMakefile, "ld = mingw32-ld\n" );
 	fprintf ( fMakefile, "ar = mingw32-ar\n" );
+	fprintf ( fMakefile, "objcopy = mingw32-objcopy\n" );
 	fprintf ( fMakefile, "dlltool = mingw32-dlltool\n" );
 	fprintf ( fMakefile, "windres = mingw32-windres\n" );
 #endif
@@ -207,9 +211,12 @@
 	for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
 	{
 		Module& module = *ProjectNode.modules[i];
-		fprintf ( fMakefile,
-		          " %s",
-		          FixupTargetFilename ( module.GetPath () ).c_str () );
+		if ( module.type != ObjectLibrary )
+		{
+			fprintf ( fMakefile,
+			          " %s",
+			          FixupTargetFilename ( module.GetPath () ).c_str () );
+		}
 	}
 	fprintf ( fMakefile, "\n\t\n\n" );
 }

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-01-22 14:07:45 UTC (rev 13211)
@@ -145,13 +145,19 @@
 	else
 		return false;
 }
-	
+
 string
+MingwModuleHandler::GetImportLibraryDependency ( const Module& importedModule ) const
+{
+	if ( importedModule.type == ObjectLibrary )
+		return GetObjectsMacro ( importedModule );
+	else
+		return PassThruCacheDirectory ( FixupTargetFilename ( importedModule.GetDependencyPath () ) );
+}
+
+string
 MingwModuleHandler::GetImportLibraryDependencies ( const Module& module ) const
 {
-	if ( module.libraries.size () == 0 )
-		return "";
-	
 	string dependencies ( "" );
 	for ( size_t i = 0; i < module.libraries.size (); i++ )
 	{
@@ -159,7 +165,7 @@
 			dependencies += " ";
 		const Module* importedModule = module.project.LocateModule ( module.libraries[i]->name );
 		assert ( importedModule != NULL );
-		dependencies += PassThruCacheDirectory ( FixupTargetFilename ( importedModule->GetDependencyPath () ) ).c_str ();
+		dependencies += GetImportLibraryDependency ( *importedModule );
 	}
 	return dependencies;
 }
@@ -379,6 +385,20 @@
 
 
 string
+MingwModuleHandler::GenerateCompilerParametersFromVector ( const vector<CompilerFlag*>& compilerFlags ) const
+{
+	string parameters;
+	for ( size_t i = 0; i < compilerFlags.size (); i++ )
+	{
+		CompilerFlag& compilerFlag = *compilerFlags[i];
+		if ( parameters.length () > 0 )
+			parameters += " ";
+		parameters += compilerFlag.flag;
+	}
+	return parameters;
+}
+
+string
 MingwModuleHandler::GenerateLinkerParametersFromVector ( const vector<LinkerFlag*>& linkerFlags ) const
 {
 	string parameters;
@@ -402,7 +422,8 @@
 MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
                                     const string& macro,
                                     const vector<Include*>& includes,
-                                    const vector<Define*>& defines ) const
+                                    const vector<Define*>& defines,
+                                    const vector<CompilerFlag*>* compilerFlags ) const
 {
 	size_t i;
 
@@ -411,6 +432,19 @@
 		"%s %s",
 		macro.c_str(),
 		assignmentOperation );
+	
+	if ( compilerFlags != NULL )
+	{
+		string compilerParameters = GenerateCompilerParametersFromVector ( *compilerFlags );
+		if ( compilerParameters.size () > 0 )
+		{
+			fprintf (
+				fMakefile,
+				" %s",
+				compilerParameters.c_str () );
+		}
+	}
+
 	for ( i = 0; i < includes.size(); i++ )
 	{
 		fprintf (
@@ -440,6 +474,7 @@
 	const vector<File*>& files,
 	const vector<Include*>& includes,
 	const vector<Define*>& defines,
+	const vector<CompilerFlag*>* compilerFlags,
 	const vector<LinkerFlag*>* linkerFlags,
 	const vector<If*>& ifs,
 	const string& cflags_macro,
@@ -455,11 +490,13 @@
 		GenerateMacro ( assignmentOperation,
 		                cflags_macro,
 		                includes,
-		                defines );
+		                defines,
+		                compilerFlags );
 		GenerateMacro ( assignmentOperation,
 		                windresflags_macro,
 		                includes,
-		                defines );
+		                defines,
+		                compilerFlags );
 	}
 	
 	if ( linkerFlags != NULL )
@@ -527,6 +564,7 @@
 				rIf.includes,
 				rIf.defines,
 				NULL,
+				NULL,
 				rIf.ifs,
 				cflags_macro,
 				nasmflags_macro,
@@ -554,6 +592,7 @@
 		module.files,
 		module.includes,
 		module.defines,
+		&module.compilerFlags,
 		&module.linkerFlags,
 		module.ifs,
 		cflags_macro,
@@ -1225,6 +1264,7 @@
 	          archiveFilename.c_str () );
 }
 
+
 static MingwKernelModuleHandler kernelmodule_handler;
 
 MingwKernelModuleHandler::MingwKernelModuleHandler ()
@@ -1318,6 +1358,28 @@
 }
 
 
+static MingwObjectLibraryModuleHandler objectlibrary_handler;
+
+MingwObjectLibraryModuleHandler::MingwObjectLibraryModuleHandler ()
+	: MingwModuleHandler ( ObjectLibrary )
+{
+}
+
+void
+MingwObjectLibraryModuleHandler::Process ( const Module& module )
+{
+	GeneratePreconditionDependencies ( module );
+	GenerateObjectLibraryModuleTarget ( module );
+	GenerateInvocations ( module );
+}
+
+void
+MingwObjectLibraryModuleHandler::GenerateObjectLibraryModuleTarget ( const Module& module )
+{
+	GenerateMacrosAndTargetsTarget ( module );
+}
+
+
 static MingwKernelModeDLLModuleHandler kernelmodedll_handler;
 
 MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()
@@ -1607,3 +1669,52 @@
 		          target.c_str ());
 	}
 }
+
+
+static MingwBootLoaderModuleHandler bootloadermodule_handler;
+
+MingwBootLoaderModuleHandler::MingwBootLoaderModuleHandler ()
+	: MingwModuleHandler ( BootLoader )
+{
+}
+
+void
+MingwBootLoaderModuleHandler::Process ( const Module& module )
+{
+	GeneratePreconditionDependencies ( module );
+	GenerateBootLoaderModuleTarget ( module );
+	GenerateInvocations ( module );
+}
+
+void
+MingwBootLoaderModuleHandler::GenerateBootLoaderModuleTarget ( const Module& module )
+{
+	static string ros_junk ( "$(ROS_TEMPORARY)" );
+	string targetName ( module.GetTargetName () );
+	string target ( FixupTargetFilename (module.GetPath ()) );
+	string workingDirectory = GetWorkingDirectory ();
+	string junk_tmp = ros_junk + module.name + ".junk.tmp";
+	string objectsMacro = GetObjectsMacro ( module );
+	string importLibraryDependencies = GetImportLibraryDependencies ( module );
+
+	GenerateMacrosAndTargetsTarget ( module );
+
+	fprintf ( fMakefile, "%s: %s %s\n",
+	          target.c_str (),
+	          objectsMacro.c_str (),
+	          importLibraryDependencies.c_str () );
+
+	fprintf ( fMakefile,
+	          "\t${ld} %s -N -Ttext=0x8000 -o %s %s %s\n",
+	          GetLinkerMacro ( module ).c_str (),
+	          junk_tmp.c_str (),
+	          objectsMacro.c_str (),
+	          importLibraryDependencies.c_str () );
+	fprintf ( fMakefile,
+	          "\t${objcopy} -O binary %s %s\n",
+	          junk_tmp.c_str (),
+	          target.c_str () );
+	fprintf ( fMakefile,
+	          "\t${rm} %s\n",
+	          junk_tmp.c_str () );
+}

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.h	2005-01-22 14:07:45 UTC (rev 13211)
@@ -29,6 +29,7 @@
 	std::string GetActualSourceFilename ( const std::string& filename ) const;
 	std::string GetModuleArchiveFilename ( const Module& module ) const;
 	bool IsGeneratedFile ( const File& file ) const;
+	std::string GetImportLibraryDependency ( const Module& importedModule ) const;
 	std::string GetImportLibraryDependencies ( const Module& module ) const;
 	std::string GetModuleDependencies ( const Module& module ) const;
 	std::string GetAllDependencies ( const Module& module ) const;
@@ -65,16 +66,19 @@
 	std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines ) const;
 	std::string GenerateGccDefineParameters ( const Module& module ) const;
 	std::string GenerateGccIncludeParametersFromVector ( const std::vector<Include*>& includes ) const;
+	std::string GenerateCompilerParametersFromVector ( const std::vector<CompilerFlag*>& compilerFlags ) const;
 	std::string GenerateLinkerParametersFromVector ( const std::vector<LinkerFlag*>& linkerFlags ) const;
 	std::string GenerateLinkerParameters ( const Module& module ) const;
 	void GenerateMacro ( const char* assignmentOperation,
 	                     const std::string& macro,
 	                     const std::vector<Include*>& includes,
-	                     const std::vector<Define*>& defines ) const;
+	                     const std::vector<Define*>& defines,
+	                     const std::vector<CompilerFlag*>* compilerFlags ) const;
 	void GenerateMacros ( const char* op,
 	                      const std::vector<File*>& files,
 	                      const std::vector<Include*>& includes,
 	                      const std::vector<Define*>& defines,
+	                      const std::vector<CompilerFlag*>* compilerFlags,
 	                      const std::vector<LinkerFlag*>* linkerFlags,
 	                      const std::vector<If*>& ifs,
 	                      const std::string& cflags_macro,
@@ -170,6 +174,16 @@
 };
 
 
+class MingwObjectLibraryModuleHandler : public MingwModuleHandler
+{
+public:
+	MingwObjectLibraryModuleHandler ();
+	virtual void Process ( const Module& module );
+private:
+	void GenerateObjectLibraryModuleTarget ( const Module& module );
+};
+
+
 class MingwKernelModeDLLModuleHandler : public MingwModuleHandler
 {
 public:
@@ -220,4 +234,14 @@
 	void GenerateWin32GUIModuleTarget ( const Module& module );
 };
 
+
+class MingwBootLoaderModuleHandler : public MingwModuleHandler
+{
+public:
+	MingwBootLoaderModuleHandler ();
+	virtual void Process ( const Module& module );
+private:
+	void GenerateBootLoaderModuleTarget ( const Module& module );
+};
+
 #endif /* MINGW_MODULEHANDLER_H */

Added: branches/xmlbuildsystem/reactos/tools/rbuild/compilerflag.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/compilerflag.cpp	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/compilerflag.cpp	2005-01-22 14:07:45 UTC (rev 13211)
@@ -0,0 +1,47 @@
+#include "pch.h"
+#include <assert.h>
+
+#include "rbuild.h"
+
+using std::string;
+using std::vector;
+
+CompilerFlag::CompilerFlag ( const Project& project_,
+                             const XMLElement& compilerFlagNode )
+	: project(project_),
+	  module(NULL),
+	  node(compilerFlagNode)
+{
+	Initialize();
+}
+
+CompilerFlag::CompilerFlag ( const Project& project_,
+	                         const Module* module_,
+	                         const XMLElement& compilerFlagNode )
+	: project(project_),
+	  module(module_),
+	  node(compilerFlagNode)
+{
+	Initialize();
+}
+
+CompilerFlag::~CompilerFlag ()
+{
+}
+
+void
+CompilerFlag::Initialize ()
+{
+}
+
+void
+CompilerFlag::ProcessXML ()
+{
+	if (node.value.size () == 0)
+	{
+		throw InvalidBuildFileException (
+			node.location,
+			"<compilerflag> is empty." );
+	}
+	flag = node.value;
+}

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/makefile
--- branches/xmlbuildsystem/reactos/tools/rbuild/makefile	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/makefile	2005-01-22 14:07:45 UTC (rev 13211)
@@ -17,6 +17,7 @@
 
 BASE_OBJECTS = \
 	$(BACKEND_BASE_OBJECTS) \
+	compilerflag.o \
 	define.o \
 	exception.o \
 	include.o \

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp	2005-01-22 14:07:45 UTC (rev 13211)
@@ -1,5 +1,3 @@
-// module.cpp
-
 #include "pch.h"
 #include <assert.h>
 
@@ -74,6 +72,8 @@
 		delete dependencies[i];
 	for ( i = 0; i < ifs.size(); i++ )
 		delete ifs[i];
+	for ( i = 0; i < compilerFlags.size(); i++ )
+		delete compilerFlags[i];
 	for ( i = 0; i < linkerFlags.size(); i++ )
 		delete linkerFlags[i];
 }
@@ -98,6 +98,8 @@
 		dependencies[i]->ProcessXML ();
 	for ( i = 0; i < ifs.size(); i++ )
 		ifs[i]->ProcessXML();
+	for ( i = 0; i < compilerFlags.size(); i++ )
+		compilerFlags[i]->ProcessXML();
 	for ( i = 0; i < linkerFlags.size(); i++ )
 		linkerFlags[i]->ProcessXML();
 }
@@ -203,6 +205,11 @@
 			ifs.push_back ( pIf );
 		subs_invalid = false;
 	}
+	else if ( e.name == "compilerflag" )
+	{
+		compilerFlags.push_back ( new CompilerFlag ( project, this, e ) );
+		subs_invalid = true;
+	}
 	else if ( e.name == "linkerflag" )
 	{
 		linkerFlags.push_back ( new LinkerFlag ( project, this, e ) );
@@ -230,6 +237,8 @@
 		return BuildTool;
 	if ( attribute.value == "staticlibrary" )
 		return StaticLibrary;
+	if ( attribute.value == "objectlibrary" )
+		return ObjectLibrary;
 	if ( attribute.value == "kernel" )
 		return Kernel;
 	if ( attribute.value == "kernelmodedll" )
@@ -242,6 +251,8 @@
 		return Win32DLL;
 	if ( attribute.value == "win32gui" )
 		return Win32GUI;
+	if ( attribute.value == "bootloader" )
+		return BootLoader;
 	throw InvalidAttributeValueException ( location,
 	                                       attribute.name,
 	                                       attribute.value );
@@ -256,6 +267,8 @@
 			return EXEPOSTFIX;
 		case StaticLibrary:
 			return ".a";
+		case ObjectLibrary:
+			return ".o";
 		case Kernel:
 		case Win32GUI:
 			return ".exe";
@@ -264,6 +277,7 @@
 		case Win32DLL:
 			return ".dll";
 		case KernelModeDriver:
+		case BootLoader:
 			return ".sys";
 	}
 	throw InvalidOperationException ( __FILE__,

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h	2005-01-22 13:34:27 UTC (rev 13210)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h	2005-01-22 14:07:45 UTC (rev 13211)
@@ -32,6 +32,7 @@
 class Dependency;
 class ImportLibrary;
 class If;
+class CompilerFlag;
 class LinkerFlag;
 class Property;
 
@@ -71,12 +72,14 @@
 {
 	BuildTool,
 	StaticLibrary,
+	ObjectLibrary,
 	Kernel,
 	KernelModeDLL,
 	KernelModeDriver,
 	NativeDLL,
 	Win32DLL,
-	Win32GUI
+	Win32GUI,
+	BootLoader
 };
 
 
@@ -97,6 +100,7 @@
 	std::vector<Invoke*> invocations;
 	std::vector<Dependency*> dependencies;
 	std::vector<If*> ifs;
+	std::vector<CompilerFlag*> compilerFlags;
 	std::vector<LinkerFlag*> linkerFlags;
 
 	Module ( const Project& project,
@@ -277,6 +281,26 @@
 };
 
 
+class CompilerFlag
+{
+public:
+	const Project& project;
+	const Module* module;
+	const XMLElement& node;
+	std::string flag;
+
+	CompilerFlag ( const Project& project,
+	               const XMLElement& compilerFlagNode );
+	CompilerFlag ( const Project& project,
+	               const Module* module,
+	               const XMLElement& compilerFlagNode );
+	~CompilerFlag ();
+	void ProcessXML();
+private:
+	void Initialize();
+};
+
+
 class LinkerFlag
 {
 public: