Have Makefile.auto depend on xml build files
authorCasper Hornstrup <chorns@users.sourceforge.net>
Tue, 8 Mar 2005 11:15:39 +0000 (11:15 +0000)
committerCasper Hornstrup <chorns@users.sourceforge.net>
Tue, 8 Mar 2005 11:15:39 +0000 (11:15 +0000)
svn path=/branches/xmlbuildsystem/; revision=13872

reactos/Makefile
reactos/tools/rbuild/XML.cpp
reactos/tools/rbuild/XML.h
reactos/tools/rbuild/backend/mingw/mingw.cpp
reactos/tools/rbuild/backend/mingw/mingw.h
reactos/tools/rbuild/project.cpp
reactos/tools/rbuild/rbuild.h

index 64e4678..68543c4 100644 (file)
@@ -61,7 +61,7 @@ PREAUTO := \
        lib$(SEP)kernel32$(SEP)errcodes.rc
 
 Makefile.auto: $(RMKDIR_TARGET) $(BUILDNO_TARGET) $(NCI_SERVICE_FILES) $(WMC_TARGET) $(WRC_TARGET) \
        lib$(SEP)kernel32$(SEP)errcodes.rc
 
 Makefile.auto: $(RMKDIR_TARGET) $(BUILDNO_TARGET) $(NCI_SERVICE_FILES) $(WMC_TARGET) $(WRC_TARGET) \
-               $(RSYM_TARGET) $(CDMAKE_TARGET) $(RBUILD_TARGET) $(PREAUTO)
+               $(RSYM_TARGET) $(CDMAKE_TARGET) $(RBUILD_TARGET) $(PREAUTO) $(XMLBUILDFILES)
        tools$(SEP)rbuild$(SEP)rbuild$(EXEPOSTFIX) mingw
 
 
        tools$(SEP)rbuild$(SEP)rbuild$(EXEPOSTFIX) mingw
 
 
index f4cec1e..e3f42de 100644 (file)
@@ -31,27 +31,11 @@ static const char* WSEQ = " =\t\r\n";
 \r
 string working_directory;\r
 \r
 \r
 string working_directory;\r
 \r
-class XMLInclude\r
+XMLIncludes::~XMLIncludes()\r
 {\r
 {\r
-public:\r
-       XMLElement *e;\r
-       Path path;\r
-\r
-       XMLInclude ( XMLElement* e_, const Path& path_ )\r
-               : e(e_), path(path_)\r
-       {\r
-       }\r
-};\r
-\r
-class XMLIncludes : public vector<XMLInclude*>\r
-{\r
-public:\r
-       ~XMLIncludes()\r
-       {\r
-               for ( size_t i = 0; i < this->size(); i++ )\r
-                       delete (*this)[i];\r
-       }\r
-};\r
+       for ( size_t i = 0; i < this->size(); i++ )\r
+               delete (*this)[i];\r
+}\r
 \r
 void\r
 InitWorkingDirectory()\r
 \r
 void\r
 InitWorkingDirectory()\r
@@ -159,7 +143,18 @@ Path::Fixup ( const string& file, bool include_filename ) const
        return tmp;\r
 }\r
 \r
        return tmp;\r
 }\r
 \r
-/*static*/ string\r
+string\r
+Path::RelativeFromWorkingDirectory ()\r
+{\r
+       string out = "";\r
+       for ( size_t i = 0; i < path.size(); i++ )\r
+       {\r
+               out += "/" + path[i];\r
+       }\r
+       return RelativeFromWorkingDirectory ( out );\r
+}\r
+\r
+string\r
 Path::RelativeFromWorkingDirectory ( const string& path )\r
 {\r
        vector<string> vwork, vpath, vout;\r
 Path::RelativeFromWorkingDirectory ( const string& path )\r
 {\r
        vector<string> vwork, vpath, vout;\r
@@ -192,7 +187,7 @@ Path::RelativeFromWorkingDirectory ( const string& path )
        return out;\r
 }\r
 \r
        return out;\r
 }\r
 \r
-/*static*/ void\r
+void\r
 Path::Split ( vector<string>& out,\r
               const string& path,\r
               bool include_last )\r
 Path::Split ( vector<string>& out,\r
               const string& path,\r
               bool include_last )\r
@@ -500,10 +495,10 @@ XMLElement::GetAttribute ( const string& attribute,
 // it's parsed data. Keep calling this function until it returns NULL\r
 // (no more data)\r
 XMLElement*\r
 // it's parsed data. Keep calling this function until it returns NULL\r
 // (no more data)\r
 XMLElement*\r
-XMLParse(XMLFile& f,\r
-         XMLIncludes* includes,\r
-         const Path& path,\r
-         bool* pend_tag = NULL )\r
+XMLParse ( XMLFile& f,\r
+           XMLIncludes* includes,\r
+           const Path& path,\r
+           bool* pend_tag = NULL )\r
 {\r
        string token;\r
        if ( !f.get_token(token) )\r
 {\r
        string token;\r
        if ( !f.get_token(token) )\r
@@ -511,23 +506,28 @@ XMLParse(XMLFile& f,
        bool end_tag, is_include = false;\r
 \r
        while ( token[0] != '<'\r
        bool end_tag, is_include = false;\r
 \r
        while ( token[0] != '<'\r
-               || !strncmp ( token.c_str(), "<!--", 4 )\r
-               || !strncmp ( token.c_str(), "<?", 2 ) )\r
+               || !strncmp ( token.c_str (), "<!--", 4 )\r
+               || !strncmp ( token.c_str (), "<?", 2 ) )\r
        {\r
                if ( token[0] != '<' )\r
        {\r
                if ( token[0] != '<' )\r
-                       throw XMLSyntaxErrorException ( f.Location(),\r
+                       throw XMLSyntaxErrorException ( f.Location (),\r
                                                        "expecting xml tag, not '%s'",\r
                                                        "expecting xml tag, not '%s'",\r
-                                                       token.c_str() );\r
+                                                       token.c_str () );\r
                if ( !f.get_token(token) )\r
                        return NULL;\r
        }\r
 \r
                if ( !f.get_token(token) )\r
                        return NULL;\r
        }\r
 \r
-       XMLElement* e = new XMLElement ( f.Location() );\r
+       XMLElement* e = new XMLElement ( f.Location () );\r
        bool bNeedEnd = e->Parse ( token, end_tag );\r
 \r
        if ( e->name == "xi:include" && includes )\r
        {\r
        bool bNeedEnd = e->Parse ( token, end_tag );\r
 \r
        if ( e->name == "xi:include" && includes )\r
        {\r
-               includes->push_back ( new XMLInclude ( e, path ) );\r
+               XMLAttribute* att;\r
+               att = e->GetAttribute ( "href", true );\r
+               assert ( att );\r
+               string includeFile ( path.Fixup ( att->value, true ) );\r
+               string topIncludeFile ( Path::RelativeFromWorkingDirectory ( includeFile ) );\r
+               includes->push_back ( new XMLInclude ( e, path, topIncludeFile ) );\r
                is_include = true;\r
        }\r
 \r
                is_include = true;\r
        }\r
 \r
@@ -538,7 +538,7 @@ XMLParse(XMLFile& f,
                else if ( end_tag )\r
                {\r
                        delete e;\r
                else if ( end_tag )\r
                {\r
                        delete e;\r
-                       throw XMLSyntaxErrorException ( f.Location(),\r
+                       throw XMLSyntaxErrorException ( f.Location (),\r
                                                        "end tag '%s' not expected",\r
                                                        token.c_str() );\r
                        return NULL;\r
                                                        "end tag '%s' not expected",\r
                                                        token.c_str() );\r
                        return NULL;\r
@@ -546,11 +546,11 @@ XMLParse(XMLFile& f,
                return e;\r
        }\r
        bool bThisMixingErrorReported = false;\r
                return e;\r
        }\r
        bool bThisMixingErrorReported = false;\r
-       while ( f.more_tokens() )\r
+       while ( f.more_tokens () )\r
        {\r
        {\r
-               if ( f.next_is_text() )\r
+               if ( f.next_is_text () )\r
                {\r
                {\r
-                       if ( !f.get_token ( token ) || !token.size() )\r
+                       if ( !f.get_token ( token ) || token.size () == 0 )\r
                        {\r
                                throw InvalidBuildFileException (\r
                                        f.Location(),\r
                        {\r
                                throw InvalidBuildFileException (\r
                                        f.Location(),\r
@@ -559,18 +559,18 @@ XMLParse(XMLFile& f,
                        }\r
                        if ( e->subElements.size() && !bThisMixingErrorReported )\r
                        {\r
                        }\r
                        if ( e->subElements.size() && !bThisMixingErrorReported )\r
                        {\r
-                               throw XMLSyntaxErrorException ( f.Location(),\r
+                               throw XMLSyntaxErrorException ( f.Location (),\r
                                                                "mixing of inner text with sub elements" );\r
                                bThisMixingErrorReported = true;\r
                        }\r
                                                                "mixing of inner text with sub elements" );\r
                                bThisMixingErrorReported = true;\r
                        }\r
-                       if ( strchr ( token.c_str(), '>' ) )\r
+                       if ( strchr ( token.c_str (), '>' ) )\r
                        {\r
                        {\r
-                               throw XMLSyntaxErrorException ( f.Location(),\r
+                               throw XMLSyntaxErrorException ( f.Location (),\r
                                                                "invalid symbol '>'" );\r
                        }\r
                                                                "invalid symbol '>'" );\r
                        }\r
-                       if ( e->value.size() )\r
+                       if ( e->value.size() > 0 )\r
                        {\r
                        {\r
-                               throw XMLSyntaxErrorException ( f.Location(),\r
+                               throw XMLSyntaxErrorException ( f.Location (),\r
                                                                "multiple instances of inner text" );\r
                                e->value += " " + token;\r
                        }\r
                                                                "multiple instances of inner text" );\r
                                e->value += " " + token;\r
                        }\r
@@ -592,16 +592,16 @@ XMLParse(XMLFile& f,
                                if ( e->name != e2->name )\r
                                {\r
                                        delete e2;\r
                                if ( e->name != e2->name )\r
                                {\r
                                        delete e2;\r
-                                       throw XMLSyntaxErrorException ( f.Location(),\r
+                                       throw XMLSyntaxErrorException ( f.Location (),\r
                                                                        "end tag name mismatch" );\r
                                        break;\r
                                }\r
                                delete e2;\r
                                break;\r
                        }\r
                                                                        "end tag name mismatch" );\r
                                        break;\r
                                }\r
                                delete e2;\r
                                break;\r
                        }\r
-                       if ( e->value.size() && !bThisMixingErrorReported )\r
+                       if ( e->value.size () > 0 && !bThisMixingErrorReported )\r
                        {\r
                        {\r
-                               throw XMLSyntaxErrorException ( f.Location(),\r
+                               throw XMLSyntaxErrorException ( f.Location (),\r
                                                                "mixing of inner text with sub elements" );\r
                                bThisMixingErrorReported = true;\r
                        }\r
                                                                "mixing of inner text with sub elements" );\r
                                bThisMixingErrorReported = true;\r
                        }\r
@@ -624,31 +624,38 @@ XMLReadFile ( XMLFile& f, XMLElement& head, XMLIncludes& includes, const Path& p
 }\r
 \r
 XMLElement*\r
 }\r
 \r
 XMLElement*\r
-XMLLoadInclude ( XMLElement* e, const Path& path, XMLIncludes& includes )\r
+XMLLoadInclude ( XMLInclude& include,\r
+                    XMLIncludes& includes )\r
 {\r
        XMLAttribute* att;\r
 {\r
        XMLAttribute* att;\r
-       att = e->GetAttribute("href",true);\r
+       att = include.e->GetAttribute("href", true);\r
        assert(att);\r
 \r
        assert(att);\r
 \r
-       string file ( path.Fixup(att->value,true) );\r
+       string file ( include.path.Fixup(att->value, true) );\r
        string top_file ( Path::RelativeFromWorkingDirectory ( file ) );\r
        string top_file ( Path::RelativeFromWorkingDirectory ( file ) );\r
-       e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) );\r
+       include.e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) );\r
        XMLFile fInc;\r
        if ( !fInc.open ( file ) )\r
        {\r
        XMLFile fInc;\r
        if ( !fInc.open ( file ) )\r
        {\r
+               include.fileExists = false;\r
                // look for xi:fallback element\r
                // look for xi:fallback element\r
-               for ( size_t i = 0; i < e->subElements.size(); i++ )\r
+               for ( size_t i = 0; i < include.e->subElements.size (); i++ )\r
                {\r
                {\r
-                       XMLElement* e2 = e->subElements[i];\r
+                       XMLElement* e2 = include.e->subElements[i];\r
                        if ( e2->name == "xi:fallback" )\r
                        {\r
                                // now look for xi:include below...\r
                        if ( e2->name == "xi:fallback" )\r
                        {\r
                                // now look for xi:include below...\r
-                               for ( i = 0; i < e2->subElements.size(); i++ )\r
+                               for ( i = 0; i < e2->subElements.size (); i++ )\r
                                {\r
                                        XMLElement* e3 = e2->subElements[i];\r
                                        if ( e3->name == "xi:include" )\r
                                        {\r
                                {\r
                                        XMLElement* e3 = e2->subElements[i];\r
                                        if ( e3->name == "xi:include" )\r
                                        {\r
-                                               return XMLLoadInclude ( e3, path, includes );\r
+                                               att = e3->GetAttribute ( "href", true );\r
+                                               assert ( att );\r
+                                               string includeFile ( include.path.Fixup ( att->value, true ) );\r
+                                               string topIncludeFile ( Path::RelativeFromWorkingDirectory ( includeFile ) );\r
+                                               XMLInclude* fallbackInclude = new XMLInclude ( e3, include.path, topIncludeFile );\r
+                                               return XMLLoadInclude ( *fallbackInclude, includes );\r
                                        }\r
                                }\r
                                throw InvalidBuildFileException (\r
                                        }\r
                                }\r
                                throw InvalidBuildFileException (\r
@@ -661,37 +668,39 @@ XMLLoadInclude ( XMLElement* e, const Path& path, XMLIncludes& includes )
        }\r
        else\r
        {\r
        }\r
        else\r
        {\r
-               XMLElement* new_e = new XMLElement ( e->location );\r
+               include.fileExists = true;\r
+               XMLElement* new_e = new XMLElement ( include.e->location );\r
                new_e->name = "xi:included";\r
                new_e->name = "xi:included";\r
-               Path path2 ( path, att->value );\r
+               Path path2 ( include.path, att->value );\r
                XMLReadFile ( fInc, *new_e, includes, path2 );\r
                return new_e;\r
        }\r
 }\r
 \r
 XMLElement*\r
                XMLReadFile ( fInc, *new_e, includes, path2 );\r
                return new_e;\r
        }\r
 }\r
 \r
 XMLElement*\r
-XMLLoadFile ( const string& filename, const Path& path )\r
+XMLLoadFile ( const string& filename,\r
+                 const Path& path,\r
+                 XMLIncludes& includes )\r
 {\r
 {\r
-       XMLIncludes includes;\r
        XMLFile f;\r
 \r
        if ( !f.open ( filename ) )\r
                throw FileNotFoundException ( filename );\r
 \r
        XMLFile f;\r
 \r
        if ( !f.open ( filename ) )\r
                throw FileNotFoundException ( filename );\r
 \r
-       XMLElement* head = new XMLElement("(virtual)");\r
+       XMLElement* head = new XMLElement ( "(virtual)" );\r
 \r
        XMLReadFile ( f, *head, includes, path );\r
 \r
 \r
        XMLReadFile ( f, *head, includes, path );\r
 \r
-       for ( size_t i = 0; i < includes.size(); i++ )\r
+       for ( size_t i = 0; i < includes.size (); i++ )\r
        {\r
                XMLElement* e = includes[i]->e;\r
        {\r
                XMLElement* e = includes[i]->e;\r
-               XMLElement* e2 = XMLLoadInclude ( includes[i]->e, includes[i]->path, includes );\r
+               XMLElement* e2 = XMLLoadInclude ( *includes[i], includes );\r
                if ( !e2 )\r
                {\r
                        throw FileNotFoundException (\r
                if ( !e2 )\r
                {\r
                        throw FileNotFoundException (\r
-                               ssprintf("%s (referenced from %s)",\r
-                                       e->GetAttribute("top_href",true)->value.c_str(),\r
-                                       f.Location().c_str() ) );\r
+                               ssprintf ( "%s (referenced from %s)",\r
+                                       e->GetAttribute ( "top_href", true )->value.c_str (),\r
+                                       f.Location ().c_str () ) );\r
                }\r
                XMLElement* parent = e->parentElement;\r
                XMLElement** parent_container = NULL;\r
                }\r
                XMLElement* parent = e->parentElement;\r
                XMLElement** parent_container = NULL;\r
@@ -701,7 +710,7 @@ XMLLoadFile ( const string& filename, const Path& path )
                        throw Exception ( "internal tool error: xi:include doesn't have a parent" );\r
                        return NULL;\r
                }\r
                        throw Exception ( "internal tool error: xi:include doesn't have a parent" );\r
                        return NULL;\r
                }\r
-               for ( size_t j = 0; j < parent->subElements.size(); j++ )\r
+               for ( size_t j = 0; j < parent->subElements.size (); j++ )\r
                {\r
                        if ( parent->subElements[j] == e )\r
                        {\r
                {\r
                        if ( parent->subElements[j] == e )\r
                        {\r
@@ -720,7 +729,7 @@ XMLLoadFile ( const string& filename, const Path& path )
                e2->name = e->name;\r
                e2->attributes = e->attributes;\r
                *parent_container = e2;\r
                e2->name = e->name;\r
                e2->attributes = e->attributes;\r
                *parent_container = e2;\r
-               e->attributes.resize(0);\r
+               e->attributes.resize ( 0 );\r
                delete e;\r
        }\r
        return head;\r
                delete e;\r
        }\r
        return head;\r
index 39a1faf..82933d5 100644 (file)
@@ -1,10 +1,10 @@
-// XML.h\r
-\r
 #ifndef XML_H\r
 #define XML_H\r
 \r
 #include "pch.h"\r
 \r
 #ifndef XML_H\r
 #define XML_H\r
 \r
 #include "pch.h"\r
 \r
+class XMLElement;\r
+\r
 void\r
 InitWorkingDirectory();\r
 \r
 void\r
 InitWorkingDirectory();\r
 \r
@@ -23,6 +23,7 @@ public:
        Path ( const Path& cwd, const std::string& filename );\r
        std::string Fixup ( const std::string& filename, bool include_filename ) const;\r
 \r
        Path ( const Path& cwd, const std::string& filename );\r
        std::string Fixup ( const std::string& filename, bool include_filename ) const;\r
 \r
+       std::string RelativeFromWorkingDirectory ();\r
        static std::string RelativeFromWorkingDirectory ( const std::string& path );\r
 \r
        static void Split ( std::vector<std::string>& out,\r
        static std::string RelativeFromWorkingDirectory ( const std::string& path );\r
 \r
        static void Split ( std::vector<std::string>& out,\r
@@ -30,6 +31,26 @@ public:
                            bool include_last );\r
 };\r
 \r
                            bool include_last );\r
 };\r
 \r
+class XMLInclude\r
+{\r
+public:\r
+       XMLElement *e;\r
+       Path path;\r
+       std::string topIncludeFilename;\r
+       bool fileExists;\r
+\r
+       XMLInclude ( XMLElement* e_, const Path& path_, const std::string topIncludeFilename_ )\r
+               : e ( e_ ), path ( path_ ), topIncludeFilename ( topIncludeFilename_ )\r
+       {\r
+       }\r
+};\r
+\r
+class XMLIncludes : public std::vector<XMLInclude*>\r
+{\r
+public:\r
+       ~XMLIncludes();\r
+};\r
+\r
 class XMLFile\r
 {\r
        friend class XMLElement;\r
 class XMLFile\r
 {\r
        friend class XMLElement;\r
@@ -86,11 +107,8 @@ public:
 };\r
 \r
 XMLElement*\r
 };\r
 \r
 XMLElement*\r
-XMLLoadFile ( const std::string& filename, const Path& path );\r
-\r
-/*XMLElement*\r
-XMLParse(XMLFile& f,\r
-         const Path& path,\r
-         bool* pend_tag = NULL);*/\r
+XMLLoadFile ( const std::string& filename,\r
+                 const Path& path,\r
+                 XMLIncludes& includes );\r
 \r
 \r
-#endif//XML_H\r
+#endif // XML_H\r
index 2eb4de2..4e1a5f5 100644 (file)
@@ -31,6 +31,7 @@ MingwBackend::Process ()
        GenerateGlobalVariables ();\r
        GenerateAllTarget ();\r
        GenerateInitTarget ();\r
        GenerateGlobalVariables ();\r
        GenerateAllTarget ();\r
        GenerateInitTarget ();\r
+       GenerateXmlBuildFilesMacro();\r
        for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )\r
        {\r
                Module& module = *ProjectNode.modules[i];\r
        for ( size_t i = 0; i < ProjectNode.modules.size (); i++ )\r
        {\r
                Module& module = *ProjectNode.modules[i];\r
@@ -258,6 +259,47 @@ MingwBackend::GenerateInitTarget () const
                  "\n" );\r
 }\r
 \r
                  "\n" );\r
 }\r
 \r
+void\r
+MingwBackend::GenerateXmlBuildFilesMacro() const\r
+{\r
+       fprintf ( fMakefile,\r
+                 "XMLBUILDFILES = %s \\\n",\r
+                 ProjectNode.GetProjectFilename ().c_str () );\r
+       string xmlbuildFilenames;\r
+       int numberOfExistingFiles = 0;\r
+       for ( size_t i = 0; i < ProjectNode.xmlbuildfiles.size (); i++ )\r
+       {\r
+               XMLInclude& xmlbuildfile = *ProjectNode.xmlbuildfiles[i];\r
+               if ( !xmlbuildfile.fileExists )\r
+                       continue;\r
+               numberOfExistingFiles++;\r
+               if ( xmlbuildFilenames.length () > 0 )\r
+                       xmlbuildFilenames += " ";\r
+               xmlbuildFilenames += NormalizeFilename ( xmlbuildfile.topIncludeFilename );\r
+               if ( numberOfExistingFiles % 5 == 4 || i == ProjectNode.xmlbuildfiles.size () - 1 )\r
+               {\r
+                       fprintf ( fMakefile,\r
+                                 "\t%s",\r
+                                 xmlbuildFilenames.c_str ());\r
+                       if ( i == ProjectNode.xmlbuildfiles.size () - 1 )\r
+                       {\r
+                               fprintf ( fMakefile,\r
+                                         "\n" );\r
+                       }\r
+                       else\r
+                       {\r
+                               fprintf ( fMakefile,\r
+                                         " \\\n",\r
+                                         xmlbuildFilenames.c_str () );\r
+                       }\r
+                       xmlbuildFilenames.resize ( 0 );\r
+               }\r
+               numberOfExistingFiles++;\r
+       }\r
+       fprintf ( fMakefile,\r
+                 "\n" );\r
+}\r
+\r
 void\r
 MingwBackend::CheckAutomaticDependencies ()\r
 {\r
 void\r
 MingwBackend::CheckAutomaticDependencies ()\r
 {\r
index 6f70fd1..604176e 100644 (file)
@@ -30,6 +30,7 @@ private:
        void GenerateAllTarget () const;\r
        std::string GetBuildToolDependencies () const;\r
        void GenerateInitTarget () const;\r
        void GenerateAllTarget () const;\r
        std::string GetBuildToolDependencies () const;\r
        void GenerateInitTarget () const;\r
+       void GenerateXmlBuildFilesMacro() const;\r
        void CheckAutomaticDependencies ();\r
        FILE* fMakefile;\r
 };\r
        void CheckAutomaticDependencies ();\r
        FILE* fMakefile;\r
 };\r
index 50b4d22..e0a333d 100644 (file)
@@ -183,7 +183,7 @@ void
 Project::ReadXml ()\r
 {\r
        Path path;\r
 Project::ReadXml ()\r
 {\r
        Path path;\r
-       head = XMLLoadFile ( xmlfile, path );\r
+       head = XMLLoadFile ( xmlfile, path, xmlbuildfiles );\r
        node = NULL;\r
        for ( size_t i = 0; i < head->subElements.size (); i++ )\r
        {\r
        node = NULL;\r
        for ( size_t i = 0; i < head->subElements.size (); i++ )\r
        {\r
@@ -344,3 +344,11 @@ Project::LocateModule ( const string& name ) const
 \r
        return NULL;\r
 }\r
 \r
        return NULL;\r
 }\r
+\r
+std::string\r
+Project::GetProjectFilename () const\r
+{\r
+       return xmlfile;\r
+}\r
+\r
+       \r
index fd38de8..ee08699 100644 (file)
@@ -63,6 +63,7 @@ class Project
 public:\r
        std::string name;\r
        std::string makefile;\r
 public:\r
        std::string name;\r
        std::string makefile;\r
+       XMLIncludes xmlbuildfiles;\r
        std::vector<Module*> modules;\r
        std::vector<Include*> includes;\r
        std::vector<Define*> defines;\r
        std::vector<Module*> modules;\r
        std::vector<Include*> includes;\r
        std::vector<Define*> defines;\r
@@ -78,6 +79,7 @@ public:
        void ProcessXML ( const std::string& path );\r
        Module* LocateModule ( const std::string& name );\r
        const Module* LocateModule ( const std::string& name ) const;\r
        void ProcessXML ( const std::string& path );\r
        Module* LocateModule ( const std::string& name );\r
        const Module* LocateModule ( const std::string& name ) const;\r
+       std::string GetProjectFilename () const;\r
 private:\r
        const Property* LookupProperty ( const std::string& name ) const;\r
        void SetConfigurationOption ( char* s,\r
 private:\r
        const Property* LookupProperty ( const std::string& name ) const;\r
        void SetConfigurationOption ( char* s,\r