From 826d238ebd644be6e1ea00363e76ecba7699a649 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 3 May 2006 10:07:08 -0400 Subject: [PATCH] BUG: Fix to avoid repeated calls to CollapseFullPath during dependency scanning. This addresses bug#3191. --- Source/cmDepends.h | 9 ++++++++- Source/cmDependsC.cxx | 7 ++++--- Source/cmLocalUnixMakefileGenerator3.cxx | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Source/cmDepends.h b/Source/cmDepends.h index a0b1b6be7..80a9c7988 100644 --- a/Source/cmDepends.h +++ b/Source/cmDepends.h @@ -37,6 +37,11 @@ public: /** at what level will the compile be done from */ void SetCompileDirectory(const char *dir) {this->CompileDirectory = dir;}; + + /** Set the full path to the top of the build tree. This is + the base path from which dependencies are referenced as + relative paths. */ + void SetHomeOutputDirectory(const char *dir) {this->HomeOutputDirectory = dir;}; /** should this be verbose in its output */ void SetVerbose(bool verb) { this->Verbose = verb; } @@ -71,9 +76,11 @@ protected: virtual bool CheckDependencies(std::istream& internalDepends); // The directory in which the build rule for the target file is executed. - std::string Directory; std::string CompileDirectory; + // The full path to the top of the build tree. + std::string HomeOutputDirectory; + // Flag for verbose output. bool Verbose; cmFileTimeComparison* FileComparison; diff --git a/Source/cmDependsC.cxx b/Source/cmDependsC.cxx index 2e198ee15..13ebdcdaa 100644 --- a/Source/cmDependsC.cxx +++ b/Source/cmDependsC.cxx @@ -26,7 +26,6 @@ cmDependsC::cmDependsC(): IncludePath(0), GeneratedFiles(0) { } - //---------------------------------------------------------------------------- // yummy look at all those constructor arguments cmDependsC::cmDependsC(std::vector const& includes, @@ -85,6 +84,7 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj, this->Encountered.insert(src); std::set dependencies; std::set scanned; + while(!this->Unscanned.empty()) { // Get the next file to scan. @@ -367,9 +367,10 @@ bool cmDependsC::FileExistsOrIsGenerated(const std::string& fname, else if(cmSystemTools::FileIsFullPath(fname.c_str())) { // The generated file may have been listed with a relative path. - std::string dir = cmSystemTools::CollapseFullPath(this->Directory.c_str()); + // Note that CMAKE_GENERATED_FILES is written with a conversion + // relative to the home output directory. std::string rname = - cmSystemTools::RelativePath(dir.c_str(), fname.c_str()); + cmSystemTools::RelativePath(this->HomeOutputDirectory.c_str(), fname.c_str()); if(this->FileIsGenerated(rname, scanned, dependencies)) { return true; diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index efd46421f..165c997d4 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -1275,6 +1275,7 @@ cmLocalUnixMakefileGenerator3 includeRegexScan.c_str(), includeRegexComplain.c_str(), generatedFiles, includeCacheFileName); + scanner->SetHomeOutputDirectory(mf->GetHomeOutputDirectory()); } #ifdef CMAKE_BUILD_WITH_CMAKE else if(lang == "Fortran")