From: Casper Hornstrup Date: Sat, 22 Jan 2005 14:07:45 +0000 (+0000) Subject: * Build freeldr X-Git-Tag: backups/xmlbuildsystem@15601~261 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=87f69aaf3232cfe9f1d3c4edf0255a6a2d5e97ea * Build freeldr * Add BootLoader and ObjectLibrary module types * Add tag svn path=/branches/xmlbuildsystem/; revision=13211 --- 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: