浏览代码

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());
+    }
 }
 
 //----------------------------------------------------------------------------