Browse Source

Merge topic 'fix-per-config-tll-include-dirs'

dea1df4 Memoize usage requirement include directories in a config-specific map
26dba6a Fix include dir propagation from conditionally linked targets
b8259c3 Centralize maintenance of usage requirement include directories
Brad King 13 years ago
parent
commit
0483bf8062
3 changed files with 54 additions and 23 deletions
  1. 54 14
      Source/cmTarget.cxx
  2. 0 1
      Source/cmTarget.h
  3. 0 8
      Source/cmTargetLinkLibrariesCommand.cxx

+ 54 - 14
Source/cmTarget.cxx

@@ -142,7 +142,7 @@ public:
   std::vector<IncludeDirectoriesEntry*> IncludeDirectoriesEntries;
   std::vector<IncludeDirectoriesEntry*> IncludeDirectoriesEntries;
   std::vector<cmValueWithOrigin> LinkInterfaceIncludeDirectoriesEntries;
   std::vector<cmValueWithOrigin> LinkInterfaceIncludeDirectoriesEntries;
 
 
-  std::vector<IncludeDirectoriesEntry*>
+  std::map<std::string, std::vector<IncludeDirectoriesEntry*> >
                                 CachedLinkInterfaceIncludeDirectoriesEntries;
                                 CachedLinkInterfaceIncludeDirectoriesEntries;
   std::map<std::string, std::string> CachedLinkInterfaceCompileDefinitions;
   std::map<std::string, std::string> CachedLinkInterfaceCompileDefinitions;
 
 
@@ -164,6 +164,19 @@ void deleteAndClear(
   entries.clear();
   entries.clear();
 }
 }
 
 
+//----------------------------------------------------------------------------
+void deleteAndClear(
+  std::map<std::string,
+          std::vector<cmTargetInternals::IncludeDirectoriesEntry*> > &entries)
+{
+  for (std::map<std::string,
+          std::vector<cmTargetInternals::IncludeDirectoriesEntry*> >::iterator
+        it = entries.begin(), end = entries.end(); it != end; ++it)
+    {
+    deleteAndClear(it->second);
+    }
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 cmTargetInternals::~cmTargetInternals()
 cmTargetInternals::~cmTargetInternals()
 {
 {
@@ -2706,6 +2719,19 @@ void cmTarget::SetProperty(const char* prop, const char* value)
                           new cmTargetInternals::IncludeDirectoriesEntry(cge));
                           new cmTargetInternals::IncludeDirectoriesEntry(cge));
     return;
     return;
     }
     }
+  if (strcmp(prop, "LINK_LIBRARIES") == 0)
+    {
+    this->Internal->LinkInterfaceIncludeDirectoriesEntries.clear();
+    if (cmGeneratorExpression::IsValidTargetName(value)
+        || cmGeneratorExpression::Find(value) != std::string::npos)
+      {
+      cmListFileBacktrace lfbt;
+      this->Makefile->GetBacktrace(lfbt);
+      cmValueWithOrigin entry(value, lfbt);
+      this->Internal->LinkInterfaceIncludeDirectoriesEntries.push_back(entry);
+      }
+    // Fall through
+    }
   this->Properties.SetProperty(prop, value, cmProperty::TARGET);
   this->Properties.SetProperty(prop, value, cmProperty::TARGET);
   this->MaybeInvalidatePropertyCache(prop);
   this->MaybeInvalidatePropertyCache(prop);
 }
 }
@@ -2727,6 +2753,18 @@ void cmTarget::AppendProperty(const char* prop, const char* value,
               new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(value)));
               new cmTargetInternals::IncludeDirectoriesEntry(ge.Parse(value)));
     return;
     return;
     }
     }
+  if (strcmp(prop, "LINK_LIBRARIES") == 0)
+    {
+    if (cmGeneratorExpression::IsValidTargetName(value)
+        || cmGeneratorExpression::Find(value) != std::string::npos)
+      {
+      cmListFileBacktrace lfbt;
+      this->Makefile->GetBacktrace(lfbt);
+      cmValueWithOrigin entry(value, lfbt);
+      this->Internal->LinkInterfaceIncludeDirectoriesEntries.push_back(entry);
+      }
+    // Fall through
+    }
   this->Properties.AppendProperty(prop, value, cmProperty::TARGET, asString);
   this->Properties.AppendProperty(prop, value, cmProperty::TARGET, asString);
   this->MaybeInvalidatePropertyCache(prop);
   this->MaybeInvalidatePropertyCache(prop);
 }
 }
@@ -2762,12 +2800,6 @@ void cmTarget::AppendBuildInterfaceIncludes()
     }
     }
 }
 }
 
 
-//----------------------------------------------------------------------------
-void cmTarget::AppendTllInclude(const cmValueWithOrigin &entry)
-{
-  this->Internal->LinkInterfaceIncludeDirectoriesEntries.push_back(entry);
-}
-
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void cmTarget::InsertInclude(const cmValueWithOrigin &entry,
 void cmTarget::InsertInclude(const cmValueWithOrigin &entry,
                      bool before)
                      bool before)
@@ -2939,25 +2971,33 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
                                                         ge.Parse(it->Value);
                                                         ge.Parse(it->Value);
       std::string result = cge->Evaluate(this->Makefile, config,
       std::string result = cge->Evaluate(this->Makefile, config,
                                         false, this, 0, 0);
                                         false, this, 0, 0);
-      if (!cmGeneratorExpression::IsValidTargetName(result.c_str())
-          || !this->Makefile->FindTargetToUse(result.c_str()))
+      if (!this->Makefile->FindTargetToUse(result.c_str()))
         {
         {
         continue;
         continue;
         }
         }
       }
       }
+      std::string includeGenex = "$<TARGET_PROPERTY:" +
+                              it->Value + ",INTERFACE_INCLUDE_DIRECTORIES>";
+      if (cmGeneratorExpression::Find(it->Value) != std::string::npos)
+        {
+        // Because it->Value is a generator expression, ensure that it
+        // evaluates to the non-empty string before being used in the
+        // TARGET_PROPERTY expression.
+        includeGenex = "$<$<BOOL:" + it->Value + ">:" + includeGenex + ">";
+        }
       cmGeneratorExpression ge(it->Backtrace);
       cmGeneratorExpression ge(it->Backtrace);
       cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(
       cmsys::auto_ptr<cmCompiledGeneratorExpression> cge = ge.Parse(
-          "$<TARGET_PROPERTY:" +
-                              it->Value + ",INTERFACE_INCLUDE_DIRECTORIES>");
+                                                              includeGenex);
 
 
-      this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries.push_back(
+      this->Internal
+        ->CachedLinkInterfaceIncludeDirectoriesEntries[configString].push_back(
                         new cmTargetInternals::IncludeDirectoriesEntry(cge,
                         new cmTargetInternals::IncludeDirectoriesEntry(cge,
                                                               it->Value));
                                                               it->Value));
       }
       }
     }
     }
 
 
   processIncludeDirectories(this,
   processIncludeDirectories(this,
-              this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries,
+    this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries[configString],
                             includes,
                             includes,
                             uniqueIncludes,
                             uniqueIncludes,
                             &dagChecker,
                             &dagChecker,
@@ -2967,7 +3007,7 @@ std::vector<std::string> cmTarget::GetIncludeDirectories(const char *config)
   if (!this->Makefile->IsGeneratingBuildSystem())
   if (!this->Makefile->IsGeneratingBuildSystem())
     {
     {
     deleteAndClear(
     deleteAndClear(
-              this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries);
+                this->Internal->CachedLinkInterfaceIncludeDirectoriesEntries);
     }
     }
   else
   else
     {
     {

+ 0 - 1
Source/cmTarget.h

@@ -495,7 +495,6 @@ public:
   std::vector<std::string> GetIncludeDirectories(const char *config);
   std::vector<std::string> GetIncludeDirectories(const char *config);
   void InsertInclude(const cmValueWithOrigin &entry,
   void InsertInclude(const cmValueWithOrigin &entry,
                      bool before = false);
                      bool before = false);
-  void AppendTllInclude(const cmValueWithOrigin &entry);
 
 
   void AppendBuildInterfaceIncludes();
   void AppendBuildInterfaceIncludes();
 
 

+ 0 - 8
Source/cmTargetLinkLibrariesCommand.cxx

@@ -259,14 +259,6 @@ cmTargetLinkLibrariesCommand::HandleLibrary(const char* lib,
   // Handle normal case first.
   // Handle normal case first.
   if(this->CurrentProcessingState != ProcessingLinkInterface)
   if(this->CurrentProcessingState != ProcessingLinkInterface)
     {
     {
-    {
-    cmListFileBacktrace lfbt;
-    this->Makefile->GetBacktrace(lfbt);
-    cmValueWithOrigin entry(this->Target->GetDebugGeneratorExpressions(lib,
-                                                                       llt),
-                            lfbt);
-    this->Target->AppendTllInclude(entry);
-    }
     this->Makefile
     this->Makefile
       ->AddLinkLibraryForTarget(this->Target->GetName(), lib, llt);
       ->AddLinkLibraryForTarget(this->Target->GetName(), lib, llt);
     if (this->CurrentProcessingState != ProcessingPublicInterface)
     if (this->CurrentProcessingState != ProcessingPublicInterface)