summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2008-05-08 14:09:14 (GMT)
committerBrad King <brad.king@kitware.com>2008-05-08 14:09:14 (GMT)
commit12935b1599a2186950db644ff336aca16d725da0 (patch)
treea3ca5b852b4896ab4849dba8a7fb20f1182e7d42
parent92198d6b37c26ad5fa41f8cbed28e35af15db1cc (diff)
downloadCMake-12935b1599a2186950db644ff336aca16d725da0.zip
CMake-12935b1599a2186950db644ff336aca16d725da0.tar.gz
CMake-12935b1599a2186950db644ff336aca16d725da0.tar.bz2
ENH: Light refactoring of implicit dependency scanning configuration implementation.
- Move lookup of config variables from cmLocalUnixMakefileGenerator3 to cmDepends hierarchy.
-rw-r--r--Source/cmDepends.cxx18
-rw-r--r--Source/cmDepends.h7
-rw-r--r--Source/cmDependsC.cxx68
-rw-r--r--Source/cmDependsC.h13
-rw-r--r--Source/cmDependsFortran.cxx25
-rw-r--r--Source/cmDependsFortran.h5
-rw-r--r--Source/cmLocalUnixMakefileGenerator3.cxx54
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 <string.h>
//----------------------------------------------------------------------------
-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<std::string> 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 <ctype.h> // 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<std::string> 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<std::string>::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<std::string>::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<std::string> 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<std::string> 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<std::string> const& includes,
- std::vector<std::string> const& definitions):
- IncludePath(&includes),
+::cmDependsFortran(cmLocalGenerator* lg):
+ cmDepends(lg),
Internal(new cmDependsFortranInternals)
{
+ // Get the list of definitions.
+ std::vector<std::string> 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<std::string>::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<std::string>::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<std::string>::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<std::string> const& includes,
- std::vector<std::string> 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<std::string> const* IncludePath;
std::vector<std::string> 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<std::string> 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<std::string> 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")
{