* Support enabling/disabling modules depending on configuration.
* Enable halup for MP=0 configuration and halmp for MP=1 configuration.
Modified: trunk/reactos/hal/halx86/mp/halmp.xml
Modified: trunk/reactos/hal/halx86/up/halup.xml
Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp
Modified: trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
Modified: trunk/reactos/tools/rbuild/module.cpp
Modified: trunk/reactos/tools/rbuild/project.cpp
Modified: trunk/reactos/tools/rbuild/rbuild.h
Modified: trunk/reactos/tools/rbuild/rbuild.txt

Modified: trunk/reactos/hal/halx86/mp/halmp.xml
--- trunk/reactos/hal/halx86/mp/halmp.xml	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/hal/halx86/mp/halmp.xml	2005-06-05 11:22:16 UTC (rev 15801)
@@ -1,4 +1,4 @@
-<module name="halmp" type="kernelmodedll">
+<module if="${MP}" name="halmp" type="kernelmodedll" installbase="system32" installname="hal.dll">
 	<importlibrary definition="../../hal/hal.def" />
 	<include base="hal_generic">../include</include>
 	<include base="ntoskrnl">include</include>

Modified: trunk/reactos/hal/halx86/up/halup.xml
--- trunk/reactos/hal/halx86/up/halup.xml	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/hal/halx86/up/halup.xml	2005-06-05 11:22:16 UTC (rev 15801)
@@ -1,4 +1,4 @@
-<module name="halup" type="kernelmodedll" installbase="system32" installname="hal.dll">
+<module ifnot="${MP}" name="halup" type="kernelmodedll" installbase="system32" installname="hal.dll">
 	<importlibrary definition="../../hal/hal.def" />
 	<bootstrap base="reactos" nameoncd="hal.dll" />
 	<include base="hal_generic">../include</include>

Modified: trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp
--- trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/tools/rbuild/backend/mingw/mingw.cpp	2005-06-05 11:22:16 UTC (rev 15801)
@@ -256,6 +256,8 @@
 	for ( i = 0; i < ProjectNode.modules.size (); i++ )
 	{
 		Module& module = *ProjectNode.modules[i];
+		if ( !module.enabled )
+			continue;
 		MingwModuleHandler* h = MingwModuleHandler::InstanciateHandler (
 			module,
 			this );
@@ -547,6 +549,8 @@
 	for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
 	{
 		Module& module = *ProjectNode.modules[i];
+		if ( !module.enabled )
+			continue;
 		if ( module.type == BuildTool )
 		{
 			if ( dependencies.length () > 0 )
@@ -845,6 +849,8 @@
 	for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
 	{
 		const Module& module = *ProjectNode.modules[i];
+		if ( !module.enabled )
+			continue;
 		if ( module.installName.length () > 0 )
 		{
 			string targetFilenameNoFixup;
@@ -915,6 +921,8 @@
 	for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
 	{
 		const Module& module = *ProjectNode.modules[i];
+		if ( !module.enabled )
+			continue;
 		if ( module.installName.length () > 0 )
 		{
 			string sourceFilename = MingwModuleHandler::PassThruCacheDirectory (
@@ -1004,6 +1012,8 @@
 	for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )
 	{
 		const Module& module = *ProjectNode.modules[i];
+		if ( !module.enabled )
+			continue;
 		if ( module.type == Test )
 			out.push_back ( module.name );
 	}

Modified: trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp
--- trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/tools/rbuild/backend/mingw/modulehandler.cpp	2005-06-05 11:22:16 UTC (rev 15801)
@@ -2573,6 +2573,8 @@
 	for ( size_t i = 0; i < module.project.modules.size (); i++ )
 	{
 		const Module& m = *module.project.modules[i];
+		if ( !m.enabled )
+			continue;
 		if ( m.bootstrap != NULL )
 		{
 			string sourceFilename = PassThruCacheDirectory (
@@ -2619,6 +2621,8 @@
 	for ( size_t i = 0; i < module.project.modules.size (); i++ )
 	{
 		const Module& m = *module.project.modules[i];
+		if ( !m.enabled )
+			continue;
 		if ( m.bootstrap != NULL )
 		{
 			string targetDirectory ( bootcdDirectory + SSEP + m.bootstrap->base );
@@ -2664,6 +2668,8 @@
 	for ( size_t i = 0; i < module.project.modules.size (); i++ )
 	{
 		const Module& m = *module.project.modules[i];
+		if ( !m.enabled )
+			continue;
 		if ( m.bootstrap != NULL )
 		{
 			string filename = PassThruCacheDirectory (
@@ -2795,6 +2801,8 @@
 	for ( size_t i = 0; i < module.project.modules.size (); i++ )
 	{
 		const Module& m = *module.project.modules[i];
+		if ( !m.enabled )
+			continue;
 		if ( m.installName.length () > 0 )
 		{
 			string sourceFilename = MingwModuleHandler::PassThruCacheDirectory (

Modified: trunk/reactos/tools/rbuild/module.cpp
--- trunk/reactos/tools/rbuild/module.cpp	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/tools/rbuild/module.cpp	2005-06-05 11:22:16 UTC (rev 15801)
@@ -99,6 +99,15 @@
 	return FixSeparator ( relativeNormalizedPath );
 }
 
+bool
+GetBooleanValue ( const string& value )
+{
+	if ( value == "1" )
+		return true;
+	else
+		return false;
+}
+
 IfableData::~IfableData()
 {
 	size_t i;
@@ -153,11 +162,21 @@
 		                                  __LINE__,
 		                                  "Module created with non-<module> node" );
 
-	xmlbuildFile = Path::RelativeFromWorkingDirectory ( moduleNode.xmlFile->filename() );
+	xmlbuildFile = Path::RelativeFromWorkingDirectory ( moduleNode.xmlFile->filename () );
 
 	path = FixSeparator ( modulePath );
 
-	const XMLAttribute* att = moduleNode.GetAttribute ( "name", true );
+	enabled = true;
+
+	const XMLAttribute* att = moduleNode.GetAttribute ( "if", false );
+	if ( att != NULL )
+		enabled = GetBooleanValue ( project.ResolveProperties ( att->value ) );
+
+	att = moduleNode.GetAttribute ( "ifnot", false );
+	if ( att != NULL )
+		enabled = !GetBooleanValue ( project.ResolveProperties ( att->value ) );
+
+	att = moduleNode.GetAttribute ( "name", true );
 	assert(att);
 	name = att->value;
 

Modified: trunk/reactos/tools/rbuild/project.cpp
--- trunk/reactos/tools/rbuild/project.cpp	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/tools/rbuild/project.cpp	2005-06-05 11:22:16 UTC (rev 15801)
@@ -85,10 +85,49 @@
 	return NULL;
 }
 
+string
+Project::ResolveNextProperty ( string& s ) const
+{
+	size_t i = s.find ( "${" );
+	if ( i == string::npos )
+		i = s.find ( "$(" );
+	if ( i != string::npos )
+	{
+		string endCharacter;
+		if ( s[i + 1] == '{' )
+			endCharacter = "}";
+		else
+			endCharacter = ")";
+		size_t j = s.find ( endCharacter );
+		if ( j != string::npos )
+		{
+			int propertyNameLength = j - i - 2;
+			string propertyName = s.substr ( i + 2, propertyNameLength );
+			const Property* property = LookupProperty ( propertyName );
+			if ( property != NULL )
+				return s.replace ( i, propertyNameLength + 3, property->value );
+		}
+	}
+	return s;
+}
+
+string
+Project::ResolveProperties ( const string& s ) const
+{
+	string s2 = s;
+	string s3;
+	do
+	{
+		s3 = s2;
+		s2 = ResolveNextProperty ( s3 );
+	} while ( s2 != s3 );
+	return s2;
+}
+
 void
 Project::SetConfigurationOption ( char* s,
-	                              string name,
-	                              string* alternativeName )
+                                  string name,
+                                  string* alternativeName )
 {
 	const Property* property = LookupProperty ( name );
 	if ( property != NULL && property->value.length () > 0 )

Modified: trunk/reactos/tools/rbuild/rbuild.h
--- trunk/reactos/tools/rbuild/rbuild.h	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/tools/rbuild/rbuild.h	2005-06-05 11:22:16 UTC (rev 15801)
@@ -134,7 +134,9 @@
 	Module* LocateModule ( const std::string& name );
 	const Module* LocateModule ( const std::string& name ) const;
 	std::string GetProjectFilename () const;
+	std::string ResolveProperties ( const std::string& s ) const;
 private:
+	std::string ResolveNextProperty ( std::string& s ) const;
 	const Property* LookupProperty ( const std::string& name ) const;
 	void SetConfigurationOption ( char* s,
 	                              std::string name,
@@ -210,6 +212,7 @@
 	std::string installName;
 	bool useWRC;
 	bool enableWarnings;
+	bool enabled;
 
 	Module ( const Project& project,
 	         const XMLElement& moduleNode,

Modified: trunk/reactos/tools/rbuild/rbuild.txt
--- trunk/reactos/tools/rbuild/rbuild.txt	2005-06-05 11:05:47 UTC (rev 15800)
+++ trunk/reactos/tools/rbuild/rbuild.txt	2005-06-05 11:22:16 UTC (rev 15801)
@@ -107,11 +107,13 @@
 There can be zero or more modules per xml build file.
 
 Syntax:
-	<module name="msvcrt" type="win32dll" extension=".dll" entrypoint="_DllMain@12" baseaddress="0x70000000" mangledsymbols="true" installbase="system32" installname="msvcrt.dll" usewrc="false" warnings="true">
+	<module if="${MP}" ifnot="${MP}" name="msvcrt" type="win32dll" extension=".dll" entrypoint="_DllMain@12" baseaddress="0x70000000" mangledsymbols="true" installbase="system32" installname="msvcrt.dll" usewrc="false" warnings="true">
 		...
 	</module>
 
 Attributes:
+	if - If the value is 1, then the module is enabled, otherwise it is disabled. A disabled module is not processed.
+	ifnot - If the value is 1, then the module is disabled, otherwise it is enabled. A disabled module is not processed.
 	name - Name of the module. Also the base name of the generated file if such file is generated for the particular module type.
 	type - Type of module. See below for an explanation of module types.
 	extension - Extension of the generated file if such file is generated for the particular module type.