Have Makefile.auto depend on xml build files Modified: branches/xmlbuildsystem/reactos/Makefile Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h _____
Modified: branches/xmlbuildsystem/reactos/Makefile --- branches/xmlbuildsystem/reactos/Makefile 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/Makefile 2005-03-08 11:15:39 UTC (rev 13872) @@ -61,7 +61,7 @@
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
_____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/tools/rbuild/XML.cpp 2005-03-08 11:15:39 UTC (rev 13872) @@ -31,28 +31,12 @@
string working_directory;
-class XMLInclude +XMLIncludes::~XMLIncludes() { -public: - XMLElement *e; - Path path; + for ( size_t i = 0; i < this->size(); i++ ) + delete (*this)[i]; +}
- XMLInclude ( XMLElement* e_, const Path& path_ ) - : e(e_), path(path_) - { - } -}; - -class XMLIncludes : public vector<XMLInclude*> -{ -public: - ~XMLIncludes() - { - for ( size_t i = 0; i < this->size(); i++ ) - delete (*this)[i]; - } -}; - void InitWorkingDirectory() { @@ -159,7 +143,18 @@ return tmp; }
-/*static*/ string +string +Path::RelativeFromWorkingDirectory () +{ + string out = ""; + for ( size_t i = 0; i < path.size(); i++ ) + { + out += "/" + path[i]; + } + return RelativeFromWorkingDirectory ( out ); +} + +string Path::RelativeFromWorkingDirectory ( const string& path ) { vector<string> vwork, vpath, vout; @@ -192,7 +187,7 @@ return out; }
-/*static*/ void +void Path::Split ( vector<string>& out, const string& path, bool include_last ) @@ -500,10 +495,10 @@ // it's parsed data. Keep calling this function until it returns NULL // (no more data) XMLElement* -XMLParse(XMLFile& f, - XMLIncludes* includes, - const Path& path, - bool* pend_tag = NULL ) +XMLParse ( XMLFile& f, + XMLIncludes* includes, + const Path& path, + bool* pend_tag = NULL ) { string token; if ( !f.get_token(token) ) @@ -511,23 +506,28 @@ bool end_tag, is_include = false;
while ( token[0] != '<' - || !strncmp ( token.c_str(), "<!--", 4 ) - || !strncmp ( token.c_str(), "<?", 2 ) ) + || !strncmp ( token.c_str (), "<!--", 4 ) + || !strncmp ( token.c_str (), "<?", 2 ) ) { if ( token[0] != '<' ) - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (), "expecting xml tag, not '%s'", - token.c_str() ); + token.c_str () ); if ( !f.get_token(token) ) return NULL; }
- XMLElement* e = new XMLElement ( f.Location() ); + XMLElement* e = new XMLElement ( f.Location () ); bool bNeedEnd = e->Parse ( token, end_tag );
if ( e->name == "xi:include" && includes ) { - includes->push_back ( new XMLInclude ( e, path ) ); + XMLAttribute* att; + att = e->GetAttribute ( "href", true ); + assert ( att ); + string includeFile ( path.Fixup ( att->value, true ) ); + string topIncludeFile ( Path::RelativeFromWorkingDirectory ( includeFile ) ); + includes->push_back ( new XMLInclude ( e, path, topIncludeFile ) ); is_include = true; }
@@ -538,7 +538,7 @@ else if ( end_tag ) { delete e; - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (), "end tag '%s' not expected", token.c_str() ); return NULL; @@ -546,11 +546,11 @@ return e; } bool bThisMixingErrorReported = false; - while ( f.more_tokens() ) + while ( f.more_tokens () ) { - if ( f.next_is_text() ) + if ( f.next_is_text () ) { - if ( !f.get_token ( token ) || !token.size() ) + if ( !f.get_token ( token ) || token.size () == 0 ) { throw InvalidBuildFileException ( f.Location(), @@ -559,18 +559,18 @@ } if ( e->subElements.size() && !bThisMixingErrorReported ) { - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (), "mixing of inner text with sub elements" ); bThisMixingErrorReported = true; } - if ( strchr ( token.c_str(), '>' ) ) + if ( strchr ( token.c_str (), '>' ) ) { - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (), "invalid symbol '>'" ); } - if ( e->value.size() ) + if ( e->value.size() > 0 ) { - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (),
"multiple instances of inner text" ); e->value += " " + token; } @@ -592,16 +592,16 @@ if ( e->name != e2->name ) { delete e2; - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (),
"end tag name mismatch" ); break; } delete e2; break; } - if ( e->value.size() && !bThisMixingErrorReported ) + if ( e->value.size () > 0 && !bThisMixingErrorReported ) { - throw XMLSyntaxErrorException ( f.Location(), + throw XMLSyntaxErrorException ( f.Location (), "mixing of inner text with sub elements" ); bThisMixingErrorReported = true; } @@ -624,31 +624,38 @@ }
XMLElement* -XMLLoadInclude ( XMLElement* e, const Path& path, XMLIncludes& includes ) +XMLLoadInclude ( XMLInclude& include, + XMLIncludes& includes ) { XMLAttribute* att; - att = e->GetAttribute("href",true); + att = include.e->GetAttribute("href", true); assert(att);
- string file ( path.Fixup(att->value,true) ); + string file ( include.path.Fixup(att->value, true) ); string top_file ( Path::RelativeFromWorkingDirectory ( file ) ); - e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) ); + include.e->attributes.push_back ( new XMLAttribute ( "top_href", top_file ) ); XMLFile fInc; if ( !fInc.open ( file ) ) { + include.fileExists = false; // look for xi:fallback element - for ( size_t i = 0; i < e->subElements.size(); i++ ) + for ( size_t i = 0; i < include.e->subElements.size (); i++ ) { - XMLElement* e2 = e->subElements[i]; + XMLElement* e2 = include.e->subElements[i]; if ( e2->name == "xi:fallback" ) { // now look for xi:include below... - for ( i = 0; i < e2->subElements.size(); i++ ) + for ( i = 0; i < e2->subElements.size (); i++ ) { XMLElement* e3 = e2->subElements[i]; if ( e3->name == "xi:include" ) { - return XMLLoadInclude ( e3, path, includes ); + att = e3->GetAttribute ( "href", true ); + assert ( att ); + string includeFile ( include.path.Fixup ( att->value, true ) ); + string topIncludeFile ( Path::RelativeFromWorkingDirectory ( includeFile ) ); + XMLInclude* fallbackInclude = new XMLInclude ( e3, include.path, topIncludeFile ); + return XMLLoadInclude ( *fallbackInclude, includes ); } } throw InvalidBuildFileException ( @@ -661,37 +668,39 @@ } else { - XMLElement* new_e = new XMLElement ( e->location ); + include.fileExists = true; + XMLElement* new_e = new XMLElement ( include.e->location ); new_e->name = "xi:included"; - Path path2 ( path, att->value ); + Path path2 ( include.path, att->value ); XMLReadFile ( fInc, *new_e, includes, path2 ); return new_e; } }
XMLElement* -XMLLoadFile ( const string& filename, const Path& path ) +XMLLoadFile ( const string& filename, + const Path& path, + XMLIncludes& includes ) { - XMLIncludes includes; XMLFile f;
if ( !f.open ( filename ) ) throw FileNotFoundException ( filename );
- XMLElement* head = new XMLElement("(virtual)"); + XMLElement* head = new XMLElement ( "(virtual)" );
XMLReadFile ( f, *head, includes, path );
- for ( size_t i = 0; i < includes.size(); i++ ) + for ( size_t i = 0; i < includes.size (); i++ ) { XMLElement* e = includes[i]->e; - XMLElement* e2 = XMLLoadInclude ( includes[i]->e, includes[i]->path, includes ); + XMLElement* e2 = XMLLoadInclude ( *includes[i], includes ); if ( !e2 ) { throw FileNotFoundException ( - ssprintf("%s (referenced from %s)", - e->GetAttribute("top_href",true)->value.c_str(), - f.Location().c_str() ) ); + ssprintf ( "%s (referenced from %s)", + e->GetAttribute ( "top_href", true )->value.c_str (), + f.Location ().c_str () ) ); } XMLElement* parent = e->parentElement; XMLElement** parent_container = NULL; @@ -701,7 +710,7 @@ throw Exception ( "internal tool error: xi:include doesn't have a parent" ); return NULL; } - for ( size_t j = 0; j < parent->subElements.size(); j++ ) + for ( size_t j = 0; j < parent->subElements.size (); j++ ) { if ( parent->subElements[j] == e ) { @@ -720,7 +729,7 @@ e2->name = e->name; e2->attributes = e->attributes; *parent_container = e2; - e->attributes.resize(0); + e->attributes.resize ( 0 ); delete e; } return head; _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/XML.h --- branches/xmlbuildsystem/reactos/tools/rbuild/XML.h 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/tools/rbuild/XML.h 2005-03-08 11:15:39 UTC (rev 13872) @@ -1,10 +1,10 @@
-// XML.h - #ifndef XML_H #define XML_H
#include "pch.h"
+class XMLElement; + void InitWorkingDirectory();
@@ -23,6 +23,7 @@ Path ( const Path& cwd, const std::string& filename ); std::string Fixup ( const std::string& filename, bool include_filename ) const;
+ std::string RelativeFromWorkingDirectory (); static std::string RelativeFromWorkingDirectory ( const std::string& path );
static void Split ( std::vectorstd::string& out, @@ -30,6 +31,26 @@ bool include_last ); };
+class XMLInclude +{ +public: + XMLElement *e; + Path path; + std::string topIncludeFilename; + bool fileExists; + + XMLInclude ( XMLElement* e_, const Path& path_, const std::string topIncludeFilename_ ) + : e ( e_ ), path ( path_ ), topIncludeFilename ( topIncludeFilename_ ) + { + } +}; + +class XMLIncludes : public std::vector<XMLInclude*> +{ +public: + ~XMLIncludes(); +}; + class XMLFile { friend class XMLElement; @@ -86,11 +107,8 @@ };
XMLElement* -XMLLoadFile ( const std::string& filename, const Path& path ); +XMLLoadFile ( const std::string& filename, + const Path& path, + XMLIncludes& includes );
-/*XMLElement* -XMLParse(XMLFile& f, - const Path& path, - bool* pend_tag = NULL);*/ - -#endif//XML_H +#endif // XML_H _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.cpp 2005-03-08 11:15:39 UTC (rev 13872) @@ -31,6 +31,7 @@
GenerateGlobalVariables (); GenerateAllTarget (); GenerateInitTarget (); + GenerateXmlBuildFilesMacro(); for ( size_t i = 0; i < ProjectNode.modules.size (); i++ ) { Module& module = *ProjectNode.modules[i]; @@ -259,6 +260,47 @@ }
void +MingwBackend::GenerateXmlBuildFilesMacro() const +{ + fprintf ( fMakefile, + "XMLBUILDFILES = %s \\n", + ProjectNode.GetProjectFilename ().c_str () ); + string xmlbuildFilenames; + int numberOfExistingFiles = 0; + for ( size_t i = 0; i < ProjectNode.xmlbuildfiles.size (); i++ ) + { + XMLInclude& xmlbuildfile = *ProjectNode.xmlbuildfiles[i]; + if ( !xmlbuildfile.fileExists ) + continue; + numberOfExistingFiles++; + if ( xmlbuildFilenames.length () > 0 ) + xmlbuildFilenames += " "; + xmlbuildFilenames += NormalizeFilename ( xmlbuildfile.topIncludeFilename ); + if ( numberOfExistingFiles % 5 == 4 || i == ProjectNode.xmlbuildfiles.size () - 1 ) + { + fprintf ( fMakefile, + "\t%s", + xmlbuildFilenames.c_str ()); + if ( i == ProjectNode.xmlbuildfiles.size () - 1 ) + { + fprintf ( fMakefile, + "\n" ); + } + else + { + fprintf ( fMakefile, + " \\n", + xmlbuildFilenames.c_str () ); + } + xmlbuildFilenames.resize ( 0 ); + } + numberOfExistingFiles++; + } + fprintf ( fMakefile, + "\n" ); +} + +void MingwBackend::CheckAutomaticDependencies () { AutomaticDependency automaticDependency ( ProjectNode ); _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h --- branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/tools/rbuild/backend/mingw/mingw.h 2005-03-08 11:15:39 UTC (rev 13872) @@ -30,6 +30,7 @@
void GenerateAllTarget () const; std::string GetBuildToolDependencies () const; void GenerateInitTarget () const; + void GenerateXmlBuildFilesMacro() const; void CheckAutomaticDependencies (); FILE* fMakefile; }; _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp --- branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/tools/rbuild/project.cpp 2005-03-08 11:15:39 UTC (rev 13872) @@ -183,7 +183,7 @@
Project::ReadXml () { Path path; - head = XMLLoadFile ( xmlfile, path ); + head = XMLLoadFile ( xmlfile, path, xmlbuildfiles ); node = NULL; for ( size_t i = 0; i < head->subElements.size (); i++ ) { @@ -344,3 +344,11 @@
return NULL; } + +std::string +Project::GetProjectFilename () const +{ + return xmlfile; +} + + _____
Modified: branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h --- branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h 2005-03-07 22:25:39 UTC (rev 13871) +++ branches/xmlbuildsystem/reactos/tools/rbuild/rbuild.h 2005-03-08 11:15:39 UTC (rev 13872) @@ -63,6 +63,7 @@
public: std::string name; std::string makefile; + XMLIncludes xmlbuildfiles; std::vector<Module*> modules; std::vector<Include*> includes; std::vector<Define*> defines; @@ -78,6 +79,7 @@ void ProcessXML ( const std::string& path ); Module* LocateModule ( const std::string& name ); const Module* LocateModule ( const std::string& name ) const; + std::string GetProjectFilename () const; private: const Property* LookupProperty ( const std::string& name ) const; void SetConfigurationOption ( char* s,