From 0bfcb450e6cab8d9c2c079e10bf0acea62ffadbe Mon Sep 17 00:00:00 2001
From: Stephen Kelly <steveire@gmail.com>
Date: Wed, 20 Nov 2013 12:44:04 +0100
Subject: INTERFACE_LIBRARY: Avoid codepaths which set unneeded properties.

As an INTERFACE_LIBRARY has no direct link dependencies, we can
short-circuit in cmGeneratorExpressionEvaluator and
in cmGlobalGenerator::CheckLocalGenerators.

As they do not generate any output directly, any generate- or install-
related code acn also be short-circuited. Many of the local generators
already do this.

Because only INTERFACE related properties make sense on INTERFACE_LIBRARY
targets, avoid setting other properties, for example via defaults.
---
 Source/cmComputeTargetDepends.cxx           |  10 ++-
 Source/cmExportFileGenerator.cxx            |  30 +++----
 Source/cmGeneratorExpressionEvaluator.cxx   |   3 +-
 Source/cmGlobalGenerator.cxx                |   9 ++
 Source/cmGlobalVisualStudio7Generator.cxx   |   8 ++
 Source/cmGlobalVisualStudio8Generator.cxx   |   3 +-
 Source/cmInstallCommand.cxx                 |   3 +-
 Source/cmLocalGenerator.cxx                 |   9 ++
 Source/cmLocalNinjaGenerator.cxx            |   3 +-
 Source/cmLocalUnixMakefileGenerator3.cxx    |   3 +-
 Source/cmMakefile.cxx                       |   8 ++
 Source/cmMakefileLibraryTargetGenerator.cxx |   9 +-
 Source/cmTarget.cxx                         | 133 ++++++++++++++++------------
 Source/cmVisualStudio10TargetGenerator.cxx  |   3 +-
 14 files changed, 153 insertions(+), 81 deletions(-)

diff --git a/Source/cmComputeTargetDepends.cxx b/Source/cmComputeTargetDepends.cxx
index 7fd4754..cb9e37e 100644
--- a/Source/cmComputeTargetDepends.cxx
+++ b/Source/cmComputeTargetDepends.cxx
@@ -237,7 +237,15 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
     it != configs.end(); ++it)
     {
     std::vector<std::string> tlibs;
-    depender->GetDirectLinkLibraries(it->c_str(), tlibs, depender);
+    if (depender->GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      // For INTERFACE_LIBRARY depend on the interface instead.
+      depender->GetInterfaceLinkLibraries(it->c_str(), tlibs, depender);
+      }
+    else
+      {
+      depender->GetDirectLinkLibraries(it->c_str(), tlibs, depender);
+      }
     // A target should not depend on itself.
     emitted.insert(depender->GetName());
     for(std::vector<std::string>::const_iterator lib = tlibs.begin();
diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx
index 2ce4458..dc62284 100644
--- a/Source/cmExportFileGenerator.cxx
+++ b/Source/cmExportFileGenerator.cxx
@@ -388,14 +388,11 @@ void getCompatibleInterfaceProperties(cmTarget *target,
 
   if (!info)
     {
-    if (target->GetType() != cmTarget::INTERFACE_LIBRARY)
-      {
-      cmMakefile* mf = target->GetMakefile();
-      cmOStringStream e;
-      e << "Exporting the target \"" << target->GetName() << "\" is not "
-          "allowed since its linker language cannot be determined";
-      mf->IssueMessage(cmake::FATAL_ERROR, e.str());
-      }
+    cmMakefile* mf = target->GetMakefile();
+    cmOStringStream e;
+    e << "Exporting the target \"" << target->GetName() << "\" is not "
+        "allowed since its linker language cannot be determined";
+    mf->IssueMessage(cmake::FATAL_ERROR, e.str());
     return;
     }
 
@@ -447,15 +444,18 @@ void cmExportFileGenerator::PopulateCompatibleInterfaceProperties(
   getPropertyContents(target, "COMPATIBLE_INTERFACE_NUMBER_MAX",
                       ifaceProperties);
 
-  getCompatibleInterfaceProperties(target, ifaceProperties, 0);
+  if (target->GetType() != cmTarget::INTERFACE_LIBRARY)
+    {
+    getCompatibleInterfaceProperties(target, ifaceProperties, 0);
 
-  std::vector<std::string> configNames;
-  target->GetMakefile()->GetConfigurations(configNames);
+    std::vector<std::string> configNames;
+    target->GetMakefile()->GetConfigurations(configNames);
 
-  for (std::vector<std::string>::const_iterator ci = configNames.begin();
-    ci != configNames.end(); ++ci)
-    {
-    getCompatibleInterfaceProperties(target, ifaceProperties, ci->c_str());
+    for (std::vector<std::string>::const_iterator ci = configNames.begin();
+      ci != configNames.end(); ++ci)
+      {
+      getCompatibleInterfaceProperties(target, ifaceProperties, ci->c_str());
+      }
     }
 
   for (std::set<std::string>::const_iterator it = ifaceProperties.begin();
diff --git a/Source/cmGeneratorExpressionEvaluator.cxx b/Source/cmGeneratorExpressionEvaluator.cxx
index 67972b9..17bf041 100644
--- a/Source/cmGeneratorExpressionEvaluator.cxx
+++ b/Source/cmGeneratorExpressionEvaluator.cxx
@@ -954,7 +954,8 @@ static const struct TargetPropertyNode : public cmGeneratorExpressionNode
 
     if (!prop)
       {
-      if (target->IsImported())
+      if (target->IsImported()
+          || target->GetType() == cmTarget::INTERFACE_LIBRARY)
         {
         return linkedTargetsContent;
         }
diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 20cd15e..e6f3d94 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -1309,6 +1309,11 @@ void cmGlobalGenerator::FinalizeTargetCompileInfo()
       {
       cmTarget* t = &ti->second;
 
+      if (t->GetType() == cmTarget::INTERFACE_LIBRARY)
+        {
+        continue;
+        }
+
       t->AppendBuildInterfaceIncludes();
 
       for (std::vector<cmValueWithOrigin>::const_iterator it
@@ -1461,6 +1466,10 @@ void cmGlobalGenerator::CheckLocalGenerators()
     for (cmTargets::iterator l = targets.begin();
          l != targets.end(); l++)
       {
+      if (l->second.GetType() == cmTarget::INTERFACE_LIBRARY)
+        {
+        continue;
+        }
       const cmTarget::LinkLibraryVectorType& libs =
         l->second.GetOriginalLinkLibraries();
       for(cmTarget::LinkLibraryVectorType::const_iterator lib = libs.begin();
diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx
index 3d939f3..f523a8f 100644
--- a/Source/cmGlobalVisualStudio7Generator.cxx
+++ b/Source/cmGlobalVisualStudio7Generator.cxx
@@ -327,6 +327,10 @@ void cmGlobalVisualStudio7Generator::WriteTargetConfigurations(
         projectTargets.begin(); tt != projectTargets.end(); ++tt)
     {
     cmTarget* target = *tt;
+    if(target->GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      continue;
+      }
     const char* expath = target->GetProperty("EXTERNAL_MSPROJECT");
     if(expath)
       {
@@ -364,6 +368,10 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution(
         projectTargets.begin(); tt != projectTargets.end(); ++tt)
     {
     cmTarget* target = *tt;
+    if(target->GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      continue;
+      }
     bool written = false;
 
     // handle external vc project files
diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx
index 69b0a7a..e4ce13f 100644
--- a/Source/cmGlobalVisualStudio8Generator.cxx
+++ b/Source/cmGlobalVisualStudio8Generator.cxx
@@ -442,7 +442,8 @@ bool cmGlobalVisualStudio8Generator::NeedLinkLibraryDependencies(
     {
     if(cmTarget* depTarget = this->FindTarget(0, ui->c_str()))
       {
-      if(depTarget->GetProperty("EXTERNAL_MSPROJECT"))
+      if(depTarget->GetType() != cmTarget::INTERFACE_LIBRARY
+          && depTarget->GetProperty("EXTERNAL_MSPROJECT"))
         {
         // This utility dependency names an external .vcproj target.
         // We use LinkLibraryDependencies="true" to link to it without
diff --git a/Source/cmInstallCommand.cxx b/Source/cmInstallCommand.cxx
index d309a2a..10578f2 100644
--- a/Source/cmInstallCommand.cxx
+++ b/Source/cmInstallCommand.cxx
@@ -645,7 +645,8 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
     // generators for them.
     bool createInstallGeneratorsForTargetFileSets = true;
 
-    if(target.IsFrameworkOnApple())
+    if(target.IsFrameworkOnApple()
+        || target.GetType() == cmTarget::INTERFACE_LIBRARY)
       {
       createInstallGeneratorsForTargetFileSets = false;
       }
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index cf5798f..d26d6e9 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -541,6 +541,10 @@ void cmLocalGenerator::GenerateTargetManifest()
       t != targets.end(); ++t)
     {
     cmGeneratorTarget& target = *t->second;
+    if (target.Target->GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      continue;
+      }
     if(configNames.empty())
       {
       target.GenerateTargetManifest(0);
@@ -2829,6 +2833,11 @@ cmLocalGenerator
   cmTargets& tgts = this->Makefile->GetTargets();
   for(cmTargets::iterator l = tgts.begin(); l != tgts.end(); ++l)
     {
+    if (l->second.GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      continue;
+      }
+
     // Include the user-specified pre-install script for this target.
     if(const char* preinstall = l->second.GetProperty("PRE_INSTALL_SCRIPT"))
       {
diff --git a/Source/cmLocalNinjaGenerator.cxx b/Source/cmLocalNinjaGenerator.cxx
index 158d714..168bc42 100644
--- a/Source/cmLocalNinjaGenerator.cxx
+++ b/Source/cmLocalNinjaGenerator.cxx
@@ -68,7 +68,8 @@ void cmLocalNinjaGenerator::Generate()
   for(cmGeneratorTargetsType::iterator t = targets.begin();
       t != targets.end(); ++t)
     {
-    if (t->second->Target->IsImported())
+    if (t->second->Target->GetType() == cmTarget::INTERFACE_LIBRARY
+        || t->second->Target->IsImported())
       {
       continue;
       }
diff --git a/Source/cmLocalUnixMakefileGenerator3.cxx b/Source/cmLocalUnixMakefileGenerator3.cxx
index 9af5c29..5ada88d 100644
--- a/Source/cmLocalUnixMakefileGenerator3.cxx
+++ b/Source/cmLocalUnixMakefileGenerator3.cxx
@@ -151,7 +151,8 @@ void cmLocalUnixMakefileGenerator3::Generate()
   for(cmGeneratorTargetsType::iterator t = targets.begin();
       t != targets.end(); ++t)
     {
-    if (t->second->Target->IsImported())
+    if (t->second->Target->GetType() == cmTarget::INTERFACE_LIBRARY
+        || t->second->Target->IsImported())
       {
       continue;
       }
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 989aa5f..30a1557 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -868,6 +868,10 @@ void cmMakefile::ConfigureFinalPass()
   for (cmTargets::iterator l = this->Targets.begin();
        l != this->Targets.end(); l++)
     {
+    if (l->second.GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      continue;
+      }
     l->second.FinishConfigure();
     }
 }
@@ -2256,6 +2260,10 @@ void cmMakefile::ExpandVariablesCMP0019()
        l != this->Targets.end(); ++l)
     {
     cmTarget &t = l->second;
+    if (t.GetType() == cmTarget::INTERFACE_LIBRARY)
+      {
+      continue;
+      }
     includeDirs = t.GetProperty("INCLUDE_DIRECTORIES");
     if(mightExpandVariablesCMP0019(includeDirs))
       {
diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx
index 7b8a531..35818ee 100644
--- a/Source/cmMakefileLibraryTargetGenerator.cxx
+++ b/Source/cmMakefileLibraryTargetGenerator.cxx
@@ -25,9 +25,12 @@ cmMakefileLibraryTargetGenerator
   cmMakefileTargetGenerator(target->Target)
 {
   this->CustomCommandDriver = OnDepends;
-  this->Target->GetLibraryNames(
-    this->TargetNameOut, this->TargetNameSO, this->TargetNameReal,
-    this->TargetNameImport, this->TargetNamePDB, this->ConfigName);
+  if (this->Target->GetType() != cmTarget::INTERFACE_LIBRARY)
+    {
+    this->Target->GetLibraryNames(
+      this->TargetNameOut, this->TargetNameSO, this->TargetNameReal,
+      this->TargetNameImport, this->TargetNamePDB, this->ConfigName);
+    }
 
   this->OSXBundleGenerator = new cmOSXBundleGenerator(target,
                                                       this->ConfigName);
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 120a666..022048c 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -255,32 +255,34 @@ void cmTarget::SetMakefile(cmMakefile* mf)
   this->IsApple = this->Makefile->IsOn("APPLE");
 
   // Setup default property values.
-  this->SetPropertyDefault("INSTALL_NAME_DIR", 0);
-  this->SetPropertyDefault("INSTALL_RPATH", "");
-  this->SetPropertyDefault("INSTALL_RPATH_USE_LINK_PATH", "OFF");
-  this->SetPropertyDefault("SKIP_BUILD_RPATH", "OFF");
-  this->SetPropertyDefault("BUILD_WITH_INSTALL_RPATH", "OFF");
-  this->SetPropertyDefault("ARCHIVE_OUTPUT_DIRECTORY", 0);
-  this->SetPropertyDefault("LIBRARY_OUTPUT_DIRECTORY", 0);
-  this->SetPropertyDefault("RUNTIME_OUTPUT_DIRECTORY", 0);
-  this->SetPropertyDefault("PDB_OUTPUT_DIRECTORY", 0);
-  this->SetPropertyDefault("Fortran_FORMAT", 0);
-  this->SetPropertyDefault("Fortran_MODULE_DIRECTORY", 0);
-  this->SetPropertyDefault("GNUtoMS", 0);
-  this->SetPropertyDefault("OSX_ARCHITECTURES", 0);
-  this->SetPropertyDefault("AUTOMOC", 0);
-  this->SetPropertyDefault("AUTOUIC", 0);
-  this->SetPropertyDefault("AUTORCC", 0);
-  this->SetPropertyDefault("AUTOMOC_MOC_OPTIONS", 0);
-  this->SetPropertyDefault("AUTOUIC_OPTIONS", 0);
-  this->SetPropertyDefault("AUTORCC_OPTIONS", 0);
-  this->SetPropertyDefault("LINK_DEPENDS_NO_SHARED", 0);
-  this->SetPropertyDefault("LINK_INTERFACE_LIBRARIES", 0);
-  this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
-  this->SetPropertyDefault("MACOSX_BUNDLE", 0);
-  this->SetPropertyDefault("MACOSX_RPATH", 0);
-  this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
-
+  if (this->GetType() != INTERFACE_LIBRARY)
+    {
+    this->SetPropertyDefault("INSTALL_NAME_DIR", 0);
+    this->SetPropertyDefault("INSTALL_RPATH", "");
+    this->SetPropertyDefault("INSTALL_RPATH_USE_LINK_PATH", "OFF");
+    this->SetPropertyDefault("SKIP_BUILD_RPATH", "OFF");
+    this->SetPropertyDefault("BUILD_WITH_INSTALL_RPATH", "OFF");
+    this->SetPropertyDefault("ARCHIVE_OUTPUT_DIRECTORY", 0);
+    this->SetPropertyDefault("LIBRARY_OUTPUT_DIRECTORY", 0);
+    this->SetPropertyDefault("RUNTIME_OUTPUT_DIRECTORY", 0);
+    this->SetPropertyDefault("PDB_OUTPUT_DIRECTORY", 0);
+    this->SetPropertyDefault("Fortran_FORMAT", 0);
+    this->SetPropertyDefault("Fortran_MODULE_DIRECTORY", 0);
+    this->SetPropertyDefault("GNUtoMS", 0);
+    this->SetPropertyDefault("OSX_ARCHITECTURES", 0);
+    this->SetPropertyDefault("AUTOMOC", 0);
+    this->SetPropertyDefault("AUTOUIC", 0);
+    this->SetPropertyDefault("AUTORCC", 0);
+    this->SetPropertyDefault("AUTOMOC_MOC_OPTIONS", 0);
+    this->SetPropertyDefault("AUTOUIC_OPTIONS", 0);
+    this->SetPropertyDefault("AUTORCC_OPTIONS", 0);
+    this->SetPropertyDefault("LINK_DEPENDS_NO_SHARED", 0);
+    this->SetPropertyDefault("LINK_INTERFACE_LIBRARIES", 0);
+    this->SetPropertyDefault("WIN32_EXECUTABLE", 0);
+    this->SetPropertyDefault("MACOSX_BUNDLE", 0);
+    this->SetPropertyDefault("MACOSX_RPATH", 0);
+    this->SetPropertyDefault("NO_SYSTEM_FROM_IMPORTED", 0);
+    }
 
   // Collect the set of configuration types.
   std::vector<std::string> configNames;
@@ -300,6 +302,11 @@ void cmTarget::SetMakefile(cmMakefile* mf)
     std::string configUpper = cmSystemTools::UpperCase(*ci);
     for(const char** p = configProps; *p; ++p)
       {
+      if (this->TargetTypeValue == INTERFACE_LIBRARY
+          && strcmp(*p, "MAP_IMPORTED_CONFIG_") != 0)
+        {
+        continue;
+        }
       std::string property = *p;
       property += configUpper;
       this->SetPropertyDefault(property.c_str(), 0);
@@ -311,7 +318,8 @@ void cmTarget::SetMakefile(cmMakefile* mf)
     // did not support this variable.  Projects may still specify the
     // property directly.  TODO: Make this depend on backwards
     // compatibility setting.
-    if(this->TargetTypeValue != cmTarget::EXECUTABLE)
+    if(this->TargetTypeValue != cmTarget::EXECUTABLE
+        && this->TargetTypeValue != cmTarget::INTERFACE_LIBRARY)
       {
       std::string property = cmSystemTools::UpperCase(*ci);
       property += "_POSTFIX";
@@ -352,16 +360,22 @@ void cmTarget::SetMakefile(cmMakefile* mf)
     this->InsertCompileOption(*it);
     }
 
-  this->SetPropertyDefault("C_VISIBILITY_PRESET", 0);
-  this->SetPropertyDefault("CXX_VISIBILITY_PRESET", 0);
-  this->SetPropertyDefault("VISIBILITY_INLINES_HIDDEN", 0);
+  if (this->GetType() != INTERFACE_LIBRARY)
+    {
+    this->SetPropertyDefault("C_VISIBILITY_PRESET", 0);
+    this->SetPropertyDefault("CXX_VISIBILITY_PRESET", 0);
+    this->SetPropertyDefault("VISIBILITY_INLINES_HIDDEN", 0);
+    }
 
   if(this->TargetTypeValue == cmTarget::SHARED_LIBRARY
       || this->TargetTypeValue == cmTarget::MODULE_LIBRARY)
     {
     this->SetProperty("POSITION_INDEPENDENT_CODE", "True");
     }
-  this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0);
+  if (this->GetType() != INTERFACE_LIBRARY)
+    {
+    this->SetPropertyDefault("POSITION_INDEPENDENT_CODE", 0);
+    }
 
   // Record current policies for later use.
 #define CAPTURE_TARGET_POLICY(POLICY) \
@@ -4433,7 +4447,8 @@ bool isLinkDependentProperty(cmTarget const* tgt, const std::string &p,
 bool cmTarget::IsLinkInterfaceDependentBoolProperty(const std::string &p,
                                            const char *config) const
 {
-  if (this->TargetTypeValue == OBJECT_LIBRARY)
+  if (this->TargetTypeValue == OBJECT_LIBRARY
+      || this->TargetTypeValue == INTERFACE_LIBRARY)
     {
     return false;
     }
@@ -4446,7 +4461,8 @@ bool cmTarget::IsLinkInterfaceDependentBoolProperty(const std::string &p,
 bool cmTarget::IsLinkInterfaceDependentStringProperty(const std::string &p,
                                     const char *config) const
 {
-  if (this->TargetTypeValue == OBJECT_LIBRARY)
+  if (this->TargetTypeValue == OBJECT_LIBRARY
+      || this->TargetTypeValue == INTERFACE_LIBRARY)
     {
     return false;
     }
@@ -4458,7 +4474,8 @@ bool cmTarget::IsLinkInterfaceDependentStringProperty(const std::string &p,
 bool cmTarget::IsLinkInterfaceDependentNumberMinProperty(const std::string &p,
                                     const char *config) const
 {
-  if (this->TargetTypeValue == OBJECT_LIBRARY)
+  if (this->TargetTypeValue == OBJECT_LIBRARY
+      || this->TargetTypeValue == INTERFACE_LIBRARY)
     {
     return false;
     }
@@ -4470,7 +4487,8 @@ bool cmTarget::IsLinkInterfaceDependentNumberMinProperty(const std::string &p,
 bool cmTarget::IsLinkInterfaceDependentNumberMaxProperty(const std::string &p,
                                     const char *config) const
 {
-  if (this->TargetTypeValue == OBJECT_LIBRARY)
+  if (this->TargetTypeValue == OBJECT_LIBRARY
+      || this->TargetTypeValue == INTERFACE_LIBRARY)
     {
     return false;
     }
@@ -5105,34 +5123,37 @@ bool cmTarget::ComputeLinkInterface(const char* config, LinkInterface& iface,
         {
         emitted.insert(*li);
         }
-      LinkImplementation const* impl = this->GetLinkImplementation(config,
-                                                                headTarget);
-      for(std::vector<std::string>::const_iterator
-            li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li)
+      if (this->GetType() != cmTarget::INTERFACE_LIBRARY)
         {
-        if(emitted.insert(*li).second)
+        LinkImplementation const* impl = this->GetLinkImplementation(config,
+                                                                  headTarget);
+        for(std::vector<std::string>::const_iterator
+              li = impl->Libraries.begin(); li != impl->Libraries.end(); ++li)
           {
-          if(cmTarget* tgt = this->Makefile->FindTargetToUse(li->c_str()))
+          if(emitted.insert(*li).second)
             {
-            // This is a runtime dependency on another shared library.
-            if(tgt->GetType() == cmTarget::SHARED_LIBRARY)
+            if(cmTarget* tgt = this->Makefile->FindTargetToUse(li->c_str()))
               {
-              iface.SharedDeps.push_back(*li);
+              // This is a runtime dependency on another shared library.
+              if(tgt->GetType() == cmTarget::SHARED_LIBRARY)
+                {
+                iface.SharedDeps.push_back(*li);
+                }
+              }
+            else
+              {
+              // TODO: Recognize shared library file names.  Perhaps this
+              // should be moved to cmComputeLinkInformation, but that creates
+              // a chicken-and-egg problem since this list is needed for its
+              // construction.
               }
-            }
-          else
-            {
-            // TODO: Recognize shared library file names.  Perhaps this
-            // should be moved to cmComputeLinkInformation, but that creates
-            // a chicken-and-egg problem since this list is needed for its
-            // construction.
             }
           }
-        }
-      if(this->LinkLanguagePropagatesToDependents())
-        {
-        // Targets using this archive need its language runtime libraries.
-        iface.Languages = impl->Languages;
+        if(this->LinkLanguagePropagatesToDependents())
+          {
+          // Targets using this archive need its language runtime libraries.
+          iface.Languages = impl->Languages;
+          }
         }
       }
     }
diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx
index 635d8cb..10663b7 100644
--- a/Source/cmVisualStudio10TargetGenerator.cxx
+++ b/Source/cmVisualStudio10TargetGenerator.cxx
@@ -184,7 +184,8 @@ void cmVisualStudio10TargetGenerator::WriteString(const char* line,
 void cmVisualStudio10TargetGenerator::Generate()
 {
   // do not generate external ms projects
-  if(this->Target->GetProperty("EXTERNAL_MSPROJECT"))
+  if(this->Target->GetType() == cmTarget::INTERFACE_LIBRARY
+      || this->Target->GetProperty("EXTERNAL_MSPROJECT"))
     {
     return;
     }
-- 
cgit v0.12