summaryrefslogtreecommitdiffstats
path: root/Source/cmDepends.cxx
diff options
context:
space:
mode:
authorAndy Cedilnik <andy.cedilnik@kitware.com>2005-10-12 17:52:29 (GMT)
committerAndy Cedilnik <andy.cedilnik@kitware.com>2005-10-12 17:52:29 (GMT)
commitf18e7c7ff7935a93076384ba15629942f559cc8d (patch)
tree85b1a0bc3002c93654f58ec579e73d549b0eec27 /Source/cmDepends.cxx
parenta51dfefe796c1c7108d92e79dc77607c8307ef4b (diff)
downloadCMake-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.cxx109
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;
+}
+
+