Author: hpoussin Date: Sun Sep 23 12:04:24 2007 New Revision: 29150
URL: http://svn.reactos.org/svn/reactos?rev=29150&view=rev Log: Continue rbuild cleanup (AutomaticDependency and SourceFile classes)
Modified: trunk/reactos/tools/rbuild/automaticdependency.cpp trunk/reactos/tools/rbuild/rbuild.h
Modified: trunk/reactos/tools/rbuild/automaticdependency.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rbuild/automaticdepen... ============================================================================== --- trunk/reactos/tools/rbuild/automaticdependency.cpp (original) +++ trunk/reactos/tools/rbuild/automaticdependency.cpp Sun Sep 23 12:04:24 2007 @@ -1,5 +1,6 @@ /* * Copyright (C) 2005 Casper S. Hornstrup + * Copyright (C) 2007 Hervé Poussineau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,48 +28,17 @@ using std::vector; using std::map;
-static std::string -GetExtension ( const std::string& filename ) -{ - size_t index = filename.find_last_of ( '/' ); - if (index == string::npos) index = 0; - string tmp = filename.substr( index, filename.size() - index ); - size_t ext_index = tmp.find_last_of( '.' ); - if (ext_index != string::npos) - return filename.substr ( index + ext_index, filename.size() ); - return ""; -} - SourceFile::SourceFile ( AutomaticDependency* automaticDependency, const Module& module, - const string& filename, - SourceFile* parent, - bool isNonAutomaticDependency ) - : automaticDependency ( automaticDependency ), + const File& file, + SourceFile* parent ) + : file ( file ), + automaticDependency ( automaticDependency), module ( module ), - filename ( filename ), - isNonAutomaticDependency ( isNonAutomaticDependency ), youngestLastWriteTime ( 0 ) { - if ( parent != NULL ) + if (parent != NULL ) parents.push_back ( parent ); - GetDirectoryAndFilenameParts (); -} - -void -SourceFile::GetDirectoryAndFilenameParts () -{ - size_t index = filename.find_last_of ( cSep ); - if ( index != string::npos ) - { - directoryPart = filename.substr ( 0, index ); - filenamePart = filename.substr ( index + 1, filename.length () - index ); - } - else - { - directoryPart = ""; - filenamePart = filename; - } }
void @@ -82,6 +52,7 @@ SourceFile::Open () { struct stat statbuf; + string filename = file.GetFullPath ();
Close (); FILE* f = fopen ( filename.c_str (), "rb" ); @@ -119,7 +90,14 @@ { while ( p < end ) { - if ( ( *p == '#') && ( end - p > 13 ) ) + if ( p != buf.c_str () ) + { + /* Go to end of line */ + while ( *p != '\n' && p < end ) + p++; + SkipWhitespace (); + } + if ( ( end - p > 13 ) && ( *p == '#') ) { bool include = false; p++; @@ -132,14 +110,14 @@ includeNext = false; include = true; } - if ( strncmp ( p, "include_next ", 13 ) == 0 ) - { + if ( strncmp ( p, "include_next ", 13 ) == 0 ) + { p += 13; includeNext = true; - include = true; - } + include = true; + } - if ( include ) + if ( include ) { SkipWhitespace (); if ( p < end ) @@ -200,58 +178,56 @@ }
bool -SourceFile::IsIncludedFrom ( const string& normalizedFilename ) -{ - if ( normalizedFilename == filename ) - return true; - - SourceFile* sourceFile = automaticDependency->RetrieveFromCache ( normalizedFilename ); +SourceFile::IsIncludedFrom ( const File& file ) +{ + SourceFile* sourceFile = automaticDependency->RetrieveFromCache ( file ); if ( sourceFile == NULL ) return false;
+ if ( sourceFile == this ) + return true; + return IsParentOf ( sourceFile, this ); }
+bool +SourceFile::CanProcessFile ( const File& file ) +{ + string extension = GetExtension ( file.file ); + std::transform ( extension.begin (), extension.end (), extension.begin (), tolower ); + if ( extension == ".h" ) + return true; + if ( extension == ".c" ) + return true; + if ( extension == ".cpp" ) + return true; + if ( extension == ".rc" ) + return true; + if ( extension == ".s" ) + return true; + if ( extension == ".nls" ) + return true; + if ( extension == ".idl" ) + return true; + if ( automaticDependency->project.configuration.Verbose ) + printf ( "Skipping file %s, as its extension is not recognized\n", file.file.name.c_str () ); + return false; +} + SourceFile* -SourceFile::GetParentSourceFile () -{ - if ( isNonAutomaticDependency ) +SourceFile::ParseFile ( const File& file ) +{ + if ( !CanProcessFile ( file ) ) return NULL; - return this; -} - -bool -SourceFile::CanProcessFile ( const string& extension ) -{ - if ( extension == ".h" || extension == ".H" ) - return true; - if ( extension == ".c" || extension == ".C" ) - return true; - if ( extension == ".cpp" || extension == ".CPP" ) - return true; - if ( extension == ".rc" || extension == ".RC" ) - return true; - if ( extension == ".s" || extension == ".S" ) - return true; - return false; -} - -SourceFile* -SourceFile::ParseFile ( const string& normalizedFilename ) -{ - string extension = GetExtension ( normalizedFilename ); - if ( CanProcessFile ( extension ) ) - { - if ( IsIncludedFrom ( normalizedFilename ) ) - return NULL; - - SourceFile* sourceFile = automaticDependency->RetrieveFromCacheOrParse ( module, - normalizedFilename, - GetParentSourceFile () ); - return sourceFile; - } - return NULL; + + if ( IsIncludedFrom ( file ) ) + return NULL; + + SourceFile* sourceFile = automaticDependency->RetrieveFromCacheOrParse ( module, + file, + this ); + return sourceFile; }
void @@ -260,48 +236,39 @@ Open (); while ( p < end ) { - string includedFilename ( "" ); - + string includedFilename; + bool searchCurrentDirectory; bool includeNext; while ( ReadInclude ( includedFilename, searchCurrentDirectory, includeNext ) ) { - string resolvedFilename ( "" ); + File resolvedFile ( SourceDirectory, "", "", false, "", false ) ; bool locatedFile = automaticDependency->LocateIncludedFile ( this, module, includedFilename, searchCurrentDirectory, includeNext, - resolvedFilename ); + resolvedFile ); if ( locatedFile ) { - SourceFile* sourceFile = ParseFile ( resolvedFilename ); + SourceFile* sourceFile = ParseFile ( *new File ( resolvedFile ) ); if ( sourceFile != NULL ) files.push_back ( sourceFile ); - } + } else if ( automaticDependency->project.configuration.Verbose ) + printf ( "Unable to find %c%s%c, included in %s%c%s\n", + searchCurrentDirectory ? '"' : '<', + includedFilename.c_str (), + searchCurrentDirectory ? '"' : '>', + this->file.file.relative_path.c_str (), + cSep, + this->file.file.name.c_str () ); } p++; } Close (); } - -string -SourceFile::Location () const -{ - int line = 1; - const char* end_of_line = strchr ( buf.c_str (), '\n' ); - while ( end_of_line && end_of_line < p ) - { - ++line; - end_of_line = strchr ( end_of_line + 1, '\n' ); - } - return ssprintf ( "%s(%i)", - filename.c_str (), - line ); -} -
AutomaticDependency::AutomaticDependency ( const Project& project ) : project ( project ) @@ -352,37 +319,14 @@ AutomaticDependency::ParseFile ( const Module& module, const File& file ) { - string normalizedFilename = NormalizeFilename ( file.GetFullPath () ); RetrieveFromCacheOrParse ( module, - normalizedFilename, + file, NULL ); -} - -string -AutomaticDependency::ReplaceVariable ( const string& name, - const string& value, - string path ) -{ - size_t i = path.find ( name ); - if ( i != string::npos ) - return path.replace ( i, name.length (), value ); - else - return path; -} - -string -AutomaticDependency::ResolveVariablesInPath ( const string& path ) -{ - string s = ReplaceVariable ( "$(INTERMEDIATE)", Environment::GetIntermediatePath (), path ); - s = ReplaceVariable ( "$(OUTPUT)", Environment::GetOutputPath (), s ); - s = ReplaceVariable ( "$(INSTALL)", Environment::GetInstallPath (), s ); - return s; }
bool AutomaticDependency::LocateIncludedFile ( const FileLocation& directory, - const string& includedFilename, - string& resolvedFilename ) + const string& includedFilename ) { string path; switch ( directory.directory ) @@ -408,28 +352,22 @@ path += sSep; path += directory.relative_path; } - + string normalizedFilename = NormalizeFilename ( path + sSep + includedFilename ); FILE* f = fopen ( normalizedFilename.c_str (), "rb" ); if ( f != NULL ) { fclose ( f ); - resolvedFilename = normalizedFilename; - return true; - } - resolvedFilename = ""; + return true; + } return false; }
void AutomaticDependency::GetIncludeDirectories ( vector<Include*>& includes, - const Module& module, - Include& currentDirectory, - bool searchCurrentDirectory ) + const Module& module ) { size_t i; - if ( searchCurrentDirectory ) - includes.push_back( ¤tDirectory ); for ( i = 0; i < module.non_if_data.includes.size (); i++ ) includes.push_back( module.non_if_data.includes[i] ); for ( i = 0; i < module.project.non_if_data.includes.size (); i++ ) @@ -442,44 +380,61 @@ const string& includedFilename, bool searchCurrentDirectory, bool includeNext, - string& resolvedFilename ) + File& resolvedFile ) { vector<Include*> includes; - Include currentDirectory ( module.project, SourceDirectory, sourceFile->directoryPart ); - GetIncludeDirectories ( includes, module, currentDirectory, searchCurrentDirectory ); + string includedFileDir; + Include currentDirectory ( module.project, SourceDirectory, sourceFile->file.file.relative_path ); + if ( searchCurrentDirectory ) + includes.push_back ( ¤tDirectory ); + GetIncludeDirectories ( includes, module ); + for ( size_t j = 0; j < includes.size (); j++ ) { Include& include = *includes[j]; if ( LocateIncludedFile ( *include.directory, - includedFilename, - resolvedFilename ) ) - { - if ( includeNext && stricmp ( resolvedFilename.c_str (), - sourceFile->filename.c_str () ) == 0 ) + includedFilename ) ) + { + if ( includeNext && + include.directory->directory == sourceFile->file.file.directory && + include.directory->relative_path == sourceFile->file.file.relative_path ) + { + includeNext = false; continue; + } + resolvedFile.file.directory = include.directory->directory; + size_t index = includedFilename.find_last_of ( "/\" ); + if ( index == string::npos ) + { + resolvedFile.file.name = includedFilename; + resolvedFile.file.relative_path = include.directory->relative_path; + } + else + { + resolvedFile.file.relative_path = NormalizeFilename ( + include.directory->relative_path + sSep + + includedFilename.substr ( 0, index ) ); + resolvedFile.file.name = includedFilename.substr ( index + 1 ); + } return true; } } - /*printf ( "Unable to find %s, included in %s.\n", - includedFilename.c_str (), - sourceFile->filename.c_str () );*/ - resolvedFilename = ""; return false; }
SourceFile* AutomaticDependency::RetrieveFromCacheOrParse ( const Module& module, - const string& filename, + const File& file, SourceFile* parentSourceFile ) { + string filename = file.GetFullPath(); SourceFile* sourceFile = sourcefile_map[filename]; if ( sourceFile == NULL ) { sourceFile = new SourceFile ( this, module, - ResolveVariablesInPath ( filename ), - parentSourceFile, - false ); + file, + parentSourceFile ); sourcefile_map[filename] = sourceFile; sourceFile->Parse (); } @@ -489,8 +444,9 @@ }
SourceFile* -AutomaticDependency::RetrieveFromCache ( const string& filename ) -{ +AutomaticDependency::RetrieveFromCache ( const File& file ) +{ + string filename = file.GetFullPath(); return sourcefile_map[filename]; }
@@ -543,9 +499,7 @@ for ( size_t fi = 0; fi < files.size (); fi++ ) { File& file = *files[fi]; - string normalizedFilename = NormalizeFilename ( file.GetFullPath () ); - - SourceFile* sourceFile = RetrieveFromCache ( normalizedFilename ); + SourceFile* sourceFile = RetrieveFromCache ( file ); if ( sourceFile != NULL ) { CheckAutomaticDependenciesForFile ( sourceFile ); @@ -554,13 +508,15 @@ { if ( verbose ) { - printf ( "Marking %s for rebuild due to younger file %s\n", - sourceFile->filename.c_str (), - sourceFile->youngestFile->filename.c_str () ); + printf ( "Marking %s%c%s for rebuild due to younger file %s%c%s\n", + sourceFile->file.file.relative_path.c_str (), + cSep, sourceFile->file.file.name.c_str (), + sourceFile->youngestFile->file.file.relative_path.c_str (), + cSep, sourceFile->youngestFile->file.file.name.c_str () ); } timebuf.actime = sourceFile->youngestLastWriteTime; timebuf.modtime = sourceFile->youngestLastWriteTime; - utime ( sourceFile->filename.c_str (), + utime ( sourceFile->file.GetFullPath ().c_str (), &timebuf ); } } @@ -583,7 +539,7 @@ for ( size_t i = 0; i < sourceFile->files.size (); i++ ) { SourceFile* childSourceFile = sourceFile->files[i]; - + CheckAutomaticDependenciesForFile ( childSourceFile ); if ( ( childSourceFile->youngestLastWriteTime > sourceFile->youngestLastWriteTime ) || ( childSourceFile->lastWriteTime > sourceFile->youngestLastWriteTime ) )
Modified: trunk/reactos/tools/rbuild/rbuild.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rbuild/rbuild.h?rev=2... ============================================================================== --- trunk/reactos/tools/rbuild/rbuild.h (original) +++ trunk/reactos/tools/rbuild/rbuild.h Sun Sep 23 12:04:24 2007 @@ -725,35 +725,27 @@ public: SourceFile ( AutomaticDependency* automaticDependency, const Module& module, - const std::string& filename, - SourceFile* parent, - bool isNonAutomaticDependency ); - SourceFile* ParseFile ( const std::string& normalizedFilename ); + const File& file, + SourceFile* parent ); void Parse (); - std::string Location () const; - std::vector<SourceFile*> files; + std::vector<SourceFile*> files; /* List of files included in this file */ + const File& file; AutomaticDependency* automaticDependency; const Module& module; - std::string filename; - std::string filenamePart; - std::string directoryPart; std::vector<SourceFile*> parents; /* List of files, this file is included from */ - bool isNonAutomaticDependency; - std::string cachedDependencies; time_t lastWriteTime; time_t youngestLastWriteTime; /* Youngest last write time of this file and all children */ SourceFile* youngestFile; private: - void GetDirectoryAndFilenameParts (); void Close (); void Open (); void SkipWhitespace (); bool ReadInclude ( std::string& filename, bool& searchCurrentDirectory, bool& includeNext ); - bool IsIncludedFrom ( const std::string& normalizedFilename ); - SourceFile* GetParentSourceFile (); - bool CanProcessFile ( const std::string& extension ); + bool IsIncludedFrom ( const File& file ); + SourceFile* ParseFile(const File& file); + bool CanProcessFile ( const File& file ); bool IsParentOf ( const SourceFile* parent, const SourceFile* child ); std::string buf; @@ -771,18 +763,17 @@ AutomaticDependency ( const Project& project ); ~AutomaticDependency (); bool LocateIncludedFile ( const FileLocation& directory, - const std::string& includedFilename, - std::string& resolvedFilename ); + const std::string& includedFilename ); bool LocateIncludedFile ( SourceFile* sourceFile, const Module& module, const std::string& includedFilename, bool searchCurrentDirectory, bool includeNext, - std::string& resolvedFilename ); + File& resolvedFile ); SourceFile* RetrieveFromCacheOrParse ( const Module& module, - const std::string& filename, + const File& file, SourceFile* parentSourceFile ); - SourceFile* RetrieveFromCache ( const std::string& filename ); + SourceFile* RetrieveFromCache ( const File& file ); void CheckAutomaticDependencies ( bool verbose ); void CheckAutomaticDependenciesForModule ( Module& module, bool verbose ); @@ -792,19 +783,13 @@ bool verbose ); void CheckAutomaticDependenciesForFile ( SourceFile* sourceFile ); void GetIncludeDirectories ( std::vector<Include*>& includes, - const Module& module, - Include& currentDirectory, - bool searchCurrentDirectory ); + const Module& module ); void GetModuleFiles ( const Module& module, std::vector<File*>& files ) const; void ParseFiles (); void ParseFiles ( const Module& module ); void ParseFile ( const Module& module, const File& file ); - std::string ReplaceVariable ( const std::string& name, - const std::string& value, - std::string path ); - std::string ResolveVariablesInPath ( const std::string& path ); std::map<std::string, SourceFile*> sourcefile_map; };