CMake/Source/cmDependsC.h
Alexander Neundorf 39383ef8cb Major optimization of C/C++ dependency scanning.
Now only the dependencies for the file where the dependencies actually may
have changed are rescanned, before that this was done for all source files
even if only one source file had changed.
This reduces e.g. on my machine the time for scanning the dependencies
of kdelibs/khtml/ when only one file (khtml_global.cpp) has changed from
around 7.5 seconds to 1.2 seconds.

The tests succeed, it does what I expected it to do on kdelibs, and Brad
also reviewed the patch, so I think it should be ok.

Alex
2009-09-23 14:02:05 -04:00

105 lines
3.3 KiB
C++

/*=========================================================================
Program: CMake - Cross-Platform Makefile Generator
Module: $RCSfile$
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef cmDependsC_h
#define cmDependsC_h
#include "cmDepends.h"
#include <cmsys/RegularExpression.hxx>
#include <queue>
/** \class cmDependsC
* \brief Dependency scanner for C and C++ object files.
*/
class cmDependsC: public cmDepends
{
public:
/** Checking instances need to know the build directory name and the
relative path from the build directory to the target file. */
cmDependsC();
cmDependsC(cmLocalGenerator* lg, const char* targetDir, const char* lang,
const std::map<std::string, DependencyVector>* validDeps);
/** Virtual destructor to cleanup subclasses properly. */
virtual ~cmDependsC();
protected:
typedef std::vector<char> t_CharBuffer;
// Implement writing/checking methods required by superclass.
virtual bool WriteDependencies(const char *src,
const char *file,
std::ostream& makeDepends,
std::ostream& internalDepends);
// Method to scan a single file.
void Scan(std::istream& is, const char* directory,
const cmStdString& fullName);
// Regular expression to identify C preprocessor include directives.
cmsys::RegularExpression IncludeRegexLine;
// Regular expressions to choose which include files to scan
// recursively and which to complain about not finding.
cmsys::RegularExpression IncludeRegexScan;
cmsys::RegularExpression IncludeRegexComplain;
std::string IncludeRegexLineString;
std::string IncludeRegexScanString;
std::string IncludeRegexComplainString;
// Regex to transform #include lines.
std::string IncludeRegexTransformString;
cmsys::RegularExpression IncludeRegexTransform;
typedef std::map<cmStdString, cmStdString> TransformRulesType;
TransformRulesType TransformRules;
void SetupTransforms();
void ParseTransform(std::string const& xform);
void TransformLine(std::string& line);
public:
// Data structures for dependency graph walk.
struct UnscannedEntry
{
cmStdString FileName;
cmStdString QuotedLocation;
};
struct cmIncludeLines
{
cmIncludeLines(): Used(false) {}
std::vector<UnscannedEntry> UnscannedEntries;
bool Used;
};
protected:
const std::map<std::string, DependencyVector>* ValidDeps;
std::set<cmStdString> Encountered;
std::queue<UnscannedEntry> Unscanned;
t_CharBuffer Buffer;
std::map<cmStdString, cmIncludeLines *> FileCache;
std::map<cmStdString, cmStdString> HeaderLocationCache;
cmStdString CacheFileName;
void WriteCacheFile() const;
void ReadCacheFile();
private:
cmDependsC(cmDependsC const&); // Purposely not implemented.
void operator=(cmDependsC const&); // Purposely not implemented.
};
#endif