add support for <if> and <property>
authorRoyce Mitchell III <royce3@ev1.net>
Thu, 13 Jan 2005 02:46:46 +0000 (02:46 +0000)
committerRoyce Mitchell III <royce3@ev1.net>
Thu, 13 Jan 2005 02:46:46 +0000 (02:46 +0000)
svn path=/branches/xmlbuildsystem/; revision=13015

reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/modulehandler.cpp
reactos/tools/rbuild/module.cpp
reactos/tools/rbuild/project.cpp
reactos/tools/rbuild/rbuild.h

index b526cee..bc8c234 100644 (file)
@@ -62,8 +62,9 @@ MingwBackend::GenerateHeader ()
 string\r
 MingwBackend::GenerateProjectCFLAGS ()\r
 {\r
+       size_t i;\r
        string clags;\r
-       for ( size_t i = 0; i < ProjectNode.includes.size (); i++ )\r
+       for ( i = 0; i < ProjectNode.includes.size (); i++ )\r
        {\r
                Include& include = *ProjectNode.includes[i];\r
                if (clags.length () > 0)\r
@@ -71,7 +72,7 @@ MingwBackend::GenerateProjectCFLAGS ()
                clags += "-I" + include.directory;\r
        }\r
        \r
-       for ( size_t i = 0; i < ProjectNode.defines.size (); i++ )\r
+       for ( i = 0; i < ProjectNode.defines.size (); i++ )\r
        {\r
                Define& define = *ProjectNode.defines[i];\r
                if ( clags.length () > 0 )\r
@@ -89,6 +90,8 @@ MingwBackend::GenerateProjectCFLAGS ()
 void\r
 MingwBackend::GenerateGlobalVariables ()\r
 {\r
+       size_t i;\r
+\r
        fprintf ( fMakefile, "host_gcc = gcc\n" );\r
        fprintf ( fMakefile, "host_ar = ar\n" );\r
        fprintf ( fMakefile, "host_ld = ld\n" );\r
@@ -98,6 +101,13 @@ MingwBackend::GenerateGlobalVariables ()
        fprintf ( fMakefile, "ar = ar\n" );\r
        fprintf ( fMakefile, "dlltool = dlltool\n" );\r
        fprintf ( fMakefile, "PROJECT_CFLAGS = %s\n", GenerateProjectCFLAGS ().c_str () );\r
+       for ( i = 0; i < ProjectNode.properties.size(); i++ )\r
+       {\r
+               Property& prop = *ProjectNode.properties[i];\r
+               fprintf ( fMakefile, "%s := %s\n",\r
+                       prop.name.c_str(),\r
+                       prop.value.c_str() );\r
+       }\r
        fprintf ( fMakefile, "\n" );\r
 }\r
 \r
index e807ce0..f01f216 100644 (file)
@@ -323,7 +323,7 @@ MingwModuleHandler::GenerateMacros (
 \r
        if ( ifs && ifs->size() )\r
        {\r
-               for ( size_t i = 0; i < module.ifs.size(); i++ )\r
+               for ( size_t i = 0; i < ifs->size(); i++ )\r
                {\r
                        If& rIf = *(*ifs)[i];\r
                        if ( rIf.defines.size() || rIf.files.size() || rIf.ifs.size() )\r
@@ -377,7 +377,7 @@ MingwModuleHandler::GenerateMacros (
                {\r
                        fprintf (\r
                                fMakefile,\r
-                               "ifeq ($(%s),\"%s\")\n",\r
+                               "ifeq (\"$(%s)\",\"%s\")\n",\r
                                rIf.property.c_str(),\r
                                rIf.value.c_str() );\r
                        GenerateMacros (\r
@@ -395,11 +395,10 @@ MingwModuleHandler::GenerateMacros (
                                "endif\n\n" );\r
                }\r
        }\r
-\r
        fprintf (\r
                fMakefile,\r
-               "%s_CFLAGS += $(PROJECT_CFLAGS)\n\n",\r
-               module.name.c_str () );\r
+               "%s += $(PROJECT_CFLAGS)\n\n",\r
+               cflags_macro.c_str () );\r
 }\r
 \r
 string\r
index 1732a49..63fac98 100644 (file)
@@ -171,10 +171,20 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
        }\r
        else if ( e.name == "if" )\r
        {\r
-               pIf = new If ( e, *this );\r
-               ifs.push_back ( pIf );\r
+               If* pOldIf = pIf;\r
+               pIf = new If ( e, project, this );\r
+               if ( pOldIf )\r
+                       pOldIf->ifs.push_back ( pIf );\r
+               else\r
+                       ifs.push_back ( pIf );\r
                subs_invalid = false;\r
        }\r
+       else if ( e.name == "property" )\r
+       {\r
+               throw InvalidBuildFileException (\r
+                       e.location,\r
+                       "<property> is not a valid sub-element of <module>" );\r
+       }\r
        if ( subs_invalid && e.subElements.size() > 0 )\r
                throw InvalidBuildFileException (\r
                        e.location,\r
@@ -482,8 +492,10 @@ ImportLibrary::ImportLibrary ( const XMLElement& _node,
 }\r
 \r
 \r
-If::If ( const XMLElement& node_, const Module& module_ )\r
-       : node(node_), module(module_)\r
+If::If ( const XMLElement& node_,\r
+         const Project& project_,\r
+         const Module* module_ )\r
+       : node(node_), project(project_), module(module_)\r
 {\r
        const XMLAttribute* att;\r
 \r
@@ -511,3 +523,25 @@ void
 If::ProcessXML()\r
 {\r
 }\r
+\r
+\r
+Property::Property ( const XMLElement& node_,\r
+                     const Project& project_,\r
+                     const Module* module_ )\r
+       : node(node_), project(project_), module(module_)\r
+{\r
+       const XMLAttribute* att;\r
+\r
+       att = node.GetAttribute ( "name", true );\r
+       assert(att);\r
+       name = att->value;\r
+\r
+       att = node.GetAttribute ( "value", true );\r
+       assert(att);\r
+       value = att->value;\r
+}\r
+\r
+void\r
+Property::ProcessXML()\r
+{\r
+}\r
index 69ffeda..c469f81 100644 (file)
@@ -27,6 +27,10 @@ Project::~Project ()
                delete includes[i];\r
        for ( i = 0; i < defines.size(); i++ )\r
                delete defines[i];\r
+       for ( i = 0; i < properties.size(); i++ )\r
+               delete properties[i];\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+               delete ifs[i];\r
        delete head;\r
 }\r
 \r
@@ -77,10 +81,16 @@ Project::ProcessXML ( const string& path )
                includes[i]->ProcessXML();\r
        for ( i = 0; i < defines.size(); i++ )\r
                defines[i]->ProcessXML();\r
+       for ( i = 0; i < properties.size(); i++ )\r
+               properties[i]->ProcessXML();\r
+       for ( i = 0; i < ifs.size(); i++ )\r
+               ifs[i]->ProcessXML();\r
 }\r
 \r
 void\r
-Project::ProcessXMLSubElement ( const XMLElement& e, const string& path )\r
+Project::ProcessXMLSubElement ( const XMLElement& e,\r
+                                const string& path,\r
+                                If* pIf /*= NULL*/ )\r
 {\r
        bool subs_invalid = false;\r
        string subpath(path);\r
@@ -109,16 +119,38 @@ Project::ProcessXMLSubElement ( const XMLElement& e, const string& path )
        }\r
        else if ( e.name == "define" )\r
        {\r
-               defines.push_back ( new Define ( *this, e ) );\r
+               Define* define = new Define ( *this, e );\r
+               if ( pIf )\r
+                       pIf->defines.push_back ( define );\r
+               else\r
+                       defines.push_back ( define );\r
                subs_invalid = true;\r
        }\r
+       else if ( e.name == "if" )\r
+       {\r
+               If* pOldIf = pIf;\r
+               pIf = new If ( e, *this, NULL );\r
+               if ( pOldIf )\r
+                       pOldIf->ifs.push_back ( pIf );\r
+               else\r
+                       ifs.push_back ( pIf );\r
+               subs_invalid = false;\r
+       }\r
+       else if ( e.name == "property" )\r
+       {\r
+               Property* property = new Property ( e, *this, NULL );\r
+               if ( pIf )\r
+                       pIf->properties.push_back ( property );\r
+               else\r
+                       properties.push_back ( property );\r
+       }\r
        if ( subs_invalid && e.subElements.size() )\r
                throw InvalidBuildFileException (\r
                        e.location,\r
                        "<%s> cannot have sub-elements",\r
                        e.name.c_str() );\r
        for ( size_t i = 0; i < e.subElements.size (); i++ )\r
-               ProcessXMLSubElement ( *e.subElements[i], subpath );\r
+               ProcessXMLSubElement ( *e.subElements[i], subpath, pIf );\r
 }\r
 \r
 Module*\r
index f10993b..02ae038 100644 (file)
@@ -32,6 +32,7 @@ class InvokeFile;
 class Dependency;\r
 class ImportLibrary;\r
 class If;\r
+class Property;\r
 \r
 class Project\r
 {\r
@@ -43,6 +44,8 @@ public:
        std::vector<Module*> modules;\r
        std::vector<Include*> includes;\r
        std::vector<Define*> defines;\r
+       std::vector<Property*> properties;\r
+       std::vector<If*> ifs;\r
 \r
        //Project ();\r
        Project ( const std::string& filename );\r
@@ -53,7 +56,8 @@ public:
 private:\r
        void ReadXml ();\r
        void ProcessXMLSubElement ( const XMLElement& e,\r
-                                   const std::string& path );\r
+                                   const std::string& path,\r
+                                   If* pIf = NULL );\r
 \r
        // disable copy semantics\r
        Project ( const Project& );\r
@@ -248,19 +252,37 @@ class If
 {\r
 public:\r
        const XMLElement& node;\r
-       const Module& module;\r
+       const Project& project;\r
+       const Module* module;\r
        std::string property, value;\r
        std::vector<File*> files;\r
        std::vector<Define*> defines;\r
+       std::vector<Property*> properties;\r
        std::vector<If*> ifs;\r
 \r
        If ( const XMLElement& node_,\r
-            const Module& module_ );\r
+            const Project& project_,\r
+            const Module* module_ );\r
        ~If();\r
 \r
        void ProcessXML();\r
 };\r
 \r
+class Property\r
+{\r
+public:\r
+       const XMLElement& node;\r
+       const Project& project;\r
+       const Module* module;\r
+       std::string name, value;\r
+\r
+       Property ( const XMLElement& node_,\r
+                  const Project& project_,\r
+                  const Module* module_ );\r
+\r
+       void ProcessXML();\r
+};\r
+\r
 extern std::string\r
 FixSeparator ( const std::string& s );\r
 \r