diff options
author | Andy Cedilnik <andy.cedilnik@kitware.com> | 2005-10-12 17:52:29 (GMT) |
---|---|---|
committer | Andy Cedilnik <andy.cedilnik@kitware.com> | 2005-10-12 17:52:29 (GMT) |
commit | f18e7c7ff7935a93076384ba15629942f559cc8d (patch) | |
tree | 85b1a0bc3002c93654f58ec579e73d549b0eec27 /Source/cmDepends.cxx | |
parent | a51dfefe796c1c7108d92e79dc77607c8307ef4b (diff) | |
download | CMake-f18e7c7ff7935a93076384ba15629942f559cc8d.zip CMake-f18e7c7ff7935a93076384ba15629942f559cc8d.tar.gz CMake-f18e7c7ff7935a93076384ba15629942f559cc8d.tar.bz2 |
ENH: Improve performance of check build system by creating another file that is simpler to parse and therefore much faster overall
Diffstat (limited to 'Source/cmDepends.cxx')
-rw-r--r-- | Source/cmDepends.cxx | 109 |
1 files changed, 102 insertions, 7 deletions
diff --git a/Source/cmDepends.cxx b/Source/cmDepends.cxx index 01c6e11..d66efb4 100644 --- a/Source/cmDepends.cxx +++ b/Source/cmDepends.cxx @@ -18,28 +18,34 @@ #include "cmGeneratedFileStream.h" #include "cmSystemTools.h" +#include "cmFileTimeComparison.h" #include <assert.h> //---------------------------------------------------------------------------- -cmDepends::cmDepends() +cmDepends::cmDepends(): m_Verbose(false), m_FileComparison(0), + m_MaxPath(cmSystemTools::GetMaximumFilePathLength()), + m_Dependee(new char[m_MaxPath]), + m_Depender(new char[m_MaxPath]) { - m_Verbose = false; } //---------------------------------------------------------------------------- cmDepends::~cmDepends() { + delete [] m_Dependee; + delete [] m_Depender; } //---------------------------------------------------------------------------- -bool cmDepends::Write(const char *src, const char *obj, std::ostream &fout) +bool cmDepends::Write(const char *src, const char *obj, + std::ostream &makeDepends, std::ostream &internalDepends) { - return this->WriteDependencies(src, obj, fout); + return this->WriteDependencies(src, obj, makeDepends, internalDepends); } //---------------------------------------------------------------------------- -void cmDepends::Check(const char *file) +void cmDepends::Check(const char *makeFile, const char *internalFile) { // Dependency checks must be done in proper working directory. std::string oldcwd = "."; @@ -52,11 +58,12 @@ void cmDepends::Check(const char *file) } // Check whether dependencies must be regenerated. - std::ifstream fin(file); + std::ifstream fin(internalFile); if(!(fin && this->CheckDependencies(fin))) { // Clear all dependencies so they will be regenerated. - this->Clear(file); + this->Clear(makeFile); + this->Clear(internalFile); } // Restore working directory. @@ -82,6 +89,7 @@ void cmDepends::Clear(const char *file) std::string markFile = file; markFile += ".mark"; cmSystemTools::RemoveFile(markFile.c_str()); + std::cout << "Remove mark file: " << markFile.c_str() << std::endl; // Write an empty dependency file. cmGeneratedFileStream depFileStream(file); @@ -90,3 +98,90 @@ void cmDepends::Clear(const char *file) << "# This may be replaced when dependencies are built." << std::endl; } +//---------------------------------------------------------------------------- +bool cmDepends::CheckDependencies(std::istream& internalDepends) +{ + // Parse dependencies from the stream. If any dependee is missing + // or newer than the depender then dependencies should be + // regenerated. + bool okay = true; + while(internalDepends.getline(m_Dependee, m_MaxPath)) + { + if ( m_Dependee[0] == 0 || m_Dependee[0] == '#' || m_Dependee[0] == '\r' ) + { + continue; + } + size_t len = internalDepends.gcount()-1; + if ( m_Dependee[len-1] == '\r' ) + { + len --; + m_Dependee[len] = 0; + } + if ( m_Dependee[0] != ' ' ) + { + memcpy(m_Depender, m_Dependee, len+1); + continue; + } + /* + // Parse the dependency line. + if(!this->ParseDependency(line.c_str())) + { + continue; + } + */ + + // Dependencies must be regenerated if the dependee does not exist + // or if the depender exists and is older than the dependee. + bool regenerate = false; + const char* dependee = m_Dependee+1; + const char* depender = m_Depender; + if(!cmSystemTools::FileExists(dependee)) + { + // The dependee does not exist. + regenerate = true; + + // Print verbose output. + if(m_Verbose) + { + cmOStringStream msg; + msg << "Dependee \"" << dependee + << "\" does not exist for depender \"" + << depender << "\"." << std::endl; + cmSystemTools::Stdout(msg.str().c_str()); + } + } + else if(cmSystemTools::FileExists(depender)) + { + // The dependee and depender both exist. Compare file times. + int result = 0; + if((!m_FileComparison->FileTimeCompare(depender, dependee, + &result) || result < 0)) + { + // The depender is older than the dependee. + regenerate = true; + + // Print verbose output. + if(m_Verbose) + { + cmOStringStream msg; + msg << "Dependee \"" << dependee + << "\" is newer than depender \"" + << depender << "\"." << std::endl; + cmSystemTools::Stdout(msg.str().c_str()); + } + } + } + if(regenerate) + { + // Dependencies must be regenerated. + okay = false; + + // Remove the depender to be sure it is rebuilt. + cmSystemTools::RemoveFile(depender); + } + } + + return okay; +} + + |