Explorar o código

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 %!s(int64=15) %!d(string=hai) anos
pai
achega
a6b5ead62f

+ 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)