beginnings of makefile output
authorRoyce Mitchell III <royce3@ev1.net>
Wed, 5 Jan 2005 19:02:00 +0000 (19:02 +0000)
committerRoyce Mitchell III <royce3@ev1.net>
Wed, 5 Jan 2005 19:02:00 +0000 (19:02 +0000)
svn path=/branches/xmlbuildsystem/; revision=12826

reactos/tools/rbuild/project.cpp
reactos/tools/rbuild/rbuild.cpp
reactos/tools/rbuild/rbuild.h

index dfa1a29..8cd9db2 100644 (file)
@@ -6,6 +6,36 @@
 using std::string;\r
 using std::vector;\r
 \r
+#ifdef WIN32\r
+#define EXEPOSTFIX ".exe"\r
+#define SEP "\\"\r
+string FixSep ( const string& s )\r
+{\r
+       string s2(s);\r
+       char* p = strchr ( &s2[0], '/' );\r
+       while ( p )\r
+       {\r
+               *p++ = '\\';\r
+               p = strchr ( p, '/' );\r
+       }\r
+       return s2;\r
+}\r
+#else\r
+#define EXEPOSTFIX\r
+#define SEP "/"\r
+string FixSep ( const string& s )\r
+{\r
+       string s2(s);\r
+       char* p = strchr ( &s2[0], '\\' );\r
+       while ( p )\r
+       {\r
+               *p++ = '/';\r
+               p = strchr ( p, '\\' );\r
+       }\r
+       return s2;\r
+}\r
+#endif\r
+\r
 Project::Project()\r
 {\r
 }\r
@@ -21,28 +51,24 @@ Project::~Project()
 {\r
        for ( size_t i = 0; i < modules.size(); i++ )\r
                delete modules[i];\r
+       delete head;\r
 }\r
 \r
 void Project::ReadXml()\r
 {\r
        Path path;\r
-       bool projectFound = false;\r
-       do\r
+\r
+       head = XMLParse ( xmlfile, path );\r
+       if ( !head )\r
+               throw InvalidBuildFileException ( "Document contains no 'project' tag." );\r
+\r
+       if ( head->name != "project" )\r
        {\r
-               XMLElement* head = XMLParse ( xmlfile, path );\r
-               if ( !head )\r
-                       throw InvalidBuildFileException ( "Document contains no 'project' tag." );\r
-\r
-               if ( head->name != "project" )\r
-               {\r
-                       throw InvalidBuildFileException ( "Expected 'project', got '%s'.",\r
-                                                         head->name.c_str());\r
-               }\r
-\r
-               this->ProcessXML ( *head, "." );\r
-               delete head;\r
-               projectFound = true;\r
-       } while (!projectFound);\r
+               throw InvalidBuildFileException ( "Expected 'project', got '%s'.",\r
+                                                     head->name.c_str());\r
+       }\r
+\r
+       this->ProcessXML ( *head, "." );\r
 }\r
 \r
 void\r
@@ -79,3 +105,32 @@ Project::ProcessXML ( const XMLElement& e, const string& path )
        for ( size_t i = 0; i < e.subElements.size(); i++ )\r
                ProcessXML ( *e.subElements[i], subpath );\r
 }\r
+\r
+bool\r
+Project::GenerateOutput()\r
+{\r
+       const XMLAttribute* att;\r
+       size_t i;\r
+\r
+       att = head->GetAttribute ( "makefile", true );\r
+       if ( !att )\r
+               return false;\r
+       FILE* f = fopen ( att->value.c_str(), "w" );\r
+       if ( !f )\r
+       {\r
+               throw Exception ( "Unable to open '%s' for output", att->value.c_str() );\r
+               return false;\r
+       }\r
+       fprintf ( f, "# THIS FILE IS AUTOMATICALLY GENERATED, EDIT 'ReactOS.xml' INSTEAD\n\n" );\r
+\r
+       // generate module list:\r
+       fprintf ( f, "all: " );\r
+       for ( i = 0; i < modules.size(); i++ )\r
+       {\r
+               Module& m = *modules[i];\r
+               fprintf ( f, " %s" SEP "%s" EXEPOSTFIX, FixSep(m.path).c_str(), m.name.c_str() );\r
+       }\r
+       fprintf ( f, "\n\n" );\r
+\r
+       return true;\r
+}\r
index f860498..b13b1fc 100644 (file)
@@ -1,6 +1,7 @@
 // rbuild.cpp\r
 \r
 #include "pch.h"\r
+#include <typeinfo>\r
 \r
 #include <stdio.h>\r
 #include <io.h>\r
@@ -17,14 +18,15 @@ main ( int argc, char** argv )
        try\r
        {\r
                string projectFilename ( "ReactOS.xml" );\r
-               Project* project = new Project( projectFilename );\r
+               Project project ( projectFilename );\r
+               project.GenerateOutput();\r
 \r
-               Path path;\r
                // REM TODO FIXME actually do something with Project object...\r
-               printf ( "Found %d modules:\n", project->modules.size() );\r
-               for ( size_t i = 0; i < project->modules.size(); i++ )\r
+#if 0\r
+               printf ( "Found %d modules:\n", project.modules.size() );\r
+               for ( size_t i = 0; i < project.modules.size(); i++ )\r
                {\r
-                       Module& m = *project->modules[i];\r
+                       Module& m = *project.modules[i];\r
                        printf ( "\t%s in folder: %s\n",\r
                                 m.name.c_str(),\r
                                 m.path.c_str() );\r
@@ -49,15 +51,14 @@ main ( int argc, char** argv )
                                printf ( "\t\t%s\n", m.files[j]->name.c_str() );\r
                        }\r
                }\r
-       \r
-               delete project;\r
+#endif\r
 \r
                return 0;\r
        }\r
        catch (Exception& ex)\r
        {\r
-               printf ( "%s\n",\r
-                        ex.Message.c_str() );\r
+               printf ( "%s: %s\n",\r
+                        typeid(ex).name(), ex.Message.c_str() );\r
                return 1;\r
        }\r
 }\r
index af0314a..6fa5ab8 100644 (file)
@@ -21,9 +21,11 @@ public:
        Project ( const std::string& filename );\r
        ~Project ();\r
        void ProcessXML ( const XMLElement& e, const std::string& path );\r
+       bool GenerateOutput();\r
 private:\r
        void ReadXml ();\r
        XMLFile xmlfile;\r
+       XMLElement* head;\r
 };\r
 \r
 class Module\r