From 49a2dd8017708c0087c70d290f755d125a342384 Mon Sep 17 00:00:00 2001 From: Casper Hornstrup Date: Fri, 7 Jan 2005 21:46:18 +0000 Subject: [PATCH] Include and define support. svn path=/branches/xmlbuildsystem/; revision=12876 --- reactos/ReactOS.xml | 3 + reactos/ntoskrnl/module.xml | 21 ++--- .../rbuild/backend/mingw/modulehandler.cpp | 80 ++++++++++++++++++- .../rbuild/backend/mingw/modulehandler.h | 6 ++ reactos/tools/rbuild/define.cpp | 44 ++++++++++ reactos/tools/rbuild/include.cpp | 39 +++++++++ reactos/tools/rbuild/makefile | 4 + reactos/tools/rbuild/module.cpp | 12 +++ reactos/tools/rbuild/project.cpp | 12 +++ reactos/tools/rbuild/rbuild.h | 52 +++++++++++- reactos/tools/rbuild/test.h | 14 ++++ reactos/tools/rbuild/tests/alltests.cpp | 2 + reactos/tools/rbuild/tests/data/define.xml | 9 +++ reactos/tools/rbuild/tests/data/include.xml | 9 +++ reactos/tools/rbuild/tests/definetest.cpp | 21 +++++ reactos/tools/rbuild/tests/includetest.cpp | 19 +++++ 16 files changed, 334 insertions(+), 13 deletions(-) create mode 100644 reactos/tools/rbuild/define.cpp create mode 100644 reactos/tools/rbuild/include.cpp create mode 100644 reactos/tools/rbuild/tests/data/define.xml create mode 100644 reactos/tools/rbuild/tests/data/include.xml create mode 100644 reactos/tools/rbuild/tests/definetest.cpp create mode 100644 reactos/tools/rbuild/tests/includetest.cpp diff --git a/reactos/ReactOS.xml b/reactos/ReactOS.xml index c5bde83b19a..dfe5b49835c 100644 --- a/reactos/ReactOS.xml +++ b/reactos/ReactOS.xml @@ -1,4 +1,7 @@ + + ./include + ./w32api/include depends.c diff --git a/reactos/ntoskrnl/module.xml b/reactos/ntoskrnl/module.xml index 60b93632d36..7832e755cbb 100644 --- a/reactos/ntoskrnl/module.xml +++ b/reactos/ntoskrnl/module.xml @@ -1,4 +1,9 @@ + + + + + . ./include ../lib/kjs/include kjs @@ -7,7 +12,6 @@ copy.c fs.c mdl.c - misc.c pin.c view.c @@ -35,8 +39,8 @@ kdb.c kdb_keyboard.c kdb_serial.c - profile.c rdebug.c + profile.c @@ -53,10 +57,10 @@ - user.c dbgctrl.c errinfo.c print.c + user.c @@ -100,10 +104,6 @@ util.c - - - - inbv.c @@ -177,8 +177,7 @@ i386-mcount.S idt.c irq.c - irqhand.S - kernel.c + irqhand.s kernel.c ldt.c multiboot.S @@ -251,6 +250,9 @@ balance.c cont.c drvlck.c + elf32.c + elf64.c + elf.c freelist.c iospace.c kmap.c @@ -266,6 +268,7 @@ pager.c pagfault.c paging.c + pe.c physical.c pool.c ppool.c diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp index 0f63b29d570..7d5e8720a68 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp @@ -7,6 +7,7 @@ #include "modulehandler.h" using std::string; +using std::vector; MingwModuleHandler::MingwModuleHandler ( FILE* fMakefile ) : fMakefile ( fMakefile ) @@ -93,6 +94,80 @@ MingwModuleHandler::GetObjectFilenames ( Module& module ) return objectFilenames; } +string +MingwModuleHandler::GenerateGccDefineParametersFromVector ( vector defines ) +{ + string parameters; + for (size_t i = 0; i < defines.size (); i++) + { + Define& define = *defines[i]; + if (parameters.length () > 0) + parameters += " "; + parameters += "-D"; + parameters += define.name; + if (define.value.length () > 0) + { + parameters += "="; + parameters += define.value; + } + } + return parameters; +} + +string +MingwModuleHandler::GenerateGccDefineParameters ( Module& module ) +{ + string parameters = GenerateGccDefineParametersFromVector ( module.project->defines ); + string s = GenerateGccDefineParametersFromVector ( module.defines ); + if (s.length () > 0) + { + parameters += " "; + parameters += s; + } + return parameters; +} + +string +MingwModuleHandler::GenerateGccIncludeParametersFromVector ( vector includes ) +{ + string parameters; + for (size_t i = 0; i < includes.size (); i++) + { + Include& include = *includes[i]; + if (parameters.length () > 0) + parameters += " "; + parameters += "-I"; + parameters += include.directory; + } + return parameters; +} + +string +MingwModuleHandler::GenerateGccIncludeParameters ( Module& module ) +{ + string parameters = GenerateGccIncludeParametersFromVector ( module.project->includes ); + string s = GenerateGccIncludeParametersFromVector ( module.includes ); + if (s.length () > 0) + { + parameters += " "; + parameters += s; + } + return parameters; +} + +string +MingwModuleHandler::GenerateGccParameters ( Module& module ) +{ + string parameters = GenerateGccDefineParameters ( module ); + string s = GenerateGccIncludeParameters ( module ); + if (s.length () > 0) + { + parameters += " "; + parameters += s; + } + return parameters; +} + void MingwModuleHandler::GenerateObjectFileTargets ( Module& module ) { @@ -108,9 +183,10 @@ MingwModuleHandler::GenerateObjectFileTargets ( Module& module ) objectFilename.c_str (), sourceFilename.c_str() ); fprintf ( fMakefile, - "\t${gcc} -c %s -o %s\n", + "\t${gcc} -c %s -o %s %s\n", sourceFilename.c_str (), - objectFilename.c_str () ); + objectFilename.c_str (), + GenerateGccParameters ( module ).c_str () ); } fprintf ( fMakefile, "\n" ); diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.h b/reactos/tools/rbuild/backend/mingw/modulehandler.h index 7763d7d11dd..e52991ab923 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.h +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.h @@ -21,6 +21,12 @@ protected: void GenerateObjectFileTargets ( Module& module ); void GenerateArchiveTarget ( Module& module ); FILE* fMakefile; +private: + std::string GenerateGccDefineParametersFromVector ( std::vector defines ); + std::string GenerateGccDefineParameters ( Module& module ); + std::string GenerateGccIncludeParametersFromVector ( std::vector includes ); + std::string GenerateGccIncludeParameters ( Module& module ); + std::string GenerateGccParameters ( Module& module ); }; diff --git a/reactos/tools/rbuild/define.cpp b/reactos/tools/rbuild/define.cpp new file mode 100644 index 00000000000..c443d446198 --- /dev/null +++ b/reactos/tools/rbuild/define.cpp @@ -0,0 +1,44 @@ +#include "pch.h" +#include + +#include "rbuild.h" + +using std::string; +using std::vector; + +Define::Define ( Project* project, + const XMLElement& defineNode ) + : project(project), + module(NULL), + node(defineNode) +{ + Initialize (defineNode); +} + +Define::Define ( Project* project, + Module* module, + const XMLElement& defineNode ) + : project(project), + module(module), + node(defineNode) +{ + Initialize (defineNode); +} + +Define::~Define () +{ +} + +void +Define::Initialize ( const XMLElement& defineNode ) +{ + const XMLAttribute* att = defineNode.GetAttribute ( "name", true ); + assert(att); + name = att->value; + value = defineNode.value; +} + +void +Define::ProcessXML ( const XMLElement& e ) +{ +} diff --git a/reactos/tools/rbuild/include.cpp b/reactos/tools/rbuild/include.cpp new file mode 100644 index 00000000000..f52e5859c00 --- /dev/null +++ b/reactos/tools/rbuild/include.cpp @@ -0,0 +1,39 @@ +#include "pch.h" +#include + +#include "rbuild.h" + +using std::string; +using std::vector; + +Include::Include ( Project* project, + const XMLElement& includeNode ) + : project(project), + node(includeNode) +{ + Initialize ( includeNode ); +} + +Include::Include ( Project* project, + Module* module, + const XMLElement& includeNode ) + : project(project), + node(includeNode) +{ + Initialize ( includeNode ); +} + +Include::~Include () +{ +} + +void +Include::Initialize ( const XMLElement& includeNode ) +{ + directory = includeNode.value; +} + +void +Include::ProcessXML ( const XMLElement& e ) +{ +} diff --git a/reactos/tools/rbuild/makefile b/reactos/tools/rbuild/makefile index 9cdbc818727..7173501b71a 100644 --- a/reactos/tools/rbuild/makefile +++ b/reactos/tools/rbuild/makefile @@ -14,7 +14,9 @@ BACKEND_BASE_OBJECTS = \ BASE_OBJECTS = \ $(BACKEND_BASE_OBJECTS) \ + define.o \ exception.o \ + include.o \ module.o \ project.o \ ssprintf.o \ @@ -23,6 +25,8 @@ BASE_OBJECTS = \ OBJECTS = $(BASE_OBJECTS) rbuild.o TESTS = \ + tests/definetest.o \ + tests/includetest.o \ tests/moduletest.o \ tests/projecttest.o diff --git a/reactos/tools/rbuild/module.cpp b/reactos/tools/rbuild/module.cpp index 4d9b3eee192..5067d490716 100644 --- a/reactos/tools/rbuild/module.cpp +++ b/reactos/tools/rbuild/module.cpp @@ -61,6 +61,18 @@ Module::ProcessXML ( const XMLElement& e, assert(att); subpath = path + CSEP + att->value; } + else if ( e.name == "include" ) + { + Include* include = new Include ( project, this, e ); + includes.push_back ( include ); + include->ProcessXML ( e ); + } + else if ( e.name == "define" ) + { + Define* define = new Define ( project, this, e ); + defines.push_back ( define ); + define->ProcessXML ( e ); + } for ( size_t i = 0; i < e.subElements.size (); i++ ) ProcessXML ( *e.subElements[i], subpath ); } diff --git a/reactos/tools/rbuild/project.cpp b/reactos/tools/rbuild/project.cpp index 3cfe1387281..fd8aacbc524 100644 --- a/reactos/tools/rbuild/project.cpp +++ b/reactos/tools/rbuild/project.cpp @@ -72,6 +72,18 @@ Project::ProcessXML ( const XMLElement& e, const string& path ) assert(att); subpath = path + CSEP + att->value; } + else if ( e.name == "include" ) + { + Include* include = new Include ( this, e ); + includes.push_back ( include ); + include->ProcessXML ( e ); + } + else if ( e.name == "define" ) + { + Define* define = new Define ( this, e ); + defines.push_back ( define ); + define->ProcessXML ( e ); + } for ( size_t i = 0; i < e.subElements.size (); i++ ) ProcessXML ( *e.subElements[i], subpath ); } diff --git a/reactos/tools/rbuild/rbuild.h b/reactos/tools/rbuild/rbuild.h index 43d1591d40c..1622bc786fe 100644 --- a/reactos/tools/rbuild/rbuild.h +++ b/reactos/tools/rbuild/rbuild.h @@ -23,6 +23,8 @@ class Project; class Module; +class Include; +class Define; class File; class Library; @@ -32,7 +34,9 @@ public: std::string name; std::string makefile; std::vector modules; - + std::vector includes; + std::vector defines; + Project (); Project ( const std::string& filename ); ~Project (); @@ -53,6 +57,7 @@ enum ModuleType KernelModeDLL }; + class Module { public: @@ -63,18 +68,61 @@ public: ModuleType type; std::vector files; std::vector libraries; + std::vector includes; + std::vector defines; Module ( Project* project, const XMLElement& moduleNode, const std::string& moduleName, const std::string& modulePath ); - ~Module(); + ~Module (); ModuleType GetModuleType (const XMLAttribute& attribute ); std::string GetPath (); void ProcessXML ( const XMLElement& e, const std::string& path ); }; +class Include +{ +public: + Project* project; + Module* module; + const XMLElement& node; + std::string directory; + + Include ( Project* project, + const XMLElement& includeNode ); + Include ( Project* project, + Module* module, + const XMLElement& includeNode ); + ~Include (); + void ProcessXML ( const XMLElement& e ); +private: + void Initialize ( const XMLElement& includeNode ); +}; + + +class Define +{ +public: + Project* project; + Module* module; + const XMLElement& node; + std::string name; + std::string value; + + Define ( Project* project, + const XMLElement& defineNode ); + Define ( Project* project, + Module* module, + const XMLElement& defineNode ); + ~Define(); + void ProcessXML ( const XMLElement& e ); +private: + void Initialize ( const XMLElement& defineNode ); +}; + + class File { public: diff --git a/reactos/tools/rbuild/test.h b/reactos/tools/rbuild/test.h index 3b397866675..d82dc819160 100644 --- a/reactos/tools/rbuild/test.h +++ b/reactos/tools/rbuild/test.h @@ -52,4 +52,18 @@ public: void Run(); }; + +class DefineTest : public BaseTest +{ +public: + void Run(); +}; + + +class IncludeTest : public BaseTest +{ +public: + void Run(); +}; + #endif /* __TEST_H */ diff --git a/reactos/tools/rbuild/tests/alltests.cpp b/reactos/tools/rbuild/tests/alltests.cpp index 4698a4ca640..9ff51ddef34 100644 --- a/reactos/tools/rbuild/tests/alltests.cpp +++ b/reactos/tools/rbuild/tests/alltests.cpp @@ -147,6 +147,8 @@ private: { tests.push_back(new ProjectTest()); tests.push_back(new ModuleTest()); + tests.push_back(new DefineTest()); + tests.push_back(new IncludeTest()); } }; diff --git a/reactos/tools/rbuild/tests/data/define.xml b/reactos/tools/rbuild/tests/data/define.xml new file mode 100644 index 00000000000..1f5c823f838 --- /dev/null +++ b/reactos/tools/rbuild/tests/data/define.xml @@ -0,0 +1,9 @@ + + + value1 + + + value2 + + + diff --git a/reactos/tools/rbuild/tests/data/include.xml b/reactos/tools/rbuild/tests/data/include.xml new file mode 100644 index 00000000000..92c45fc847c --- /dev/null +++ b/reactos/tools/rbuild/tests/data/include.xml @@ -0,0 +1,9 @@ + + + include1 + + + include2 + + + diff --git a/reactos/tools/rbuild/tests/definetest.cpp b/reactos/tools/rbuild/tests/definetest.cpp new file mode 100644 index 00000000000..ad0594640f1 --- /dev/null +++ b/reactos/tools/rbuild/tests/definetest.cpp @@ -0,0 +1,21 @@ +#include "test.h" + +using std::string; + +void DefineTest::Run() +{ + string projectFilename ( "tests/data/define.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(1, project.defines.size()); + Define& define1 = *project.defines[0]; + ARE_EQUAL("define1", define1.name); + ARE_EQUAL("value1", define1.value); + + ARE_EQUAL(1, project.modules.size()); + Module& module1 = *project.modules[0]; + + ARE_EQUAL(1, module1.defines.size()); + Define& define2 = *module1.defines[0]; + ARE_EQUAL("define2", define2.name); + ARE_EQUAL("value2", define2.value); +} diff --git a/reactos/tools/rbuild/tests/includetest.cpp b/reactos/tools/rbuild/tests/includetest.cpp new file mode 100644 index 00000000000..955bffd73a4 --- /dev/null +++ b/reactos/tools/rbuild/tests/includetest.cpp @@ -0,0 +1,19 @@ +#include "test.h" + +using std::string; + +void IncludeTest::Run() +{ + string projectFilename ( "tests/data/include.xml" ); + Project project ( projectFilename ); + ARE_EQUAL(1, project.includes.size()); + Include& include1 = *project.includes[0]; + ARE_EQUAL("include1", include1.directory); + + ARE_EQUAL(1, project.modules.size()); + Module& module1 = *project.modules[0]; + + ARE_EQUAL(1, module1.includes.size()); + Include& include2 = *module1.includes[0]; + ARE_EQUAL("include2", include2.directory); +}