diff options
Diffstat (limited to 'Source/cmDependsC.h')
-rw-r--r-- | Source/cmDependsC.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/Source/cmDependsC.h b/Source/cmDependsC.h new file mode 100644 index 0000000..07d3c21 --- /dev/null +++ b/Source/cmDependsC.h @@ -0,0 +1,97 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License 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 std::string& lang, + const std::map<std::string, DependencyVector>* validDeps); + + /** Virtual destructor to cleanup subclasses properly. */ + virtual ~cmDependsC(); + +protected: + // Implement writing/checking methods required by superclass. + virtual bool WriteDependencies(const std::set<std::string>& sources, + const std::string& obj, + std::ostream& makeDepends, + std::ostream& internalDepends); + + // Method to scan a single file. + void Scan(std::istream& is, const char* directory, + const std::string& 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<std::string, std::string> 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 + { + std::string FileName; + std::string QuotedLocation; + }; + + struct cmIncludeLines + { + cmIncludeLines(): Used(false) {} + std::vector<UnscannedEntry> UnscannedEntries; + bool Used; + }; +protected: + const std::map<std::string, DependencyVector>* ValidDeps; + std::set<std::string> Encountered; + std::queue<UnscannedEntry> Unscanned; + + std::map<std::string, cmIncludeLines *> FileCache; + std::map<std::string, std::string> HeaderLocationCache; + + std::string CacheFileName; + + void WriteCacheFile() const; + void ReadCacheFile(); +private: + cmDependsC(cmDependsC const&); // Purposely not implemented. + void operator=(cmDependsC const&); // Purposely not implemented. +}; + +#endif |