Commit 4d360f7a authored by Brad King's avatar Brad King
Browse files

ENH: Convert cmDepends object interface to scan an entire target at once.

parent a7245e47
......@@ -16,6 +16,8 @@
=========================================================================*/
#include "cmDepends.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmGeneratedFileStream.h"
#include "cmSystemTools.h"
#include "cmFileTimeComparison.h"
......@@ -41,10 +43,39 @@ cmDepends::~cmDepends()
}
//----------------------------------------------------------------------------
bool cmDepends::Write(const char *src, const char *obj,
std::ostream &makeDepends, std::ostream &internalDepends)
bool cmDepends::Write(std::ostream &makeDepends,
std::ostream &internalDepends)
{
return this->WriteDependencies(src, obj, makeDepends, internalDepends);
// Lookup the set of sources to scan.
std::string srcLang = "CMAKE_DEPENDS_CHECK_";
srcLang += this->Language;
cmMakefile* mf = this->LocalGenerator->GetMakefile();
const char* srcStr = mf->GetSafeDefinition(srcLang.c_str());
std::vector<std::string> pairs;
cmSystemTools::ExpandListArgument(srcStr, pairs);
for(std::vector<std::string>::iterator si = pairs.begin();
si != pairs.end();)
{
// Get the source and object file.
std::string const& src = *si++;
if(si == pairs.end()) { break; }
std::string obj = *si++;
// Make sure the object file is relative to the top of the build tree.
obj = this->LocalGenerator->Convert(obj.c_str(),
cmLocalGenerator::HOME_OUTPUT,
cmLocalGenerator::MAKEFILE);
// Write the dependencies for this pair.
if(!this->WriteDependencies(src.c_str(), obj.c_str(),
makeDepends, internalDepends))
{
return false;
}
}
return true;
}
//----------------------------------------------------------------------------
......
......@@ -45,6 +45,12 @@ public:
directory. */
void SetLocalGenerator(cmLocalGenerator* lg) { this->LocalGenerator = lg; }
/** Set the specific language to be scanned. */
void SetLanguage(const char* lang) { this->Language = lang; }
/** Set the target build directory. */
void SetTargetDirectory(const char* dir) { this->TargetDirectory = dir; }
/** should this be verbose in its output */
void SetVerbose(bool verb) { this->Verbose = verb; }
......@@ -52,8 +58,7 @@ public:
virtual ~cmDepends();
/** Write dependencies for the target file. */
bool Write(const char *src, const char *obj,
std::ostream &makeDepends, std::ostream &internalDepends);
bool Write(std::ostream &makeDepends, std::ostream &internalDepends);
/** Check dependencies for the target file. Returns true if
dependencies are okay and false if they must be generated. If
......@@ -90,6 +95,11 @@ protected:
bool Verbose;
cmFileTimeComparison* FileComparison;
std::string Language;
// The full path to the target's build directory.
std::string TargetDirectory;
size_t MaxPath;
char* Dependee;
char* Depender;
......
......@@ -90,9 +90,8 @@ cmDependsFortran::cmDependsFortran():
}
//----------------------------------------------------------------------------
cmDependsFortran::cmDependsFortran(std::vector<std::string> const& includes,
std::string const& targetDirectory):
IncludePath(&includes), TargetDirectory(targetDirectory)
cmDependsFortran::cmDependsFortran(std::vector<std::string> const& includes):
IncludePath(&includes)
{
}
......
......@@ -33,8 +33,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::string const& targetDirectory);
cmDependsFortran(std::vector<std::string> const& includes);
/** Virtual destructor to cleanup subclasses properly. */
virtual ~cmDependsFortran();
......@@ -62,9 +61,6 @@ protected:
// The include file search path.
std::vector<std::string> const* IncludePath;
// The full path to the target's build directory.
std::string TargetDirectory;
private:
cmDependsFortran(cmDependsFortran const&); // Purposely not implemented.
void operator=(cmDependsFortran const&); // Purposely not implemented.
......
......@@ -1412,7 +1412,7 @@ cmLocalUnixMakefileGenerator3
#ifdef CMAKE_BUILD_WITH_CMAKE
else if(lang == "Fortran")
{
scanner = new cmDependsFortran(includes, dir);
scanner = new cmDependsFortran(includes);
}
else if(lang == "Java")
{
......@@ -1425,23 +1425,9 @@ cmLocalUnixMakefileGenerator3
scanner->SetLocalGenerator(this);
scanner->SetFileComparison
(this->GlobalGenerator->GetCMakeInstance()->GetFileComparison());
// for each file we need to scan
std::string srcLang = "CMAKE_DEPENDS_CHECK_";
srcLang += lang;
const char *srcStr = mf->GetSafeDefinition(srcLang.c_str());
std::vector<std::string> srcs;
cmSystemTools::ExpandListArgument(srcStr, srcs);
for (std::vector<std::string>::iterator si =
srcs.begin(); si != srcs.end(); ++si)
{
std::string &src = *si;
++si;
// make sure the object file is relative to home output
std::string obj = *si;
obj = this->Convert(obj.c_str(),HOME_OUTPUT,MAKEFILE);
scanner->Write(src.c_str(),obj.c_str(),
ruleFileStream, internalRuleFileStream);
}
scanner->SetLanguage(lang.c_str());
scanner->SetTargetDirectory(dir.c_str());
scanner->Write(ruleFileStream, internalRuleFileStream);
// free the scanner for this language
delete scanner;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment