ソースを参照

BUG: Make sure all source files are found before generating.

  - Previously this was done implicitly by the check for a target
    link language which checked all source full paths.
  - The recent change to support computing a link language without
    finding all the source files skipped the implicit check.
  - This change adds an explicit check to find all source files.
Brad King 17 年 前
コミット
771bdb7ef8
4 ファイル変更56 行追加0 行削除
  1. 34 0
      Source/cmGlobalGenerator.cxx
  2. 2 0
      Source/cmGlobalGenerator.h
  3. 15 0
      Source/cmTarget.cxx
  4. 5 0
      Source/cmTarget.h

+ 34 - 0
Source/cmGlobalGenerator.cxx

@@ -764,6 +764,12 @@ void cmGlobalGenerator::Generate()
     return;
     }
 
+  // Check that all targets are valid.
+  if(!this->CheckTargets())
+    {
+    return;
+    }
+
   // For each existing cmLocalGenerator
   unsigned int i;
 
@@ -850,6 +856,34 @@ void cmGlobalGenerator::Generate()
   this->CMakeInstance->UpdateProgress("Generating done", -1);
 }
 
+//----------------------------------------------------------------------------
+bool cmGlobalGenerator::CheckTargets()
+{
+  // Make sure all targets can find their source files.
+  for(unsigned int i=0; i < this->LocalGenerators.size(); ++i)
+    {
+    cmTargets& targets =
+      this->LocalGenerators[i]->GetMakefile()->GetTargets();
+    for(cmTargets::iterator ti = targets.begin();
+        ti != targets.end(); ++ti)
+      {
+      cmTarget& target = ti->second;
+      if(target.GetType() == cmTarget::EXECUTABLE ||
+         target.GetType() == cmTarget::STATIC_LIBRARY ||
+         target.GetType() == cmTarget::SHARED_LIBRARY ||
+         target.GetType() == cmTarget::MODULE_LIBRARY ||
+         target.GetType() == cmTarget::UTILITY)
+        {
+        if(!target.FindSourceFiles())
+          {
+          return false;
+          }
+        }
+      }
+    }
+  return true;
+}
+
 void cmGlobalGenerator::CheckLocalGenerators()
 {
   std::map<cmStdString, cmStdString> notFoundMap;

+ 2 - 0
Source/cmGlobalGenerator.h

@@ -260,6 +260,8 @@ protected:
 
   virtual bool CheckALLOW_DUPLICATE_CUSTOM_TARGETS();
 
+  bool CheckTargets();
+
   // Fill the ProjectMap, this must be called after LocalGenerators 
   // has been populated.
   void FillProjectMap();

+ 15 - 0
Source/cmTarget.cxx

@@ -1005,6 +1005,21 @@ void cmTarget::TraceDependencies(const char* vsProjectFile)
   tracer.Trace();
 }
 
+//----------------------------------------------------------------------------
+bool cmTarget::FindSourceFiles()
+{
+  for(std::vector<cmSourceFile*>::const_iterator
+        si = this->SourceFiles.begin();
+      si != this->SourceFiles.end(); ++si)
+    {
+    if((*si)->GetFullPath().empty())
+      {
+      return false;
+      }
+    }
+  return true;
+}
+
 //----------------------------------------------------------------------------
 void cmTarget::AddSources(std::vector<std::string> const& srcs)
 {

+ 5 - 0
Source/cmTarget.h

@@ -271,6 +271,11 @@ public:
    */
   void TraceDependencies(const char* vsProjectFile);
 
+  /**
+   * Make sure the full path to all source files is known.
+   */
+  bool FindSourceFiles();
+
   ///! Return the prefered linker language for this target
   const char* GetLinkerLanguage(cmGlobalGenerator*);