Browse Source

ENH: Added optional verbose output to build system dependency check.

Brad King 20 years ago
parent
commit
e8911705d6

+ 11 - 2
Source/cmDepends.cxx

@@ -22,11 +22,12 @@
 #include <assert.h>
 
 //----------------------------------------------------------------------------
-cmDepends::cmDepends(const char* dir, const char* targetFile):
+cmDepends::cmDepends(const char* dir, const char* targetFile, bool verbose):
   m_Directory(dir),
   m_TargetFile(targetFile),
   m_DependsMakeFile(dir),
-  m_DependsMarkFile(dir)
+  m_DependsMarkFile(dir),
+  m_Verbose(verbose)
 {
   // Construct the path to the make and mark files.  Append
   // appropriate extensions to their names.
@@ -97,6 +98,14 @@ void cmDepends::Check()
 //----------------------------------------------------------------------------
 void cmDepends::Clear()
 {
+  // Print verbose output.
+  if(m_Verbose)
+    {
+    cmOStringStream msg;
+    msg << "Clearing dependencies for \"" << m_TargetFile << "\"." << std::endl;
+    cmSystemTools::Stdout(msg.str().c_str());
+    }
+
   // Remove the dependency mark file to be sure dependencies will be
   // regenerated.
   cmSystemTools::RemoveFile(m_DependsMarkFile.c_str());

+ 4 - 1
Source/cmDepends.h

@@ -31,7 +31,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(const char* dir, const char* targetFile);
+  cmDepends(const char* dir, const char* targetFile, bool verbose);
 
   /** Virtual destructor to cleanup subclasses properly.  */
   virtual ~cmDepends();
@@ -74,6 +74,9 @@ protected:
   // The name of the .depends file marking when dependencies were generated.
   std::string m_DependsMarkFile;
 
+  // Flag for verbose output.
+  bool m_Verbose;
+
 private:
   cmDepends(cmDepends const&); // Purposely not implemented.
   void operator=(cmDepends const&); // Purposely not implemented.

+ 41 - 8
Source/cmDependsC.cxx

@@ -19,8 +19,8 @@
 #include "cmSystemTools.h"
 
 //----------------------------------------------------------------------------
-cmDependsC::cmDependsC(const char* dir, const char* targetFile):
-  cmDepends(dir, targetFile),
+cmDependsC::cmDependsC(const char* dir, const char* targetFile, bool verbose):
+  cmDepends(dir, targetFile, verbose),
   m_SourceFile(),
   m_IncludePath(0),
   m_IncludeRegexLine(),
@@ -34,7 +34,7 @@ cmDependsC::cmDependsC(const char* dir, const char* targetFile,
                        const char* sourceFile,
                        std::vector<std::string> const& includes,
                        const char* scanRegex, const char* complainRegex):
-  cmDepends(dir, targetFile),
+  cmDepends(dir, targetFile, false),
   m_SourceFile(sourceFile),
   m_IncludePath(&includes),
   m_IncludeRegexLine("^[ \t]*#[ \t]*include[ \t]*[<\"]([^\">]+)([\">])"),
@@ -231,11 +231,44 @@ bool cmDependsC::CheckDependencies(std::istream& is)
 
     // Dependencies must be regenerated if the dependee does not exist
     // or if the depender exists and is older than the dependee.
-    int result = 0;
-    if(!cmSystemTools::FileExists(dependee.c_str()) ||
-       (cmSystemTools::FileExists(depender.c_str()) &&
-         (!cmSystemTools::FileTimeCompare(depender.c_str(), dependee.c_str(),
-                                          &result) || result < 0)))
+    bool regenerate = false;
+    if(!cmSystemTools::FileExists(dependee.c_str()))
+      {
+      // The dependee does not exist.
+      regenerate = true;
+
+      // Print verbose output.
+      if(m_Verbose)
+        {
+        cmOStringStream msg;
+        msg << "Dependee \"" << dependee
+            << "\" does not exist for depender \""
+            << depender << "\"." << std::endl;
+        cmSystemTools::Stdout(msg.str().c_str());
+        }
+      }
+    else if(cmSystemTools::FileExists(depender.c_str()))
+      {
+      // The dependee and depender both exist.  Compare file times.
+      int result = 0;
+      if((!cmSystemTools::FileTimeCompare(depender.c_str(), dependee.c_str(),
+                                          &result) || result < 0))
+        {
+        // The depender is older than the dependee.
+        regenerate = true;
+
+        // Print verbose output.
+        if(m_Verbose)
+          {
+          cmOStringStream msg;
+          msg << "Dependee \"" << dependee
+              << "\" is newer than depender \""
+              << depender << "\"." << std::endl;
+          cmSystemTools::Stdout(msg.str().c_str());
+          }
+        }
+      }
+    if(regenerate)
       {
       // Dependencies must be regenerated.
       okay = false;

+ 1 - 1
Source/cmDependsC.h

@@ -29,7 +29,7 @@ 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(const char* dir, const char* targetFile);
+  cmDependsC(const char* dir, const char* targetFile, bool verbose);
 
   /** Scanning need to know the build directory name, the relative
       path from the build directory to the target file, the source

+ 4 - 3
Source/cmDependsFortran.cxx

@@ -76,8 +76,9 @@ struct cmDependsFortranParser_s
 };
 
 //----------------------------------------------------------------------------
-cmDependsFortran::cmDependsFortran(const char* dir, const char* targetFile):
-  cmDepends(dir, targetFile),
+cmDependsFortran::cmDependsFortran(const char* dir, const char* targetFile,
+                                   bool verbose):
+  cmDepends(dir, targetFile, verbose),
   m_SourceFile(),
   m_IncludePath(0)
 {
@@ -87,7 +88,7 @@ cmDependsFortran::cmDependsFortran(const char* dir, const char* targetFile):
 cmDependsFortran::cmDependsFortran(const char* dir, const char* targetFile,
                                    const char* sourceFile,
                                    std::vector<std::string> const& includes):
-  cmDepends(dir, targetFile),
+  cmDepends(dir, targetFile, false),
   m_SourceFile(sourceFile),
   m_IncludePath(&includes)
 {

+ 1 - 1
Source/cmDependsFortran.h

@@ -27,7 +27,7 @@ class cmDependsFortran: public cmDepends
 public:
   /** Checking instances need to know the build directory name and the
       relative path from the build directory to the target file.  */
-  cmDependsFortran(const char* dir, const char* targetFile);
+  cmDependsFortran(const char* dir, const char* targetFile, bool verbose);
 
   /** Scanning need to know the build directory name, the relative
       path from the build directory to the target file, the source

+ 4 - 3
Source/cmDependsJava.cxx

@@ -20,8 +20,9 @@
 #include "cmSystemTools.h"
 
 //----------------------------------------------------------------------------
-cmDependsJava::cmDependsJava(const char* dir, const char* targetFile):
-  cmDepends(dir, targetFile),
+cmDependsJava::cmDependsJava(const char* dir, const char* targetFile,
+                             bool verbose):
+  cmDepends(dir, targetFile, verbose),
   m_SourceFile()
 {
 }
@@ -29,7 +30,7 @@ cmDependsJava::cmDependsJava(const char* dir, const char* targetFile):
 //----------------------------------------------------------------------------
 cmDependsJava::cmDependsJava(const char* dir, const char* targetFile,
                                    const char* sourceFile):
-  cmDepends(dir, targetFile),
+  cmDepends(dir, targetFile, false),
   m_SourceFile(sourceFile)
 {
 }

+ 1 - 1
Source/cmDependsJava.h

@@ -27,7 +27,7 @@ class cmDependsJava: public cmDepends
 public:
   /** Checking instances need to know the build directory name and the
       relative path from the build directory to the target file.  */
-  cmDependsJava(const char* dir, const char* targetFile);
+  cmDependsJava(const char* dir, const char* targetFile, bool verbose);
 
   /** Scanning need to know the build directory name, the relative
       path from the build directory to the target file and the source

+ 9 - 7
Source/cmLocalUnixMakefileGenerator2.cxx

@@ -822,7 +822,7 @@ cmLocalUnixMakefileGenerator2
   std::auto_ptr<cmDepends>
     checker(this->GetDependsChecker(lang,
                                     m_Makefile->GetStartOutputDirectory(),
-                                    objFile));
+                                    objFile, false));
   if(checker.get())
     {
     // Save the make and mark file names.
@@ -3099,20 +3099,21 @@ cmLocalUnixMakefileGenerator2
 cmDepends*
 cmLocalUnixMakefileGenerator2::GetDependsChecker(const std::string& lang,
                                                  const char* dir,
-                                                 const char* objFile)
+                                                 const char* objFile,
+                                                 bool verbose)
 {
   if(lang == "C" || lang == "CXX" || lang == "RC")
     {
-    return new cmDependsC(dir, objFile);
+    return new cmDependsC(dir, objFile, verbose);
     }
 #ifdef CMAKE_BUILD_WITH_CMAKE
   else if(lang == "Fortran")
     {
-    return new cmDependsFortran(dir, objFile);
+    return new cmDependsFortran(dir, objFile, verbose);
     }
   else if(lang == "Java")
     {
-    return new cmDependsJava(dir, objFile);
+    return new cmDependsJava(dir, objFile, verbose);
     }
 #endif
   return 0;
@@ -3220,7 +3221,8 @@ cmLocalUnixMakefileGenerator2
 }
 
 //----------------------------------------------------------------------------
-void cmLocalUnixMakefileGenerator2::CheckDependencies(cmMakefile* mf)
+void cmLocalUnixMakefileGenerator2::CheckDependencies(cmMakefile* mf,
+                                                      bool verbose)
 {
   // Get the list of languages that may have sources to check.
   const char* langDef = mf->GetDefinition("CMAKE_DEPENDS_LANGUAGES");
@@ -3249,7 +3251,7 @@ void cmLocalUnixMakefileGenerator2::CheckDependencies(cmMakefile* mf)
         // Construct a checker for the given language.
         std::auto_ptr<cmDepends>
           checker(cmLocalUnixMakefileGenerator2
-                  ::GetDependsChecker(*l, ".", f->c_str()));
+                  ::GetDependsChecker(*l, ".", f->c_str(), verbose));
         if(checker.get())
           {
           checker->Check();

+ 3 - 2
Source/cmLocalUnixMakefileGenerator2.h

@@ -97,7 +97,7 @@ public:
   static bool ScanDependencies(std::vector<std::string> const& args);
 
   /** Called from command-line hook to check dependencies.  */
-  static void CheckDependencies(cmMakefile* mf);
+  static void CheckDependencies(cmMakefile* mf, bool verbose);
 
 protected:
 
@@ -235,7 +235,8 @@ protected:
 
   static cmDepends* GetDependsChecker(const std::string& lang,
                                       const char* dir,
-                                      const char* objFile);
+                                      const char* objFile,
+                                      bool verbose);
 
 private:
   // Map from target name to build directory containing it for

+ 5 - 2
Source/cmake.cxx

@@ -1614,8 +1614,11 @@ int cmake::CheckBuildSystem()
       }
     }
 
-  // We do not need to rerun CMake.  Check dependency integrity.
-  cmLocalUnixMakefileGenerator2::CheckDependencies(mf);
+  // We do not need to rerun CMake.  Check dependency integrity.  Use
+  // the make system's VERBOSE environment variable to enable verbose
+  // output.
+  bool verbose = cmSystemTools::GetEnv("VERBOSE");
+  cmLocalUnixMakefileGenerator2::CheckDependencies(mf, verbose);
 
   // No need to rerun.
   return 0;