Generate MinGW makefile in the backend. Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/module.xml Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/project.xml Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/projecttest.cpp _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -7,6 +7,7 @@
#include <assert.h>
#include "XML.h" +#include "rbuild.h"
using std::string; using std::vector; @@ -397,8 +398,8 @@ } if ( required ) { - printf ( "syntax error: attribute '%s' required for <%s>\n", - attribute.c_str(), name.c_str() ); + throw RequiredAttributeNotFoundException ( attribute, + name ); } return NULL; } @@ -416,8 +417,8 @@ } if ( required ) { - printf ( "syntax error: attribute '%s' required for <%s>\n", - attribute.c_str(), name.c_str() ); + throw RequiredAttributeNotFoundException ( attribute, + name ); } return NULL; } @@ -462,7 +463,7 @@ e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) ); XMLFile fInc; if ( !fInc.open ( file ) ) - printf ( "xi:include error, couldn't find file '%s'\n", file.c_str() ); + throw FileNotFoundException ( file ); else { Path path2 ( path, att->value ); _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -6,6 +6,36 @@
using std::string; using std::vector;
+#ifdef WIN32 +#define EXEPOSTFIX ".exe" +#define SEP "\" +string FixSep ( const string& s ) +{ + string s2(s); + char* p = strchr ( &s2[0], '/' ); + while ( p ) + { + *p++ = '\'; + p = strchr ( p, '/' ); + } + return s2; +} +#else +#define EXEPOSTFIX +#define SEP "/" +string FixSep ( const string& s ) +{ + string s2(s); + char* p = strchr ( &s2[0], '\' ); + while ( p ) + { + *p++ = '/'; + p = strchr ( p, '\' ); + } + return s2; +} +#endif + MingwBackend::MingwBackend ( Project& project ) : Backend ( project ) { @@ -13,18 +43,54 @@
void MingwBackend::Process () { + CreateMakefile (); + GenerateHeader (); + GenerateAllTarget (); for ( size_t i = 0; i < ProjectNode.modules.size (); i++ ) { Module& module = *ProjectNode.modules[i]; ProcessModule ( module ); } + CloseMakefile (); }
+void MingwBackend::CreateMakefile () +{ + fMakefile = fopen ( ProjectNode.makefile.c_str (), "w" ); + if ( !fMakefile ) + throw AccessDeniedException ( ProjectNode.makefile ); +} + +void MingwBackend::CloseMakefile () +{ + if (fMakefile) + fclose ( fMakefile ); +} + +void MingwBackend::GenerateHeader () +{ + fprintf ( fMakefile, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" ); +} + +void MingwBackend::GenerateAllTarget () +{ + fprintf ( fMakefile, "all: " ); + for ( size_t i = 0; i < ProjectNode.modules.size (); i++ ) + { + Module& module = *ProjectNode.modules[i]; + fprintf ( fMakefile, + " %s" SEP "%s" EXEPOSTFIX, + FixSep(module.path).c_str (), + module.name.c_str () ); + } + fprintf ( fMakefile, "\n\n" ); +} + void MingwBackend::ProcessModule ( Module& module ) { MingwModuleHandlerList moduleHandlers; GetModuleHandlers ( moduleHandlers ); - for (size_t i = 0; i < moduleHandlers.size(); i++) + for (size_t i = 0; i < moduleHandlers.size (); i++) { MingwModuleHandler& moduleHandler = *moduleHandlers[i]; if (moduleHandler.CanHandleModule ( module ) ) _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h 2005-01-05 20:59:10 UTC (rev 12837) @@ -25,6 +25,11 @@
private: void ProcessModule ( Module& module ); void GetModuleHandlers ( MingwModuleHandlerList& moduleHandlers ); + void CreateMakefile (); + void CloseMakefile (); + void GenerateHeader (); + void GenerateAllTarget (); + FILE* fMakefile; };
#endif /* MINGW_H */ _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/exception.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -40,6 +40,13 @@
}
+AccessDeniedException::AccessDeniedException(const string& filename) + : Exception ( "Access denied to file '%s'.", filename.c_str() ) +{ + Filename = filename; +} + + InvalidBuildFileException::InvalidBuildFileException(const char* message, ...) { @@ -48,3 +55,13 @@ SetMessage(message, args); va_end(args); } + + +RequiredAttributeNotFoundException::RequiredAttributeNotFoundException( const std::string& attributeName, + const std::string& elementName) + : InvalidBuildFileException ( "Required attribute '%s' not found on '%s'.", + attributeName.c_str (), + elementName.c_str ()) +{ + +} _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/exception.h --- branches/xmlbuildsystem/reactos/tools/rbuild/exception.h 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/exception.h 2005-01-05 20:59:10 UTC (rev 12837) @@ -25,6 +25,14 @@
};
+class AccessDeniedException : public Exception +{ +public: + AccessDeniedException(const std::string& filename); + std::string Filename; +}; + + class InvalidBuildFileException : public Exception { public: @@ -32,4 +40,12 @@ ...); };
+ +class RequiredAttributeNotFoundException : public InvalidBuildFileException +{ +public: + RequiredAttributeNotFoundException(const std::string& attributeName, + const std::string& elementName); +}; + #endif /* __EXCEPTION_H */ _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -6,36 +6,6 @@
using std::string; using std::vector;
-#ifdef WIN32 -#define EXEPOSTFIX ".exe" -#define SEP "\" -string FixSep ( const string& s ) -{ - string s2(s); - char* p = strchr ( &s2[0], '/' ); - while ( p ) - { - *p++ = '\'; - p = strchr ( p, '/' ); - } - return s2; -} -#else -#define EXEPOSTFIX -#define SEP "/" -string FixSep ( const string& s ) -{ - string s2(s); - char* p = strchr ( &s2[0], '\' ); - while ( p ) - { - *p++ = '/'; - p = strchr ( p, '\' ); - } - return s2; -} -#endif - Project::Project() { } @@ -83,6 +53,9 @@ name = "Unnamed"; else name = att->value; + + att = e.GetAttribute ( "makefile", true ); + makefile = att->value; } else if ( e.name == "module" ) { @@ -105,32 +78,3 @@ for ( size_t i = 0; i < e.subElements.size (); i++ ) ProcessXML ( *e.subElements[i], subpath ); } - -bool -Project::GenerateOutput() -{ - const XMLAttribute* att; - size_t i; - - att = head->GetAttribute ( "makefile", true ); - if ( !att ) - return false; - FILE* f = fopen ( att->value.c_str(), "w" ); - if ( !f ) - { - throw Exception ( "Unable to open '%s' for output", att->value.c_str() ); - return false; - } - fprintf ( f, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" ); - - // generate module list: - fprintf ( f, "all: " ); - for ( i = 0; i < modules.size(); i++ ) - { - Module& m = *modules[i]; - fprintf ( f, " %s" SEP "%s" EXEPOSTFIX, FixSep(m.path).c_str(), m.name.c_str() ); - } - fprintf ( f, "\n\n" ); - - return true; -} _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -20,9 +20,10 @@
try { string projectFilename ( "ReactOS.xml" ); - Project project = Project ( projectFilename ); + Project project ( projectFilename ); Backend* backend = new MingwBackend ( project ); backend->Process (); + delete backend; // REM TODO FIXME actually do something with Project object... #if 0 _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h --- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h 2005-01-05 20:59:10 UTC (rev 12837) @@ -15,6 +15,7 @@
{ public: std::string name; + std::string makefile; std::vector<Module*> modules;
Project (); @@ -22,13 +23,13 @@ ~Project (); void ProcessXML ( const XMLElement& e, const std::string& path ); - bool GenerateOutput(); private: void ReadXml (); XMLFile xmlfile; XMLElement* head; };
+ class Module { public: @@ -46,6 +47,7 @@ void ProcessXML ( const XMLElement& e, const std::string& path ); };
+ class File { public: _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/module.xml --- branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/module.xml 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/module.xml 2005-01-05 20:59:10 UTC (rev 12837) @@ -1,4 +1,4 @@
-<project name="Project"> +<project name="Project" makefile="Makefile"> <directory name="dir1"> <module name="module1" type="buildtool"> <file>file1.c</file> _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/project.xml --- branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/project.xml 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/tests/data/project.xml 2005-01-05 20:59:10 UTC (rev 12837) @@ -1,4 +1,4 @@
-<project name="Project"> +<project name="Project" makefile="Makefile"> <directory name="dir1"> <module name="module1" type="buildtool"> </module> _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/tests/moduletest.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -5,15 +5,15 @@
void ModuleTest::Run() { string projectFilename ( "tests/data/module.xml" ); - Project* project = new Project( projectFilename ); - ARE_EQUAL(2, project->modules.size()); + Project project ( projectFilename ); + ARE_EQUAL(2, project.modules.size());
- Module& module1 = *project->modules[0]; + Module& module1 = *project.modules[0]; ARE_EQUAL(2, module1.files.size()); ARE_EQUAL("./dir1/file1.c", module1.files[0]->name); ARE_EQUAL("./dir1/file2.c", module1.files[1]->name); - Module& module2 = *project->modules[1]; + Module& module2 = *project.modules[1]; ARE_EQUAL(2, module2.files.size()); ARE_EQUAL("./dir2/file3.c", module2.files[0]->name); ARE_EQUAL("./dir2/file4.c", module2.files[1]->name); _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/tests/projecttest.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/tests/projecttest.cpp 2005-01-05 19:47:10 UTC (rev 12836) +++ branches/xmlbuildsystem/reactos/tools/rbuild/tests/projecttest.cpp 2005-01-05 20:59:10 UTC (rev 12837) @@ -5,6 +5,6 @@
void ProjectTest::Run() { string projectFilename ( "tests/data/project.xml" ); - Project* project = new Project( projectFilename ); - ARE_EQUAL(2, project->modules.size()); + Project project( projectFilename ); + ARE_EQUAL(2, project.modules.size()); }