فهرست منبع

BUG: Dependency scans and checks must always set the current working directory to the directory containing the Makefile.

Brad King 20 سال پیش
والد
کامیت
5dc555e26d
1فایلهای تغییر یافته به همراه20 افزوده شده و 0 حذف شده
  1. 20 0
      Source/cmDepends.cxx

+ 20 - 0
Source/cmDepends.cxx

@@ -19,6 +19,8 @@
 #include "cmGeneratedFileStream.h"
 #include "cmSystemTools.h"
 
+#include <assert.h>
+
 //----------------------------------------------------------------------------
 cmDepends::cmDepends(const char* dir, const char* targetFile):
   m_Directory(dir),
@@ -44,6 +46,10 @@ cmDepends::~cmDepends()
 //----------------------------------------------------------------------------
 bool cmDepends::Write()
 {
+  // Dependency generation must always be done in the current working
+  // directory.
+  assert(m_Directory == ".");
+
   // Try to generate dependencies for the target file.
   cmGeneratedFileStream fout(m_DependsMakeFile.c_str());
   fout << "# Dependencies for " << m_TargetFile.c_str() << std::endl;
@@ -63,6 +69,14 @@ bool cmDepends::Write()
 //----------------------------------------------------------------------------
 void cmDepends::Check()
 {
+  // Dependency checks must be done in proper working directory.
+  std::string oldcwd = ".";
+  if(m_Directory != ".")
+    {
+    oldcwd = cmSystemTools::GetCurrentWorkingDirectory();
+    cmSystemTools::ChangeDirectory(m_Directory.c_str());
+    }
+
   // Check whether dependencies must be regenerated.
   std::ifstream fin(m_DependsMakeFile.c_str());
   if(!(fin && this->CheckDependencies(fin)))
@@ -70,6 +84,12 @@ void cmDepends::Check()
     // Clear all dependencies so they will be regenerated.
     this->Clear();
     }
+
+  // Restore working directory.
+  if(oldcwd != ".")
+    {
+    cmSystemTools::ChangeDirectory(oldcwd.c_str());
+    }
 }
 
 //----------------------------------------------------------------------------