Browse Source

ENH: Store in DependInfo.cmake files a list of the corresponding files for the targets to which a target links. This is useful for locating Fortran modules provided by linked targets. See issue #5809.

Brad King 18 years ago
parent
commit
42f3f3c342
1 changed files with 31 additions and 0 deletions
  1. 31 0
      Source/cmMakefileTargetGenerator.cxx

+ 31 - 0
Source/cmMakefileTargetGenerator.cxx

@@ -792,6 +792,37 @@ void cmMakefileTargetGenerator::WriteTargetDependRules()
     *this->InfoFileStream << "  )\n\n";
     }
 
+  // Store list of targets linked directly or transitively.
+  {
+  *this->InfoFileStream
+    << "\n"
+    << "# Targets to which this target links.\n"
+    << "SET(CMAKE_TARGET_LINKED_INFO_FILES\n";
+  cmGlobalGenerator* gg = this->GlobalGenerator;
+  std::set<cmTarget const*> emitted;
+  cmTarget::LinkLibraryVectorType const& libs =
+    this->Target->GetLinkLibraries();
+  for(cmTarget::LinkLibraryVectorType::const_iterator j = libs.begin();
+      j != libs.end(); ++j)
+    {
+    if(cmTarget const* linkee = gg->FindTarget(0, j->first.c_str(), false))
+      {
+      if(emitted.insert(linkee).second)
+        {
+        cmMakefile* mf = linkee->GetMakefile();
+        cmLocalGenerator* lg = mf->GetLocalGenerator();
+        std::string di = mf->GetStartOutputDirectory();
+        di += "/";
+        di += lg->GetTargetDirectory(*linkee);
+        di += "/DependInfo.cmake";
+        *this->InfoFileStream << "  \"" << di << "\"\n";
+        }
+      }
+    }
+  *this->InfoFileStream
+    << "  )\n";
+  }
+
   // and now write the rule to use it
   std::vector<std::string> depends;
   std::vector<std::string> commands;