Browse Source

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

Brad King 18 years ago
parent
commit
4d360f7ac5

+ 34 - 3
Source/cmDepends.cxx

@@ -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;
 }
 
 //----------------------------------------------------------------------------

+ 12 - 2
Source/cmDepends.h

@@ -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;

+ 2 - 3
Source/cmDependsFortran.cxx

@@ -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)
 {
 }
 

+ 1 - 5
Source/cmDependsFortran.h

@@ -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.

+ 4 - 18
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -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;