Browse Source

PCH: Clear link interface cache when adding PCH object to it

On platforms using `CMAKE_LINK_PCH`, the implementation of
`PRECOMPILE_HEADERS_REUSE_FROM`, when re-using the PCH from one object
library in another, adds a PCH object file to the link interface.
Clear any cached link interface to ensure it is used.
Brad King 3 years ago
parent
commit
4e8f24e977
3 changed files with 14 additions and 0 deletions
  1. 6 0
      Source/cmGeneratorTarget.cxx
  2. 3 0
      Source/cmGeneratorTarget.h
  3. 5 0
      Source/cmLocalGenerator.cxx

+ 6 - 0
Source/cmGeneratorTarget.cxx

@@ -749,6 +749,12 @@ void cmGeneratorTarget::ClearSourcesCache()
   this->LinkImplMap.clear();
 }
 
+void cmGeneratorTarget::ClearLinkInterfaceCache()
+{
+  this->LinkInterfaceMap.clear();
+  this->LinkInterfaceUsageRequirementsOnlyMap.clear();
+}
+
 void cmGeneratorTarget::AddSourceCommon(const std::string& src, bool before)
 {
   this->SourceEntries.insert(

+ 3 - 0
Source/cmGeneratorTarget.h

@@ -664,6 +664,9 @@ public:
    */
   void ClearSourcesCache();
 
+  // Do not use.  This is only for a specific call site with a FIXME comment.
+  void ClearLinkInterfaceCache();
+
   void AddSource(const std::string& src, bool before = false);
   void AddTracedSources(std::vector<std::string> const& srcs);
 

+ 5 - 0
Source/cmLocalGenerator.cxx

@@ -2615,10 +2615,15 @@ void cmLocalGenerator::AddPchDependencies(cmGeneratorTarget* target)
                   true);
               } else if (reuseTarget->GetType() ==
                          cmStateEnums::OBJECT_LIBRARY) {
+                // FIXME: This can propagate more than one level, unlike
+                // the rest of the object files in an object library.
+                // Find another way to do this.
                 target->Target->AppendProperty(
                   "INTERFACE_LINK_LIBRARIES",
                   cmStrCat("$<$<CONFIG:", config,
                            ">:$<LINK_ONLY:", pchSourceObj, ">>"));
+                // We updated the link interface, so ensure it is recomputed.
+                target->ClearLinkInterfaceCache();
               }
             }
           } else {