* 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.