add 'location' information to a couple exceptions that should have it
authorRoyce Mitchell III <royce3@ev1.net>
Sun, 9 Jan 2005 03:29:46 +0000 (03:29 +0000)
committerRoyce Mitchell III <royce3@ev1.net>
Sun, 9 Jan 2005 03:29:46 +0000 (03:29 +0000)
fixed bug I introduced in MingwBackend::ProcessModule()
fixed bug in std::map usage, apparently map<const char*,...> is a bad idea
let make do some work, create variables to hold include list for each module

svn path=/branches/xmlbuildsystem/; revision=12901

reactos/tools/rbuild/XML.cpp
reactos/tools/rbuild/backend/backend.cpp
reactos/tools/rbuild/backend/backend.h
reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/modulehandler.cpp
reactos/tools/rbuild/backend/mingw/modulehandler.h
reactos/tools/rbuild/exception.cpp
reactos/tools/rbuild/exception.h
reactos/tools/rbuild/module.cpp
reactos/tools/rbuild/rbuild.h
reactos/tools/rbuild/tests/moduletest.cpp

index 833a033..16767a5 100644 (file)
@@ -422,7 +422,8 @@ XMLElement::GetAttribute ( const string& attribute,
        }\r
        if ( required )\r
        {\r
-               throw RequiredAttributeNotFoundException ( attribute,\r
+               throw RequiredAttributeNotFoundException ( location,\r
+                                                          attribute,\r
                                                           name );\r
        }\r
        return NULL;\r
@@ -441,7 +442,8 @@ XMLElement::GetAttribute ( const string& attribute,
        }\r
        if ( required )\r
        {\r
-               throw RequiredAttributeNotFoundException ( attribute,\r
+               throw RequiredAttributeNotFoundException ( location,\r
+                                                          attribute,\r
                                                           name );\r
        }\r
        return NULL;\r
index 566a18f..a54558c 100644 (file)
@@ -8,25 +8,26 @@ using std::string;
 using std::vector;\r
 using std::map;\r
 \r
-map<const char*,Backend::Factory*>* Backend::Factory::factories = NULL;\r
+map<string,Backend::Factory*>* Backend::Factory::factories = NULL;\r
 \r
 Backend::Factory::Factory ( const std::string& name_ )\r
 {\r
        string name(name_);\r
        strlwr ( &name[0] );\r
        if ( !factories )\r
-               factories = new map<const char*,Factory*>;\r
-       (*factories)[name.c_str()] = this;\r
+               factories = new map<string,Factory*>;\r
+       (*factories)[name] = this;\r
 }\r
 \r
 /*static*/ Backend*\r
-Backend::Factory::Create ( const std::string& name, Project& project )\r
+Backend::Factory::Create ( const string& name,\r
+                           Project& project )\r
 {\r
        string sname ( name );\r
        strlwr ( &sname[0] );\r
        if ( !factories || !factories->size() )\r
                throw Exception ( "internal tool error: no registered factories" );\r
-       Backend::Factory* f = (*factories)[sname.c_str()];\r
+       Backend::Factory* f = (*factories)[sname];\r
        if ( !f )\r
        {\r
                throw UnknownBackendException ( sname );\r
index 1b4fe9f..2c7497a 100644 (file)
@@ -12,7 +12,7 @@ class Backend
 public:\r
        class Factory\r
        {\r
-               static std::map<const char*,Factory*>* factories;\r
+               static std::map<std::string,Factory*>* factories;\r
 \r
        protected:\r
 \r
@@ -22,7 +22,8 @@ public:
                virtual Backend* operator() ( Project& ) = 0;\r
 \r
        public:\r
-               static Backend* Create ( const std::string& name, Project& project );\r
+               static Backend* Create ( const std::string& name,\r
+                                        Project& project );\r
 \r
        private:\r
        };\r
index 5ae9ea1..423c4f6 100644 (file)
@@ -90,7 +90,9 @@ MingwBackend::GenerateAllTarget ()
 void\r
 MingwBackend::ProcessModule ( Module& module )\r
 {\r
-       MingwModuleHandler* h = MingwModuleHandler::LookupHandler ( module.name );\r
+       MingwModuleHandler* h = MingwModuleHandler::LookupHandler (\r
+               module.node.location,\r
+               module.stype );\r
        h->Process ( module );\r
 }\r
 \r
index 02e25ad..bf89db3 100644 (file)
@@ -10,7 +10,7 @@ using std::string;
 using std::vector;\r
 using std::map;\r
 \r
-map<const char*,MingwModuleHandler*>*\r
+map<string,MingwModuleHandler*>*\r
 MingwModuleHandler::handler_map = NULL;\r
 \r
 FILE*\r
@@ -21,8 +21,8 @@ MingwModuleHandler::MingwModuleHandler ( const char* moduletype_ )
        string moduletype ( moduletype_ );\r
        strlwr ( &moduletype[0] );\r
        if ( !handler_map )\r
-               handler_map = new map<const char*,MingwModuleHandler*>;\r
-       (*handler_map)[moduletype.c_str()] = this;\r
+               handler_map = new map<string,MingwModuleHandler*>;\r
+       (*handler_map)[moduletype] = this;\r
 }\r
 \r
 /*static*/ void\r
@@ -32,16 +32,17 @@ MingwModuleHandler::SetMakefile ( FILE* f )
 }\r
 \r
 /*static*/ MingwModuleHandler*\r
-MingwModuleHandler::LookupHandler ( const string& moduletype_ )\r
+MingwModuleHandler::LookupHandler ( const string& location,\r
+                                    const string& moduletype_ )\r
 {\r
        string moduletype ( moduletype_ );\r
        strlwr ( &moduletype[0] );\r
        if ( !handler_map )\r
                throw Exception ( "internal tool error: no registered module handlers" );\r
-       MingwModuleHandler* h = (*handler_map)[moduletype.c_str()];\r
+       MingwModuleHandler* h = (*handler_map)[moduletype];\r
        if ( !h )\r
        {\r
-               throw UnknownModuleTypeException ( moduletype );\r
+               throw UnknownModuleTypeException ( location, moduletype );\r
                return NULL;\r
        }\r
        return h;\r
@@ -217,6 +218,16 @@ MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector<Includ
        return parameters;\r
 }\r
 \r
+void\r
+MingwModuleHandler::GenerateGccModuleIncludeVariable ( const Module& module ) const\r
+{\r
+       string name ( module.name + "_INCLUDES" );\r
+       fprintf ( fMakefile,\r
+                 "%s := %s\n",\r
+                 name.c_str(),\r
+                 GenerateGccIncludeParameters(module).c_str() );\r
+}\r
+\r
 string\r
 MingwModuleHandler::GenerateGccIncludeParameters ( const Module& module ) const\r
 {\r
@@ -234,12 +245,7 @@ string
 MingwModuleHandler::GenerateGccParameters ( const Module& module ) const\r
 {\r
        string parameters = GenerateGccDefineParameters ( module );\r
-       string s = GenerateGccIncludeParameters ( module );\r
-       if ( s.length () > 0 )\r
-       {\r
-               parameters += " ";\r
-               parameters += s;\r
-       }\r
+       parameters += ssprintf(" $(%s_INCLUDES)",module.name.c_str());\r
        return parameters;\r
 }\r
 \r
@@ -250,6 +256,8 @@ MingwModuleHandler::GenerateObjectFileTargets ( const Module& module,
        if ( module.files.size () == 0 )\r
                return;\r
        \r
+       GenerateGccModuleIncludeVariable ( module );\r
+\r
        for ( size_t i = 0; i < module.files.size (); i++ )\r
        {\r
                string sourceFilename = module.files[i]->name;\r
@@ -378,7 +386,7 @@ MingwModuleHandler::GenerateInvocations ( const Module& module ) const
        {\r
                const Invoke& invoke = *module.invocations[i];\r
 \r
-               if ( invoke.invokeModule->type != BuildTool )\r
+               if ( invoke.invokeModule->etype != BuildTool )\r
                        throw InvalidBuildFileException ( module.node.location,\r
                                                      "Only modules of type buildtool can be invoked." );\r
 \r
index 4304a73..bd48398 100644 (file)
@@ -6,13 +6,14 @@
 class MingwModuleHandler\r
 {\r
 public:\r
-       static std::map<const char*,MingwModuleHandler*>* handler_map;\r
+       static std::map<std::string,MingwModuleHandler*>* handler_map;\r
 \r
        MingwModuleHandler ( const char* moduletype_ );\r
        virtual ~MingwModuleHandler() {}\r
 \r
        static void SetMakefile ( FILE* f );\r
-       static MingwModuleHandler* LookupHandler ( const std::string& moduletype_ );\r
+       static MingwModuleHandler* LookupHandler ( const std::string& location,\r
+                                                  const std::string& moduletype_ );\r
        virtual void Process ( const Module& module ) = 0;\r
 \r
 protected:\r
@@ -42,6 +43,7 @@ private:
        std::string GenerateGccDefineParametersFromVector ( const std::vector<Define*>& defines ) const;\r
        std::string GenerateGccDefineParameters ( const Module& module ) const;\r
        std::string GenerateGccIncludeParametersFromVector ( const std::vector<Include*>& includes ) const;\r
+       void GenerateGccModuleIncludeVariable ( const Module& module ) const;\r
        std::string GenerateGccIncludeParameters ( const Module& module ) const;\r
        std::string GenerateGccParameters ( const Module& module ) const;\r
        void GenerateObjectFileTargets ( const Module& module,\r
index 798773a..b897fdf 100644 (file)
@@ -93,17 +93,23 @@ XMLSyntaxErrorException::XMLSyntaxErrorException ( const string& location,
 }\r
 \r
 \r
-RequiredAttributeNotFoundException::RequiredAttributeNotFoundException ( const string& attributeName,\r
-                                                                         const string& elementName )\r
-       : InvalidBuildFileException ( "Required attribute '%s' not found on '%s'.",\r
+RequiredAttributeNotFoundException::RequiredAttributeNotFoundException (\r
+       const string& location,\r
+       const string& attributeName,\r
+       const string& elementName )\r
+       : InvalidBuildFileException ( location,\r
+                                     "Required attribute '%s' not found on '%s'.",\r
                                      attributeName.c_str (),\r
                                      elementName.c_str ())\r
 {\r
 }\r
 \r
-InvalidAttributeValueException::InvalidAttributeValueException ( const string& name,\r
-                                                                    const string& value )\r
-       : InvalidBuildFileException ( "Attribute '%s' has an invalid value '%s'.",\r
+InvalidAttributeValueException::InvalidAttributeValueException (\r
+       const string& location,\r
+       const string& name,\r
+       const string& value )\r
+       : InvalidBuildFileException ( location,\r
+                                     "Attribute '%s' has an invalid value '%s'.",\r
                                      name.c_str (),\r
                                      value.c_str () )\r
 {\r
@@ -119,12 +125,14 @@ BackendNameConflictException::BackendNameConflictException ( const string& name
 \r
 UnknownBackendException::UnknownBackendException ( const string& name )\r
        : Exception ( "Unknown Backend requested: '%s'",\r
-                    name.c_str() )\r
+                     name.c_str() )\r
 {\r
 }\r
 \r
-UnknownModuleTypeException::UnknownModuleTypeException ( const string& moduletype )\r
-       : Exception ( "module type requested: '%s'",\r
-                     moduletype.c_str() )\r
+UnknownModuleTypeException::UnknownModuleTypeException ( const string& location,\r
+                                                         const string& moduletype )\r
+       : InvalidBuildFileException ( location,\r
+                                     "module type requested: '%s'",\r
+                                     moduletype.c_str() )\r
 {\r
 }\r
index c3c8423..8c434a7 100644 (file)
@@ -66,7 +66,8 @@ public:
 class RequiredAttributeNotFoundException : public InvalidBuildFileException\r
 {\r
 public:\r
-       RequiredAttributeNotFoundException ( const std::string& attributeName,\r
+       RequiredAttributeNotFoundException ( const std::string& location,\r
+                                            const std::string& attributeName,\r
                                             const std::string& elementName );\r
 };\r
 \r
@@ -74,7 +75,8 @@ public:
 class InvalidAttributeValueException : public InvalidBuildFileException\r
 {\r
 public:\r
-       InvalidAttributeValueException ( const std::string& name,\r
+       InvalidAttributeValueException ( const std::string& location,\r
+                                        const std::string& name,\r
                                         const std::string& value );\r
 };\r
 \r
@@ -92,10 +94,11 @@ public:
        UnknownBackendException ( const std::string& name );\r
 };\r
 \r
-class UnknownModuleTypeException : public Exception\r
+class UnknownModuleTypeException : public InvalidBuildFileException\r
 {\r
 public:\r
-       UnknownModuleTypeException ( const std::string& moduletype );\r
+       UnknownModuleTypeException ( const std::string& location,\r
+                                    const std::string& moduletype );\r
 };\r
 \r
 #endif /* __EXCEPTION_H */\r
index 85a5dc2..e8ea879 100644 (file)
@@ -38,7 +38,9 @@ Module::Module ( const Project& project,
 \r
        att = moduleNode.GetAttribute ( "type", true );\r
        assert(att);\r
-       type = GetModuleType ( *att );\r
+       stype = att->value;\r
+       strlwr ( &stype[0] );\r
+       etype = GetModuleType ( node.location, *att );\r
 \r
        att = moduleNode.GetAttribute ( "extension", false );\r
        if (att != NULL)\r
@@ -136,7 +138,7 @@ Module::ProcessXMLSubElement ( const XMLElement& e,
 }\r
 \r
 ModuleType\r
-Module::GetModuleType ( const XMLAttribute& attribute )\r
+Module::GetModuleType ( const string& location, const XMLAttribute& attribute )\r
 {\r
        if ( attribute.value == "buildtool" )\r
                return BuildTool;\r
@@ -144,14 +146,15 @@ Module::GetModuleType ( const XMLAttribute& attribute )
                return StaticLibrary;\r
        if ( attribute.value == "kernelmodedll" )\r
                return KernelModeDLL;\r
-       throw InvalidAttributeValueException ( attribute.name,\r
+       throw InvalidAttributeValueException ( location,\r
+                                              attribute.name,\r
                                               attribute.value );\r
 }\r
 \r
 string\r
 Module::GetDefaultModuleExtension () const\r
 {\r
-       switch (type)\r
+       switch (etype)\r
        {\r
                case BuildTool:\r
                        return EXEPOSTFIX;\r
@@ -264,7 +267,7 @@ Invoke::ProcessXML()
                                module.name.c_str(),\r
                                att->value.c_str() );\r
        }\r
-       \r
+\r
        for ( size_t i = 0; i < node.subElements.size (); i++ )\r
                ProcessXMLSubElement ( *node.subElements[i] );\r
 }\r
index dd78dfe..7124552 100644 (file)
@@ -39,7 +39,7 @@ public:
        std::vector<Module*> modules;\r
        std::vector<Include*> includes;\r
        std::vector<Define*> defines;\r
-       \r
+\r
        Project ();\r
        Project ( const std::string& filename );\r
        ~Project ();\r
@@ -71,19 +71,21 @@ public:
        std::string name;\r
        std::string extension;\r
        std::string path;\r
-       ModuleType type;\r
+       ModuleType etype;\r
+       std::string stype;\r
        std::vector<File*> files;\r
        std::vector<Library*> libraries;\r
        std::vector<Include*> includes;\r
        std::vector<Define*> defines;\r
        std::vector<Invoke*> invocations;\r
        std::vector<Dependency*> dependencies;\r
-       \r
+\r
        Module ( const Project& project,\r
                 const XMLElement& moduleNode,\r
                 const std::string& modulePath );\r
        ~Module ();\r
-       ModuleType GetModuleType (const XMLAttribute& attribute );\r
+       ModuleType GetModuleType ( const std::string& location,\r
+                                  const XMLAttribute& attribute );\r
        std::string GetBasePath() const;\r
        std::string GetPath () const;\r
        std::string GetTargets () const;\r
index 42777d2..0c7580e 100644 (file)
@@ -9,7 +9,7 @@ void ModuleTest::Run()
        ARE_EQUAL(2, project.modules.size());\r
 \r
        Module& module1 = *project.modules[0];\r
-       IS_TRUE(module1.type == BuildTool);\r
+       IS_TRUE(module1.etype == BuildTool);\r
        ARE_EQUAL(2, module1.files.size());\r
        ARE_EQUAL("." SSEP "dir1" SSEP "file1.c", module1.files[0]->name);\r
        ARE_EQUAL("." SSEP "dir1" SSEP "file2.c", module1.files[1]->name);\r
@@ -17,7 +17,7 @@ void ModuleTest::Run()
        ARE_EQUAL(0, module1.libraries.size());\r
 \r
        Module& module2 = *project.modules[1];\r
-       IS_TRUE(module2.type == KernelModeDLL);\r
+       IS_TRUE(module2.etype == KernelModeDLL);\r
        ARE_EQUAL(2, module2.files.size());\r
        ARE_EQUAL("." SSEP "dir2" SSEP "file3.c", module2.files[0]->name);\r
        ARE_EQUAL("." SSEP "dir2" SSEP "file4.c", module2.files[1]->name);\r