add support for <if> and <property>
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-01-13 02:46:38 UTC (rev 13014)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-01-13 02:46:46 UTC (rev 13015)
@@ -62,8 +62,9 @@
 string
 MingwBackend::GenerateProjectCFLAGS ()
 {
+	size_t i;
 	string clags;
-	for ( size_t i = 0; i < ProjectNode.includes.size (); i++ )
+	for ( i = 0; i < ProjectNode.includes.size (); i++ )
 	{
 		Include& include = *ProjectNode.includes[i];
 		if (clags.length () > 0)
@@ -71,7 +72,7 @@
 		clags += "-I" + include.directory;
 	}
 	
-	for ( size_t i = 0; i < ProjectNode.defines.size (); i++ )
+	for ( i = 0; i < ProjectNode.defines.size (); i++ )
 	{
 		Define& define = *ProjectNode.defines[i];
 		if ( clags.length () > 0 )
@@ -89,6 +90,8 @@
 void
 MingwBackend::GenerateGlobalVariables ()
 {
+	size_t i;
+
 	fprintf ( fMakefile, "host_gcc = gcc\n" );
 	fprintf ( fMakefile, "host_ar = ar\n" );
 	fprintf ( fMakefile, "host_ld = ld\n" );
@@ -98,6 +101,13 @@
 	fprintf ( fMakefile, "ar = ar\n" );
 	fprintf ( fMakefile, "dlltool = dlltool\n" );
 	fprintf ( fMakefile, "PROJECT_CFLAGS = %s\n", GenerateProjectCFLAGS ().c_str () );
+	for ( i = 0; i < ProjectNode.properties.size(); i++ )
+	{
+		Property& prop = *ProjectNode.properties[i];
+		fprintf ( fMakefile, "%s := %s\n",
+			prop.name.c_str(),
+			prop.value.c_str() );
+	}
 	fprintf ( fMakefile, "\n" );
 }
 

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-01-13 02:46:38 UTC (rev 13014)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-01-13 02:46:46 UTC (rev 13015)
@@ -323,7 +323,7 @@
 
 	if ( ifs && ifs->size() )
 	{
-		for ( size_t i = 0; i < module.ifs.size(); i++ )
+		for ( size_t i = 0; i < ifs->size(); i++ )
 		{
 			If& rIf = *(*ifs)[i];
 			if ( rIf.defines.size() || rIf.files.size() || rIf.ifs.size() )
@@ -377,7 +377,7 @@
 		{
 			fprintf (
 				fMakefile,
-				"ifeq ($(%s),\"%s\")\n",
+				"ifeq (\"$(%s)\",\"%s\")\n",
 				rIf.property.c_str(),
 				rIf.value.c_str() );
 			GenerateMacros (
@@ -395,11 +395,10 @@
 				"endif\n\n" );
 		}
 	}
-
 	fprintf (
 		fMakefile,
-		"%s_CFLAGS += $(PROJECT_CFLAGS)\n\n",
-		module.name.c_str () );
+		"%s += $(PROJECT_CFLAGS)\n\n",
+		cflags_macro.c_str () );
 }
 
 string

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp	2005-01-13 02:46:38 UTC (rev 13014)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/module.cpp	2005-01-13 02:46:46 UTC (rev 13015)
@@ -171,10 +171,20 @@
 	}
 	else if ( e.name == "if" )
 	{
-		pIf = new If ( e, *this );
-		ifs.push_back ( pIf );
+		If* pOldIf = pIf;
+		pIf = new If ( e, project, this );
+		if ( pOldIf )
+			pOldIf->ifs.push_back ( pIf );
+		else
+			ifs.push_back ( pIf );
 		subs_invalid = false;
 	}
+	else if ( e.name == "property" )
+	{
+		throw InvalidBuildFileException (
+			e.location,
+			"<property> is not a valid sub-element of <module>" );
+	}
 	if ( subs_invalid && e.subElements.size() > 0 )
 		throw InvalidBuildFileException (
 			e.location,
@@ -482,8 +492,10 @@
 }
 
 
-If::If ( const XMLElement& node_, const Module& module_ )
-	: node(node_), module(module_)
+If::If ( const XMLElement& node_,
+         const Project& project_,
+         const Module* module_ )
+	: node(node_), project(project_), module(module_)
 {
 	const XMLAttribute* att;
 
@@ -511,3 +523,25 @@
 If::ProcessXML()
 {
 }
+
+
+Property::Property ( const XMLElement& node_,
+                     const Project& project_,
+                     const Module* module_ )
+	: node(node_), project(project_), module(module_)
+{
+	const XMLAttribute* att;
+
+	att = node.GetAttribute ( "name", true );
+	assert(att);
+	name = att->value;
+
+	att = node.GetAttribute ( "value", true );
+	assert(att);
+	value = att->value;
+}
+
+void
+Property::ProcessXML()
+{
+}

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp
--- branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp	2005-01-13 02:46:38 UTC (rev 13014)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp	2005-01-13 02:46:46 UTC (rev 13015)
@@ -27,6 +27,10 @@
 		delete includes[i];
 	for ( i = 0; i < defines.size(); i++ )
 		delete defines[i];
+	for ( i = 0; i < properties.size(); i++ )
+		delete properties[i];
+	for ( i = 0; i < ifs.size(); i++ )
+		delete ifs[i];
 	delete head;
 }
 
@@ -77,10 +81,16 @@
 		includes[i]->ProcessXML();
 	for ( i = 0; i < defines.size(); i++ )
 		defines[i]->ProcessXML();
+	for ( i = 0; i < properties.size(); i++ )
+		properties[i]->ProcessXML();
+	for ( i = 0; i < ifs.size(); i++ )
+		ifs[i]->ProcessXML();
 }
 
 void
-Project::ProcessXMLSubElement ( const XMLElement& e, const string& path )
+Project::ProcessXMLSubElement ( const XMLElement& e,
+                                const string& path,
+                                If* pIf /*= NULL*/ )
 {
 	bool subs_invalid = false;
 	string subpath(path);
@@ -109,16 +119,38 @@
 	}
 	else if ( e.name == "define" )
 	{
-		defines.push_back ( new Define ( *this, e ) );
+		Define* define = new Define ( *this, e );
+		if ( pIf )
+			pIf->defines.push_back ( define );
+		else
+			defines.push_back ( define );
 		subs_invalid = true;
 	}
+	else if ( e.name == "if" )
+	{
+		If* pOldIf = pIf;
+		pIf = new If ( e, *this, NULL );
+		if ( pOldIf )
+			pOldIf->ifs.push_back ( pIf );
+		else
+			ifs.push_back ( pIf );
+		subs_invalid = false;
+	}
+	else if ( e.name == "property" )
+	{
+		Property* property = new Property ( e, *this, NULL );
+		if ( pIf )
+			pIf->properties.push_back ( property );
+		else
+			properties.push_back ( property );
+	}
 	if ( subs_invalid && e.subElements.size() )
 		throw InvalidBuildFileException (
 			e.location,
 			"<%s> cannot have sub-elements",
 			e.name.c_str() );
 	for ( size_t i = 0; i < e.subElements.size (); i++ )
-		ProcessXMLSubElement ( *e.subElements[i], subpath );
+		ProcessXMLSubElement ( *e.subElements[i], subpath, pIf );
 }
 
 Module*

Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h
--- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h	2005-01-13 02:46:38 UTC (rev 13014)
+++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h	2005-01-13 02:46:46 UTC (rev 13015)
@@ -32,6 +32,7 @@
 class Dependency;
 class ImportLibrary;
 class If;
+class Property;
 
 class Project
 {
@@ -43,6 +44,8 @@
 	std::vector<Module*> modules;
 	std::vector<Include*> includes;
 	std::vector<Define*> defines;
+	std::vector<Property*> properties;
+	std::vector<If*> ifs;
 
 	//Project ();
 	Project ( const std::string& filename );
@@ -53,7 +56,8 @@
 private:
 	void ReadXml ();
 	void ProcessXMLSubElement ( const XMLElement& e,
-	                            const std::string& path );
+	                            const std::string& path,
+	                            If* pIf = NULL );
 
 	// disable copy semantics
 	Project ( const Project& );
@@ -248,19 +252,37 @@
 {
 public:
 	const XMLElement& node;
-	const Module& module;
+	const Project& project;
+	const Module* module;
 	std::string property, value;
 	std::vector<File*> files;
 	std::vector<Define*> defines;
+	std::vector<Property*> properties;
 	std::vector<If*> ifs;
 
 	If ( const XMLElement& node_,
-	     const Module& module_ );
+	     const Project& project_,
+	     const Module* module_ );
 	~If();
 
 	void ProcessXML();
 };
 
+class Property
+{
+public:
+	const XMLElement& node;
+	const Project& project;
+	const Module* module;
+	std::string name, value;
+
+	Property ( const XMLElement& node_,
+	           const Project& project_,
+	           const Module* module_ );
+
+	void ProcessXML();
+};
+
 extern std::string
 FixSeparator ( const std::string& s );