浏览代码

Report missing source files with context of target

Previously we reported only the CMakeLists.txt file in the directory
that adds the target.
Brad King 15 年之前
父节点
当前提交
a6b5ead62f
共有 5 个文件被更改,包括 27 次插入7 次删除
  1. 11 4
      Source/cmSourceFile.cxx
  2. 2 2
      Source/cmSourceFile.h
  3. 8 1
      Source/cmTarget.cxx
  4. 3 0
      Tests/CMakeLists.txt
  5. 3 0
      Tests/MissingSourceFile/CMakeLists.txt

+ 11 - 4
Source/cmSourceFile.cxx

@@ -101,11 +101,11 @@ cmSourceFileLocation const& cmSourceFile::GetLocation() const
 }
 
 //----------------------------------------------------------------------------
-std::string const& cmSourceFile::GetFullPath()
+std::string const& cmSourceFile::GetFullPath(std::string* error)
 {
   if(this->FullPath.empty())
     {
-    if(this->FindFullPath())
+    if(this->FindFullPath(error))
       {
       this->CheckExtension();
       }
@@ -120,7 +120,7 @@ std::string const& cmSourceFile::GetFullPath() const
 }
 
 //----------------------------------------------------------------------------
-bool cmSourceFile::FindFullPath()
+bool cmSourceFile::FindFullPath(std::string* error)
 {
   // If thie method has already failed once do not try again.
   if(this->FindFullPathFailed)
@@ -199,7 +199,14 @@ bool cmSourceFile::FindFullPath()
     {
     e << " ." << *ext;
     }
-  this->Location.GetMakefile()->IssueMessage(cmake::FATAL_ERROR, e.str());
+  if(error)
+    {
+    *error = e.str();
+    }
+  else
+    {
+    this->Location.GetMakefile()->IssueMessage(cmake::FATAL_ERROR, e.str());
+    }
   this->FindFullPathFailed = true;
   return false;
 }

+ 2 - 2
Source/cmSourceFile.h

@@ -60,7 +60,7 @@ public:
    * horrible interface, but is necessary for backwards
    * compatibility).
    */
-  std::string const& GetFullPath();
+  std::string const& GetFullPath(std::string* error = 0);
   std::string const& GetFullPath() const;
 
   /**
@@ -108,7 +108,7 @@ private:
   std::string FullPath;
   bool FindFullPathFailed;
 
-  bool FindFullPath();
+  bool FindFullPath(std::string* error);
   bool TryFullPath(const char* tryPath, const char* ext);
   void CheckExtension();
   void CheckLanguage(std::string const& ext);

+ 8 - 1
Source/cmTarget.cxx

@@ -1439,8 +1439,15 @@ bool cmTarget::FindSourceFiles()
         si = this->SourceFiles.begin();
       si != this->SourceFiles.end(); ++si)
     {
-    if((*si)->GetFullPath().empty())
+    std::string e;
+    if((*si)->GetFullPath(&e).empty())
       {
+      if(!e.empty())
+        {
+        cmake* cm = this->Makefile->GetCMakeInstance();
+        cm->IssueMessage(cmake::FATAL_ERROR, e,
+                         this->GetBacktrace());
+        }
       return false;
       }
     }

+ 3 - 0
Tests/CMakeLists.txt

@@ -129,6 +129,9 @@ IF(BUILD_TESTING)
   ADD_TEST_MACRO(MathTest MathTest)
   ADD_TEST_MACRO(Simple Simple)
   ADD_TEST_MACRO(PreOrder PreOrder)
+  ADD_TEST_MACRO(MissingSourceFile MissingSourceFile)
+  SET_TESTS_PROPERTIES(MissingSourceFile PROPERTIES
+    PASS_REGULAR_EXPRESSION "CMake Error at CMakeLists.txt:3 \\(add_executable\\):[ \r\n]*Cannot find source file \"MissingSourceFile.c\"")
   ADD_TEST_MACRO(COnly COnly)
   ADD_TEST_MACRO(CxxOnly CxxOnly)
   ADD_TEST_MACRO(IPO COnly/COnly)

+ 3 - 0
Tests/MissingSourceFile/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8)
+project(MissingSourceFile C)
+add_executable(MissingSourceFile MissingSourceFile.c)