Check automatic dependencies of referenced object library modules on make <module>_depends

svn path=/trunk/; revision=16513
This commit is contained in:
Casper Hornstrup 2005-07-08 19:55:30 +00:00
parent 876fc32e53
commit 91269f987b
5 changed files with 61 additions and 45 deletions

View file

@ -11,7 +11,7 @@ using std::vector;
using std::map; using std::map;
SourceFile::SourceFile ( AutomaticDependency* automaticDependency, SourceFile::SourceFile ( AutomaticDependency* automaticDependency,
Module& module, const Module& module,
const string& filename, const string& filename,
SourceFile* parent, SourceFile* parent,
bool isNonAutomaticDependency ) bool isNonAutomaticDependency )
@ -294,7 +294,7 @@ AutomaticDependency::ParseFiles ()
} }
void void
AutomaticDependency::GetModuleFiles ( Module& module, AutomaticDependency::GetModuleFiles ( const Module& module,
vector<File*>& files ) const vector<File*>& files ) const
{ {
for ( size_t i = 0; i < module.non_if_data.files.size (); i++ ) for ( size_t i = 0; i < module.non_if_data.files.size (); i++ )
@ -307,7 +307,7 @@ AutomaticDependency::GetModuleFiles ( Module& module,
} }
void void
AutomaticDependency::ParseFiles ( Module& module ) AutomaticDependency::ParseFiles ( const Module& module )
{ {
vector<File*> files; vector<File*> files;
GetModuleFiles ( module, files ); GetModuleFiles ( module, files );
@ -316,7 +316,7 @@ AutomaticDependency::ParseFiles ( Module& module )
} }
void void
AutomaticDependency::ParseFile ( Module& module, AutomaticDependency::ParseFile ( const Module& module,
const File& file ) const File& file )
{ {
string normalizedFilename = NormalizeFilename ( file.name ); string normalizedFilename = NormalizeFilename ( file.name );
@ -355,7 +355,7 @@ AutomaticDependency::GetFilename ( const string& filename )
void void
AutomaticDependency::GetIncludeDirectories ( vector<Include*>& includes, AutomaticDependency::GetIncludeDirectories ( vector<Include*>& includes,
Module& module, const Module& module,
Include& currentDirectory, Include& currentDirectory,
bool searchCurrentDirectory ) bool searchCurrentDirectory )
{ {
@ -369,7 +369,7 @@ AutomaticDependency::GetIncludeDirectories ( vector<Include*>& includes,
bool bool
AutomaticDependency::LocateIncludedFile ( SourceFile* sourceFile, AutomaticDependency::LocateIncludedFile ( SourceFile* sourceFile,
Module& module, const Module& module,
const string& includedFilename, const string& includedFilename,
bool searchCurrentDirectory, bool searchCurrentDirectory,
bool includeNext, bool includeNext,
@ -396,9 +396,9 @@ AutomaticDependency::LocateIncludedFile ( SourceFile* sourceFile,
} }
SourceFile* SourceFile*
AutomaticDependency::RetrieveFromCacheOrParse ( Module& module, AutomaticDependency::RetrieveFromCacheOrParse ( const Module& module,
const string& filename, const string& filename,
SourceFile* parentSourceFile ) SourceFile* parentSourceFile )
{ {
SourceFile* sourceFile = sourcefile_map[filename]; SourceFile* sourceFile = sourcefile_map[filename];
if ( sourceFile == NULL ) if ( sourceFile == NULL )
@ -429,25 +429,41 @@ AutomaticDependency::CheckAutomaticDependencies ( bool verbose )
for ( size_t mi = 0; mi < project.modules.size (); mi++ ) for ( size_t mi = 0; mi < project.modules.size (); mi++ )
{ {
Module& module = *project.modules[mi]; Module& module = *project.modules[mi];
CheckAutomaticDependencies ( module, verbose, false ); CheckAutomaticDependencies ( module, verbose );
} }
} }
void void
AutomaticDependency::CheckAutomaticDependencies ( Module& module, AutomaticDependency::GetModulesToCheck ( Module& module, vector<const Module*>& modules )
bool verbose )
{ {
CheckAutomaticDependencies ( module, verbose, true ); modules.push_back ( &module );
for ( size_t i = 0; i < module.non_if_data.libraries.size (); i++ )
{
Library& library = *module.non_if_data.libraries[i];
if ( library.importedModule->type != ObjectLibrary )
break;
modules.push_back ( library.importedModule );
}
/* FIXME: Collect libraries in IFs here */
} }
void void
AutomaticDependency::CheckAutomaticDependencies ( Module& module, AutomaticDependency::CheckAutomaticDependenciesForModule ( Module& module,
bool verbose, bool verbose )
bool parseFiles )
{ {
if ( parseFiles ) vector<const Module*> modules;
ParseFiles ( module ); GetModulesToCheck ( module, modules );
for ( size_t mi = 0; mi < modules.size (); mi++ )
ParseFiles ( *modules[mi] );
for ( size_t mi = 0; mi < modules.size (); mi++ )
CheckAutomaticDependencies ( *modules[mi], verbose );
}
void
AutomaticDependency::CheckAutomaticDependencies ( const Module& module,
bool verbose )
{
struct utimbuf timebuf; struct utimbuf timebuf;
vector<File*> files; vector<File*> files;
GetModuleFiles ( module, files ); GetModuleFiles ( module, files );

View file

@ -325,8 +325,8 @@ MingwBackend::CheckAutomaticDependenciesForModuleOnly ()
printf ( "Checking automatic dependencies for module '%s'...", printf ( "Checking automatic dependencies for module '%s'...",
module->name.c_str () ); module->name.c_str () );
AutomaticDependency automaticDependency ( ProjectNode ); AutomaticDependency automaticDependency ( ProjectNode );
automaticDependency.CheckAutomaticDependencies ( *module, automaticDependency.CheckAutomaticDependenciesForModule ( *module,
configuration.Verbose ); configuration.Verbose );
printf ( "done\n" ); printf ( "done\n" );
} }
} }

View file

@ -615,7 +615,7 @@ MingwModuleHandler::GenerateImportLibraryDependenciesFromVector (
dependencies += " \\\n\t\t", wrap_count = 0; dependencies += " \\\n\t\t", wrap_count = 0;
else if ( dependencies.size () > 0 ) else if ( dependencies.size () > 0 )
dependencies += " "; dependencies += " ";
dependencies += GetImportLibraryDependency ( *libraries[i]->imported_module ); dependencies += GetImportLibraryDependency ( *libraries[i]->importedModule );
} }
return dependencies; return dependencies;
} }
@ -1274,7 +1274,7 @@ MingwModuleHandler::GenerateBuildNonSymbolStrippedCode ()
void void
MergeStringVector ( const vector<string>& input, MergeStringVector ( const vector<string>& input,
vector<string>& output ) vector<string>& output )
{ {
int wrap_at = 25; int wrap_at = 25;
string s; string s;
@ -1603,20 +1603,20 @@ MingwModuleHandler::GetRpcHeaderDependencies (
for ( size_t i = 0; i < module.non_if_data.libraries.size (); i++ ) for ( size_t i = 0; i < module.non_if_data.libraries.size (); i++ )
{ {
Library& library = *module.non_if_data.libraries[i]; Library& library = *module.non_if_data.libraries[i];
if ( library.imported_module->type == RpcServer || if ( library.importedModule->type == RpcServer ||
library.imported_module->type == RpcClient ) library.importedModule->type == RpcClient )
{ {
for ( size_t j = 0; j < library.imported_module->non_if_data.files.size (); j++ ) for ( size_t j = 0; j < library.importedModule->non_if_data.files.size (); j++ )
{ {
File& file = *library.imported_module->non_if_data.files[j]; File& file = *library.importedModule->non_if_data.files[j];
string extension = GetExtension ( file.name ); string extension = GetExtension ( file.name );
if ( extension == ".idl" || extension == ".IDL" ) if ( extension == ".idl" || extension == ".IDL" )
{ {
string basename = GetBasename ( file.name ); string basename = GetBasename ( file.name );
if ( library.imported_module->type == RpcServer ) if ( library.importedModule->type == RpcServer )
dependencies.push_back ( GetRpcServerHeaderFilename ( basename ) ); dependencies.push_back ( GetRpcServerHeaderFilename ( basename ) );
if ( library.imported_module->type == RpcClient ) if ( library.importedModule->type == RpcClient )
dependencies.push_back ( GetRpcClientHeaderFilename ( basename ) ); dependencies.push_back ( GetRpcClientHeaderFilename ( basename ) );
} }
} }

View file

@ -817,14 +817,14 @@ Library::Library ( const XMLElement& _node,
: node(_node), : node(_node),
module(_module), module(_module),
name(_name), name(_name),
imported_module(_module.project.LocateModule(_name)) importedModule(_module.project.LocateModule(_name))
{ {
if ( module.name == name ) if ( module.name == name )
throw InvalidBuildFileException ( throw InvalidBuildFileException (
node.location, node.location,
"module '%s' cannot link against itself", "module '%s' cannot link against itself",
name.c_str() ); name.c_str() );
if ( !imported_module ) if ( !importedModule )
throw InvalidBuildFileException ( throw InvalidBuildFileException (
node.location, node.location,
"module '%s' trying to import non-existant module '%s'", "module '%s' trying to import non-existant module '%s'",

View file

@ -316,7 +316,7 @@ public:
const XMLElement& node; const XMLElement& node;
const Module& module; const Module& module;
std::string name; std::string name;
const Module* imported_module; const Module* importedModule;
Library ( const XMLElement& _node, Library ( const XMLElement& _node,
const Module& _module, const Module& _module,
@ -533,7 +533,7 @@ class SourceFile
{ {
public: public:
SourceFile ( AutomaticDependency* automaticDependency, SourceFile ( AutomaticDependency* automaticDependency,
Module& module, const Module& module,
const std::string& filename, const std::string& filename,
SourceFile* parent, SourceFile* parent,
bool isNonAutomaticDependency ); bool isNonAutomaticDependency );
@ -542,7 +542,7 @@ public:
std::string Location () const; std::string Location () const;
std::vector<SourceFile*> files; std::vector<SourceFile*> files;
AutomaticDependency* automaticDependency; AutomaticDependency* automaticDependency;
Module& module; const Module& module;
std::string filename; std::string filename;
std::string filenamePart; std::string filenamePart;
std::string directoryPart; std::string directoryPart;
@ -584,32 +584,32 @@ public:
const std::string& includedFilename, const std::string& includedFilename,
std::string& resolvedFilename ); std::string& resolvedFilename );
bool LocateIncludedFile ( SourceFile* sourceFile, bool LocateIncludedFile ( SourceFile* sourceFile,
Module& module, const Module& module,
const std::string& includedFilename, const std::string& includedFilename,
bool searchCurrentDirectory, bool searchCurrentDirectory,
bool includeNext, bool includeNext,
std::string& resolvedFilename ); std::string& resolvedFilename );
SourceFile* RetrieveFromCacheOrParse ( Module& module, SourceFile* RetrieveFromCacheOrParse ( const Module& module,
const std::string& filename, const std::string& filename,
SourceFile* parentSourceFile ); SourceFile* parentSourceFile );
SourceFile* RetrieveFromCache ( const std::string& filename ); SourceFile* RetrieveFromCache ( const std::string& filename );
void CheckAutomaticDependencies ( bool verbose ); void CheckAutomaticDependencies ( bool verbose );
void CheckAutomaticDependencies ( Module& module, void CheckAutomaticDependenciesForModule ( Module& module,
bool verbose ); bool verbose );
void CheckAutomaticDependencies ( Module& module,
bool verbose,
bool parseFiles );
void CheckAutomaticDependenciesForFile ( SourceFile* sourceFile );
private: private:
void GetModulesToCheck ( Module& module, std::vector<const Module*>& modules );
void CheckAutomaticDependencies ( const Module& module,
bool verbose );
void CheckAutomaticDependenciesForFile ( SourceFile* sourceFile );
void GetIncludeDirectories ( std::vector<Include*>& includes, void GetIncludeDirectories ( std::vector<Include*>& includes,
Module& module, const Module& module,
Include& currentDirectory, Include& currentDirectory,
bool searchCurrentDirectory ); bool searchCurrentDirectory );
void GetModuleFiles ( Module& module, void GetModuleFiles ( const Module& module,
std::vector<File*>& files ) const; std::vector<File*>& files ) const;
void ParseFiles (); void ParseFiles ();
void ParseFiles ( Module& module ); void ParseFiles ( const Module& module );
void ParseFile ( Module& module, void ParseFile ( const Module& module,
const File& file ); const File& file );
std::map<std::string, SourceFile*> sourcefile_map; std::map<std::string, SourceFile*> sourcefile_map;
}; };