diff --git a/reactos/ReactOS.xml b/reactos/ReactOS.xml
index 6a77afb6e5d..ef56c663f06 100644
--- a/reactos/ReactOS.xml
+++ b/reactos/ReactOS.xml
@@ -21,6 +21,9 @@
w32api/include
w32api/include/ddk
+
+
+
diff --git a/reactos/boot/boot.xml b/reactos/boot/boot.xml
new file mode 100644
index 00000000000..2bc1b6eb151
--- /dev/null
+++ b/reactos/boot/boot.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/reactos/boot/freeldr/freeldr.xml b/reactos/boot/freeldr/freeldr.xml
new file mode 100644
index 00000000000..aee76461b4c
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
diff --git a/reactos/boot/freeldr/freeldr/freeldr.xml b/reactos/boot/freeldr/freeldr/freeldr.xml
new file mode 100644
index 00000000000..563d99db7f0
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr/freeldr.xml
@@ -0,0 +1,6 @@
+
+ freeldr_startup
+ freeldr_base64k
+ freeldr_base
+ freeldr_main
+
diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.xml b/reactos/boot/freeldr/freeldr/freeldr_base.xml
new file mode 100644
index 00000000000..6b86cc4d051
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr/freeldr_base.xml
@@ -0,0 +1,107 @@
+
+ include
+ -nostdlib
+ -nostdinc
+ -ffreestanding
+ -fno-builtin
+ -fno-inline
+ -fno-zero-initialized-in-bss
+ -Os
+
+
+
+ _alloca.S
+ archmach.c
+ hardware.c
+ hwacpi.c
+ hwapm.c
+ hwcpu.c
+ hwpci.c
+ i386disk.c
+ i386rtl.c
+ i386vid.c
+ machpc.c
+ machxbox.c
+ pccons.c
+ pcdisk.c
+ pcmem.c
+ pcrtc.c
+ pcvideo.c
+ portio.c
+ xboxcons.c
+ xboxdisk.c
+ xboxfont.c
+ xboxhw.c
+ xboxmem.c
+ xboxrtc.c
+ xboxvideo.c
+
+
+
+
+ blocklist.c
+ cache.c
+
+
+ rs232.c
+
+
+ disk.c
+ partition.c
+
+
+ ext2.c
+ fat.c
+ fs.c
+ fsrec.c
+ iso.c
+ ntfs.c
+
+
+ ini_init.c
+ inifile.c
+ parse.c
+
+
+ libgcc2.c
+
+
+ meminit.c
+ mm.c
+
+
+ arcname.c
+ binhive.c
+ reactos.c
+ registry.c
+
+
+ list.c
+ memcmp.c
+ memcpy.c
+ memmove.c
+ memset.c
+ print.c
+ stdlib.c
+ string.c
+
+
+ gui.c
+ tui.c
+ tuimenu.c
+ ui.c
+
+
+ bank.c
+ fade.c
+ palette.c
+ pixel.c
+ video.c
+
+ freeldr.c
+ debug.c
+ multiboot.c
+ version.c
+ cmdline.c
+ machine.c
+
diff --git a/reactos/boot/freeldr/freeldr/freeldr_base64k.xml b/reactos/boot/freeldr/freeldr/freeldr_base64k.xml
new file mode 100644
index 00000000000..d783e49a05a
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr/freeldr_base64k.xml
@@ -0,0 +1,25 @@
+
+ include
+ -nostdlib
+ -nostdinc
+ -ffreestanding
+ -fno-builtin
+ -fno-inline
+ -fno-zero-initialized-in-bss
+ -Os
+
+
+
+ boot.S
+ drvmap.S
+ i386cpu.S
+ i386idt.S
+ i386pnp.S
+ i386trap.S
+ int386.S
+ linux.S
+ mb.S
+
+
+
+
diff --git a/reactos/boot/freeldr/freeldr/freeldr_main.xml b/reactos/boot/freeldr/freeldr/freeldr_main.xml
new file mode 100644
index 00000000000..9c8dd4cc129
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr/freeldr_main.xml
@@ -0,0 +1,20 @@
+
+ include
+ -nostdlib
+ -nostdinc
+ -ffreestanding
+ -fno-builtin
+ -fno-inline
+ -fno-zero-initialized-in-bss
+ -Os
+
+ inffile.c
+
+ bootmgr.c
+ drivemap.c
+ miscboot.c
+ options.c
+ linuxboot.c
+ oslist.c
+ custom.c
+
diff --git a/reactos/boot/freeldr/freeldr/freeldr_startup.xml b/reactos/boot/freeldr/freeldr/freeldr_startup.xml
new file mode 100644
index 00000000000..238d487f537
--- /dev/null
+++ b/reactos/boot/freeldr/freeldr/freeldr_startup.xml
@@ -0,0 +1,17 @@
+
+ include
+ -nostdlib
+ -nostdinc
+ -ffreestanding
+ -fno-builtin
+ -fno-inline
+ -fno-zero-initialized-in-bss
+
+
+
+ fathelp.asm
+ arch.S
+
+
+
+
diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp
index e9c9308cf89..33036ad8ca2 100644
--- a/reactos/tools/rbuild/backend/mingw/mingw.cpp
+++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp
@@ -162,22 +162,26 @@ MingwBackend::GenerateGlobalVariables ()
{
#ifdef WIN32
fprintf ( fMakefile, "host_gcc = gcc\n" );
- fprintf ( fMakefile, "host_ar = ar\n" );
fprintf ( fMakefile, "host_ld = ld\n" );
+ fprintf ( fMakefile, "host_ar = ar\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_ar = ar\n" );
fprintf ( fMakefile, "host_ld = ld\n" );
+ fprintf ( fMakefile, "host_ar = ar\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 @@ MingwBackend::GenerateAllTarget ()
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" );
}
diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
index d750157821d..83bc666fe15 100644
--- a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
+++ b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
@@ -145,13 +145,19 @@ MingwModuleHandler::IsGeneratedFile ( const File& file ) const
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 @@ MingwModuleHandler::GetImportLibraryDependencies ( const Module& module ) const
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;
}
@@ -378,6 +384,20 @@ MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const
}
+string
+MingwModuleHandler::GenerateCompilerParametersFromVector ( const vector& 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& linkerFlags ) const
{
@@ -402,7 +422,8 @@ void
MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
const string& macro,
const vector& includes,
- const vector& defines ) const
+ const vector& defines,
+ const vector* compilerFlags ) const
{
size_t i;
@@ -411,6 +432,19 @@ MingwModuleHandler::GenerateMacro ( const char* assignmentOperation,
"%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 @@ MingwModuleHandler::GenerateMacros (
const vector& files,
const vector& includes,
const vector& defines,
+ const vector* compilerFlags,
const vector* linkerFlags,
const vector& ifs,
const string& cflags_macro,
@@ -455,11 +490,13 @@ MingwModuleHandler::GenerateMacros (
GenerateMacro ( assignmentOperation,
cflags_macro,
includes,
- defines );
+ defines,
+ compilerFlags );
GenerateMacro ( assignmentOperation,
windresflags_macro,
includes,
- defines );
+ defines,
+ compilerFlags );
}
if ( linkerFlags != NULL )
@@ -527,6 +564,7 @@ MingwModuleHandler::GenerateMacros (
rIf.includes,
rIf.defines,
NULL,
+ NULL,
rIf.ifs,
cflags_macro,
nasmflags_macro,
@@ -554,6 +592,7 @@ MingwModuleHandler::GenerateMacros (
module.files,
module.includes,
module.defines,
+ &module.compilerFlags,
&module.linkerFlags,
module.ifs,
cflags_macro,
@@ -1225,6 +1264,7 @@ MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module& modul
archiveFilename.c_str () );
}
+
static MingwKernelModuleHandler kernelmodule_handler;
MingwKernelModuleHandler::MingwKernelModuleHandler ()
@@ -1318,6 +1358,28 @@ MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Modul
}
+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 @@ MingwWin32GUIModuleHandler::GenerateWin32GUIModuleTarget ( const Module& module
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 () );
+}
diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.h b/reactos/tools/rbuild/backend/mingw/modulehandler.h
index 93c7d3a00d1..591b3adc074 100644
--- a/reactos/tools/rbuild/backend/mingw/modulehandler.h
+++ b/reactos/tools/rbuild/backend/mingw/modulehandler.h
@@ -29,6 +29,7 @@ protected:
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 @@ private:
std::string GenerateGccDefineParametersFromVector ( const std::vector& defines ) const;
std::string GenerateGccDefineParameters ( const Module& module ) const;
std::string GenerateGccIncludeParametersFromVector ( const std::vector& includes ) const;
+ std::string GenerateCompilerParametersFromVector ( const std::vector& compilerFlags ) const;
std::string GenerateLinkerParametersFromVector ( const std::vector& linkerFlags ) const;
std::string GenerateLinkerParameters ( const Module& module ) const;
void GenerateMacro ( const char* assignmentOperation,
const std::string& macro,
const std::vector& includes,
- const std::vector& defines ) const;
+ const std::vector& defines,
+ const std::vector* compilerFlags ) const;
void GenerateMacros ( const char* op,
const std::vector& files,
const std::vector& includes,
const std::vector& defines,
+ const std::vector* compilerFlags,
const std::vector* linkerFlags,
const std::vector& ifs,
const std::string& cflags_macro,
@@ -170,6 +174,16 @@ private:
};
+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 @@ private:
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 */
diff --git a/reactos/tools/rbuild/compilerflag.cpp b/reactos/tools/rbuild/compilerflag.cpp
new file mode 100644
index 00000000000..2a2f051346d
--- /dev/null
+++ b/reactos/tools/rbuild/compilerflag.cpp
@@ -0,0 +1,47 @@
+#include "pch.h"
+#include
+
+#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,
+ " is empty." );
+ }
+ flag = node.value;
+}
diff --git a/reactos/tools/rbuild/makefile b/reactos/tools/rbuild/makefile
index ff1d057df9d..db6c83eaf74 100644
--- a/reactos/tools/rbuild/makefile
+++ b/reactos/tools/rbuild/makefile
@@ -17,6 +17,7 @@ BACKEND_BASE_OBJECTS = \
BASE_OBJECTS = \
$(BACKEND_BASE_OBJECTS) \
+ compilerflag.o \
define.o \
exception.o \
include.o \
diff --git a/reactos/tools/rbuild/module.cpp b/reactos/tools/rbuild/module.cpp
index 301180ca9ae..fdd1b9c637d 100644
--- a/reactos/tools/rbuild/module.cpp
+++ b/reactos/tools/rbuild/module.cpp
@@ -1,5 +1,3 @@
-// module.cpp
-
#include "pch.h"
#include
@@ -74,6 +72,8 @@ Module::~Module ()
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 @@ Module::ProcessXML()
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 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
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 @@ Module::GetModuleType ( const string& location, const XMLAttribute& attribute )
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 @@ Module::GetModuleType ( const string& location, const XMLAttribute& attribute )
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 @@ Module::GetDefaultModuleExtension () const
return EXEPOSTFIX;
case StaticLibrary:
return ".a";
+ case ObjectLibrary:
+ return ".o";
case Kernel:
case Win32GUI:
return ".exe";
@@ -264,6 +277,7 @@ Module::GetDefaultModuleExtension () const
case Win32DLL:
return ".dll";
case KernelModeDriver:
+ case BootLoader:
return ".sys";
}
throw InvalidOperationException ( __FILE__,
diff --git a/reactos/tools/rbuild/rbuild.h b/reactos/tools/rbuild/rbuild.h
index 176d0d1350c..e06baf73576 100644
--- a/reactos/tools/rbuild/rbuild.h
+++ b/reactos/tools/rbuild/rbuild.h
@@ -32,6 +32,7 @@ class InvokeFile;
class Dependency;
class ImportLibrary;
class If;
+class CompilerFlag;
class LinkerFlag;
class Property;
@@ -71,12 +72,14 @@ enum ModuleType
{
BuildTool,
StaticLibrary,
+ ObjectLibrary,
Kernel,
KernelModeDLL,
KernelModeDriver,
NativeDLL,
Win32DLL,
- Win32GUI
+ Win32GUI,
+ BootLoader
};
@@ -97,6 +100,7 @@ public:
std::vector invocations;
std::vector dependencies;
std::vector ifs;
+ std::vector compilerFlags;
std::vector linkerFlags;
Module ( const Project& project,
@@ -277,6 +281,26 @@ public:
};
+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: