From 12935b1599a2186950db644ff336aca16d725da0 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 8 May 2008 10:09:14 -0400 Subject: ENH: Light refactoring of implicit dependency scanning configuration implementation. - Move lookup of config variables from cmLocalUnixMakefileGenerator3 to cmDepends hierarchy. --- Source/cmDepends.cxx | 18 +++++++-- Source/cmDepends.h | 7 +++- Source/cmDependsC.cxx | 68 +++++++++++++++++++++----------- Source/cmDependsC.h | 13 ++---- Source/cmDependsFortran.cxx | 25 ++++++------ Source/cmDependsFortran.h | 5 +-- Source/cmLocalUnixMakefileGenerator3.cxx | 54 +------------------------ 7 files changed, 88 insertions(+), 102 deletions(-) diff --git a/Source/cmDepends.cxx b/Source/cmDepends.cxx index 06361b3..2cb1238 100644 --- a/Source/cmDepends.cxx +++ b/Source/cmDepends.cxx @@ -24,11 +24,12 @@ #include //---------------------------------------------------------------------------- -cmDepends::cmDepends(): +cmDepends::cmDepends(cmLocalGenerator* lg, const char* targetDir): CompileDirectory(), - LocalGenerator(0), + LocalGenerator(lg), Verbose(false), FileComparison(0), + TargetDirectory(targetDir), MaxPath(cmSystemTools::GetMaximumFilePathLength()), Dependee(new char[MaxPath]), Depender(new char[MaxPath]) @@ -231,4 +232,15 @@ bool cmDepends::CheckDependencies(std::istream& internalDepends) return okay; } - +//---------------------------------------------------------------------------- +void cmDepends::SetIncludePathFromLanguage(const char* lang) +{ + std::string includePathVar = "CMAKE_"; + includePathVar += lang; + includePathVar += "_INCLUDE_PATH"; + cmMakefile* mf = this->LocalGenerator->GetMakefile(); + if(const char* includePath = mf->GetDefinition(includePathVar.c_str())) + { + cmSystemTools::ExpandListArgument(includePath, this->IncludePath); + } +} diff --git a/Source/cmDepends.h b/Source/cmDepends.h index b9ebdf9..75afaaf 100644 --- a/Source/cmDepends.h +++ b/Source/cmDepends.h @@ -34,7 +34,7 @@ class cmDepends public: /** Instances need to know the build directory name and the relative path from the build directory to the target file. */ - cmDepends(); + cmDepends(cmLocalGenerator* lg=0, const char* targetDir=""); /** at what level will the compile be done from */ void SetCompileDirectory(const char *dir) {this->CompileDirectory = dir;}; @@ -108,6 +108,11 @@ protected: char* Dependee; char* Depender; + // The include file search path. + std::vector IncludePath; + + void SetIncludePathFromLanguage(const char* lang); + private: cmDepends(cmDepends const&); // Purposely not implemented. void operator=(cmDepends const&); // Purposely not implemented. diff --git a/Source/cmDependsC.cxx b/Source/cmDependsC.cxx index 5ac98bb..3a6c00c 100644 --- a/Source/cmDependsC.cxx +++ b/Source/cmDependsC.cxx @@ -18,6 +18,7 @@ #include "cmFileTimeComparison.h" #include "cmLocalGenerator.h" +#include "cmMakefile.h" #include "cmSystemTools.h" #include // isspace @@ -31,25 +32,53 @@ #define INCLUDE_REGEX_COMPLAIN_MARKER "#IncludeRegexComplain: " //---------------------------------------------------------------------------- -cmDependsC::cmDependsC(): - IncludePath(0) +cmDependsC::cmDependsC() { } + //---------------------------------------------------------------------------- -// yummy look at all those constructor arguments -cmDependsC::cmDependsC(std::vector const& includes, - const char* scanRegex, const char* complainRegex, - const cmStdString& cacheFileName): - IncludePath(&includes), - IncludeRegexLine(INCLUDE_REGEX_LINE), - IncludeRegexScan(scanRegex), - IncludeRegexComplain(complainRegex), - IncludeRegexLineString(INCLUDE_REGEX_LINE_MARKER INCLUDE_REGEX_LINE), - IncludeRegexScanString(std::string(INCLUDE_REGEX_SCAN_MARKER)+scanRegex), - IncludeRegexComplainString( - std::string(INCLUDE_REGEX_COMPLAIN_MARKER)+complainRegex), - CacheFileName(cacheFileName) +cmDependsC::cmDependsC(cmLocalGenerator* lg, const char* targetDir, + const char* lang): cmDepends(lg, targetDir) { + cmMakefile* mf = lg->GetMakefile(); + + // Configure the include file search path. + this->SetIncludePathFromLanguage(lang); + + // Configure regular expressions. + std::string scanRegex = "^.*$"; + std::string complainRegex = "^$"; + { + std::string scanRegexVar = "CMAKE_"; + scanRegexVar += lang; + scanRegexVar += "_INCLUDE_REGEX_SCAN"; + if(const char* sr = mf->GetDefinition(scanRegexVar.c_str())) + { + scanRegex = sr; + } + std::string complainRegexVar = "CMAKE_"; + complainRegexVar += lang; + complainRegexVar += "_INCLUDE_REGEX_COMPLAIN"; + if(const char* cr = mf->GetDefinition(complainRegexVar.c_str())) + { + complainRegex = cr; + } + } + + this->IncludeRegexLine.compile(INCLUDE_REGEX_LINE); + this->IncludeRegexScan.compile(scanRegex.c_str()); + this->IncludeRegexComplain.compile(complainRegex.c_str()); + this->IncludeRegexLineString = INCLUDE_REGEX_LINE_MARKER INCLUDE_REGEX_LINE; + this->IncludeRegexScanString = INCLUDE_REGEX_SCAN_MARKER; + this->IncludeRegexScanString += scanRegex; + this->IncludeRegexComplainString = INCLUDE_REGEX_COMPLAIN_MARKER; + this->IncludeRegexComplainString += complainRegex; + + this->CacheFileName = this->TargetDirectory; + this->CacheFileName += "/"; + this->CacheFileName += lang; + this->CacheFileName += ".includecache"; + this->ReadCacheFile(); } @@ -80,11 +109,6 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj, cmSystemTools::Error("Cannot scan dependencies without an object file."); return false; } - if(!this->IncludePath) - { - cmSystemTools::Error("Cannot scan dependencies without an include path."); - return false; - } // Walk the dependency graph starting with the source file. bool first = true; @@ -138,7 +162,7 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj, cacheKey += current.FileName; for(std::vector::const_iterator i = - this->IncludePath->begin(); i != this->IncludePath->end(); ++i) + this->IncludePath.begin(); i != this->IncludePath.end(); ++i) { cacheKey+=*i; } @@ -149,7 +173,7 @@ bool cmDependsC::WriteDependencies(const char *src, const char *obj, fullName=headerLocationIt->second; } else for(std::vector::const_iterator i = - this->IncludePath->begin(); i != this->IncludePath->end(); ++i) + this->IncludePath.begin(); i != this->IncludePath.end(); ++i) { // Construct the name of the file as if it were in the current // include directory. Avoid using a leading "./". diff --git a/Source/cmDependsC.h b/Source/cmDependsC.h index ce02aff..738e035 100644 --- a/Source/cmDependsC.h +++ b/Source/cmDependsC.h @@ -30,9 +30,7 @@ public: /** Checking instances need to know the build directory name and the relative path from the build directory to the target file. */ cmDependsC(); - cmDependsC(std::vector const& includes, - const char* scanRegex, const char* complainRegex, - const cmStdString& cachFileName); + cmDependsC(cmLocalGenerator* lg, const char* targetDir, const char* lang); /** Virtual destructor to cleanup subclasses properly. */ virtual ~cmDependsC(); @@ -50,9 +48,6 @@ protected: void Scan(std::istream& is, const char* directory, const cmStdString& fullName); - // The include file search path. - std::vector const* IncludePath; - // Regular expression to identify C preprocessor include directives. cmsys::RegularExpression IncludeRegexLine; @@ -60,9 +55,9 @@ protected: // recursively and which to complain about not finding. cmsys::RegularExpression IncludeRegexScan; cmsys::RegularExpression IncludeRegexComplain; - const std::string IncludeRegexLineString; - const std::string IncludeRegexScanString; - const std::string IncludeRegexComplainString; + std::string IncludeRegexLineString; + std::string IncludeRegexScanString; + std::string IncludeRegexComplainString; public: // Data structures for dependency graph walk. diff --git a/Source/cmDependsFortran.cxx b/Source/cmDependsFortran.cxx index 3d23b80..7329f27 100644 --- a/Source/cmDependsFortran.cxx +++ b/Source/cmDependsFortran.cxx @@ -131,17 +131,25 @@ public: //---------------------------------------------------------------------------- cmDependsFortran::cmDependsFortran(): - IncludePath(0), PPDefinitions(0), Internal(0) + PPDefinitions(0), Internal(0) { } //---------------------------------------------------------------------------- cmDependsFortran -::cmDependsFortran(std::vector const& includes, - std::vector const& definitions): - IncludePath(&includes), +::cmDependsFortran(cmLocalGenerator* lg): + cmDepends(lg), Internal(new cmDependsFortranInternals) { + // Get the list of definitions. + std::vector definitions; + cmMakefile* mf = this->LocalGenerator->GetMakefile(); + if(const char* c_defines = + mf->GetDefinition("CMAKE_TARGET_DEFINITIONS")) + { + cmSystemTools::ExpandListArgument(c_defines, definitions); + } + // translate i.e. FOO=BAR to FOO and add it to the list of defined // preprocessor symbols for(std::vector::const_iterator @@ -178,11 +186,6 @@ bool cmDependsFortran::WriteDependencies(const char *src, const char *obj, cmSystemTools::Error("Cannot scan dependencies without an object file."); return false; } - if(!this->IncludePath) - { - cmSystemTools::Error("Cannot scan dependencies without an include path."); - return false; - } // Get the information object for this source. cmDependsFortranSourceInfo& info = @@ -595,7 +598,7 @@ bool cmDependsFortran::FindModule(std::string const& name, // Search the include path for the module. std::string fullName; for(std::vector::const_iterator i = - this->IncludePath->begin(); i != this->IncludePath->end(); ++i) + this->IncludePath.begin(); i != this->IncludePath.end(); ++i) { // Try the lower-case name. fullName = *i; @@ -887,7 +890,7 @@ bool cmDependsFortran::FindIncludeFile(const char* dir, // Search the include path for the file. for(std::vector::const_iterator i = - this->IncludePath->begin(); i != this->IncludePath->end(); ++i) + this->IncludePath.begin(); i != this->IncludePath.end(); ++i) { fullName = *i; fullName += "/"; diff --git a/Source/cmDependsFortran.h b/Source/cmDependsFortran.h index 59e44da..af3d94d 100644 --- a/Source/cmDependsFortran.h +++ b/Source/cmDependsFortran.h @@ -36,8 +36,7 @@ public: path from the build directory to the target file, the source file from which to start scanning, the include file search path, and the target directory. */ - cmDependsFortran(std::vector const& includes, - std::vector const& defines); + cmDependsFortran(cmLocalGenerator* lg); /** Virtual destructor to cleanup subclasses properly. */ virtual ~cmDependsFortran(); @@ -85,8 +84,6 @@ protected: // The source file from which to start scanning. std::string SourceFile; - // The include file search path. - std::vector const* IncludePath; std::vector PPDefinitions; // Internal implementation details. diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx index 441f0fe..70ff492 100644 --- a/Source/cmLocalUnixMakefileGenerator3.cxx +++ b/Source/cmLocalUnixMakefileGenerator3.cxx @@ -1473,68 +1473,18 @@ cmLocalUnixMakefileGenerator3 { // construct the checker std::string lang = li->c_str(); - - // Get the set of include directories. - std::vector includes; - if(haveDirectoryInfo) - { - std::string includePathVar = "CMAKE_"; - includePathVar += lang; - includePathVar += "_INCLUDE_PATH"; - if(const char* includePath = mf->GetDefinition(includePathVar.c_str())) - { - cmSystemTools::ExpandListArgument(includePath, includes); - } - } - - // Get the include file regular expression. - std::string includeRegexScan = "^.*$"; - std::string includeRegexComplain = "^$"; - if(haveDirectoryInfo) - { - std::string scanRegexVar = "CMAKE_"; - scanRegexVar += lang; - scanRegexVar += "_INCLUDE_REGEX_SCAN"; - if(const char* scanRegex = mf->GetDefinition(scanRegexVar.c_str())) - { - includeRegexScan = scanRegex; - } - std::string complainRegexVar = "CMAKE_"; - complainRegexVar += lang; - complainRegexVar += "_INCLUDE_REGEX_COMPLAIN"; - if(const char* complainRegex = - mf->GetDefinition(complainRegexVar.c_str())) - { - includeRegexComplain = complainRegex; - } - } // Create the scanner for this language cmDepends *scanner = 0; if(lang == "C" || lang == "CXX" || lang == "RC") { - std::string includeCacheFileName = dir; - includeCacheFileName += "/"; - includeCacheFileName += lang; - includeCacheFileName += ".includecache"; - // TODO: Handle RC (resource files) dependencies correctly. - scanner = new cmDependsC(includes, - includeRegexScan.c_str(), - includeRegexComplain.c_str(), - includeCacheFileName); + scanner = new cmDependsC(this, targetDir, lang.c_str()); } #ifdef CMAKE_BUILD_WITH_CMAKE else if(lang == "Fortran") { - std::vector defines; - if(const char* c_defines = - mf->GetDefinition("CMAKE_TARGET_DEFINITIONS")) - { - cmSystemTools::ExpandListArgument(c_defines, defines); - } - - scanner = new cmDependsFortran(includes, defines); + scanner = new cmDependsFortran(this); } else if(lang == "Java") { -- cgit v0.12