Browse Source

Remove INTERFACE build targets.

Commit b04f3b9a (Create make rules for INTERFACE_LIBRARY
targets., 2013-08-21) extended the makefile generator to create
build targets for INTERFACE_LIBRARY targets. No other generators
were extended with this feature.

This conflicts with the feature of whitelisting of target properties
read from INTERFACE_LIBRARY targets. The INTERFACE_* properties
of the INTERFACE_LIBRARY may legitimately contain TARGET_PROPERTY
generator expressions for reading properties from the 'head target'.
The 'head target' would be the INTERFACE_LIBRARY itself when creating
the build rules for it, which means that non-whitelisted properties
would be read.
Stephen Kelly 12 years ago
parent
commit
97fae68b81

+ 7 - 18
Source/cmComputeTargetDepends.cxx

@@ -199,6 +199,10 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
 {
   // Get the depender.
   cmTarget* depender = this->Targets[depender_index];
+  if (depender->GetType() == cmTarget::INTERFACE_LIBRARY)
+    {
+    return;
+    }
 
   // Loop over all targets linked directly in all configs.
   // We need to make targets depend on the union of all config-specific
@@ -208,15 +212,7 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
   std::set<cmStdString> emitted;
   {
   std::vector<std::string> tlibs;
-  if (depender->GetType() == cmTarget::INTERFACE_LIBRARY)
-    {
-    // For INTERFACE_LIBRARY depend on the interface instead.
-    depender->GetInterfaceLinkLibraries(0, tlibs, depender);
-    }
-  else
-    {
-    depender->GetDirectLinkLibraries(0, tlibs, depender);
-    }
+  depender->GetDirectLinkLibraries(0, tlibs, depender);
   // A target should not depend on itself.
   emitted.insert(depender->GetName());
   for(std::vector<std::string>::const_iterator lib = tlibs.begin();
@@ -237,15 +233,8 @@ void cmComputeTargetDepends::CollectTargetDepends(int depender_index)
     it != configs.end(); ++it)
     {
     std::vector<std::string> tlibs;
-    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);
-      }
+    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();

+ 37 - 55
Source/cmGlobalUnixMakefileGenerator3.cxx

@@ -480,7 +480,6 @@ cmGlobalUnixMakefileGenerator3
        (l->second->GetType() == cmTarget::SHARED_LIBRARY) ||
        (l->second->GetType() == cmTarget::MODULE_LIBRARY) ||
        (l->second->GetType() == cmTarget::OBJECT_LIBRARY) ||
-       (l->second->GetType() == cmTarget::INTERFACE_LIBRARY) ||
        (l->second->GetType() == cmTarget::UTILITY))
       {
       if(l->second->Target->IsImported())
@@ -658,7 +657,6 @@ cmGlobalUnixMakefileGenerator3
           (t->second->GetType() == cmTarget::SHARED_LIBRARY) ||
           (t->second->GetType() == cmTarget::MODULE_LIBRARY) ||
           (t->second->GetType() == cmTarget::OBJECT_LIBRARY) ||
-          (t->second->GetType() == cmTarget::INTERFACE_LIBRARY) ||
           (t->second->GetType() == cmTarget::UTILITY)))
         {
         // Add a rule to build the target by name.
@@ -680,10 +678,6 @@ cmGlobalUnixMakefileGenerator3
                           t->second->GetName(), depends, commands,
                           true);
 
-        if (t->second->GetType() == cmTarget::INTERFACE_LIBRARY)
-          {
-          continue;
-          }
         // Add a fast rule to build the target
         std::string localName =
                           lg->GetRelativeTargetDirectory(*t->second->Target);
@@ -757,7 +751,6 @@ cmGlobalUnixMakefileGenerator3
         || (t->second->GetType() == cmTarget::SHARED_LIBRARY)
         || (t->second->GetType() == cmTarget::MODULE_LIBRARY)
         || (t->second->GetType() == cmTarget::OBJECT_LIBRARY)
-        || (t->second->GetType() == cmTarget::INTERFACE_LIBRARY)
         || (t->second->GetType() == cmTarget::UTILITY)))
       {
       std::string makefileName;
@@ -774,64 +767,53 @@ cmGlobalUnixMakefileGenerator3
         << localName << "\n\n";
 
       commands.clear();
+      makeTargetName = localName;
+      makeTargetName += "/depend";
+      commands.push_back(lg->GetRecursiveMakeCall
+                         (makefileName.c_str(),makeTargetName.c_str()));
 
-      if(t->second->GetType() != cmTarget::INTERFACE_LIBRARY)
+      // add requires if we need it for this generator
+      if (needRequiresStep)
         {
         makeTargetName = localName;
-        makeTargetName += "/depend";
+        makeTargetName += "/requires";
         commands.push_back(lg->GetRecursiveMakeCall
                           (makefileName.c_str(),makeTargetName.c_str()));
+        }
+      makeTargetName = localName;
+      makeTargetName += "/build";
+      commands.push_back(lg->GetRecursiveMakeCall
+                         (makefileName.c_str(),makeTargetName.c_str()));
 
-        // add requires if we need it for this generator
-        if (needRequiresStep)
-          {
-          makeTargetName = localName;
-          makeTargetName += "/requires";
-          commands.push_back(lg->GetRecursiveMakeCall
-                            (makefileName.c_str(),makeTargetName.c_str()));
-          }
-        makeTargetName = localName;
-        makeTargetName += "/build";
-        commands.push_back(lg->GetRecursiveMakeCall
-                            (makefileName.c_str(),makeTargetName.c_str()));
-
-        // Write the rule.
-        localName += "/all";
-        depends.clear();
+      // Write the rule.
+      localName += "/all";
+      depends.clear();
 
-        std::string progressDir =
-          lg->GetMakefile()->GetHomeOutputDirectory();
-        progressDir += cmake::GetCMakeFilesDirectory();
+      std::string progressDir =
+        lg->GetMakefile()->GetHomeOutputDirectory();
+      progressDir += cmake::GetCMakeFilesDirectory();
+        {
+        cmOStringStream progCmd;
+        progCmd << "$(CMAKE_COMMAND) -E cmake_progress_report ";
+        // all target counts
+        progCmd << lg->Convert(progressDir.c_str(),
+                                cmLocalGenerator::FULL,
+                                cmLocalGenerator::SHELL);
+        progCmd << " ";
+        std::vector<unsigned long>& progFiles =
+          this->ProgressMap[t->second->Target].Marks;
+        for (std::vector<unsigned long>::iterator i = progFiles.begin();
+              i != progFiles.end(); ++i)
           {
-          cmOStringStream progCmd;
-          progCmd << "$(CMAKE_COMMAND) -E cmake_progress_report ";
-          // all target counts
-          progCmd << lg->Convert(progressDir.c_str(),
-                                  cmLocalGenerator::FULL,
-                                  cmLocalGenerator::SHELL);
-          progCmd << " ";
-          std::vector<unsigned long>& progFiles =
-            this->ProgressMap[t->second->Target].Marks;
-          for (std::vector<unsigned long>::iterator i = progFiles.begin();
-                i != progFiles.end(); ++i)
-            {
-            progCmd << " " << *i;
-            }
-          commands.push_back(progCmd.str());
+          progCmd << " " << *i;
           }
-        progressDir = "Built target ";
-        progressDir += t->second->GetName();
-        lg->AppendEcho(commands,progressDir.c_str());
-        }
-      else
-        {
-        depends.clear();
+        commands.push_back(progCmd.str());
         }
+      progressDir = "Built target ";
+      progressDir += t->second->GetName();
+      lg->AppendEcho(commands,progressDir.c_str());
+
       this->AppendGlobalTargetDepends(depends,*t->second->Target);
-      if(depends.empty() && this->EmptyRuleHackDepends != "")
-        {
-        depends.push_back(this->EmptyRuleHackDepends);
-        }
       lg->WriteMakeRule(ruleFileStream, "All Build rule for target.",
                         localName.c_str(), depends, commands, true);
 
@@ -847,7 +829,7 @@ cmGlobalUnixMakefileGenerator3
 
       // Write the rule.
       commands.clear();
-      std::string progressDir = lg->GetMakefile()->GetHomeOutputDirectory();
+      progressDir = lg->GetMakefile()->GetHomeOutputDirectory();
       progressDir += cmake::GetCMakeFilesDirectory();
 
       {

+ 0 - 1
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -388,7 +388,6 @@ void cmLocalUnixMakefileGenerator3
        (t->second->GetType() == cmTarget::SHARED_LIBRARY) ||
        (t->second->GetType() == cmTarget::MODULE_LIBRARY) ||
        (t->second->GetType() == cmTarget::OBJECT_LIBRARY) ||
-       (t->second->GetType() == cmTarget::INTERFACE_LIBRARY) ||
        (t->second->GetType() == cmTarget::UTILITY))
       {
       if (t->second->Target->IsImported())

+ 0 - 3
Source/cmMakefileLibraryTargetGenerator.cxx

@@ -85,9 +85,6 @@ void cmMakefileLibraryTargetGenerator::WriteRuleFiles()
     case cmTarget::OBJECT_LIBRARY:
       this->WriteObjectLibraryRules();
       break;
-    case cmTarget::INTERFACE_LIBRARY:
-      // Nothing to do.
-      break;
     default:
       // If language is not known, this is an error.
       cmSystemTools::Error("Unknown Library Type");

+ 0 - 1
Source/cmMakefileTargetGenerator.cxx

@@ -76,7 +76,6 @@ cmMakefileTargetGenerator::New(cmGeneratorTarget *tgt)
     case cmTarget::SHARED_LIBRARY:
     case cmTarget::MODULE_LIBRARY:
     case cmTarget::OBJECT_LIBRARY:
-    case cmTarget::INTERFACE_LIBRARY:
       result = new cmMakefileLibraryTargetGenerator(tgt);
       break;
     case cmTarget::UTILITY:

+ 0 - 18
Tests/CMakeLists.txt

@@ -285,24 +285,6 @@ if(BUILD_TESTING)
       PASS_REGULAR_EXPRESSION "(file is not of required architecture|does not match cputype|not the architecture being linked)")
   endif()
 
-  if(CMAKE_TEST_GENERATOR MATCHES Make)
-    set(InterfaceBuildTargets_libname testlib)
-    if (CMAKE_TEST_GENERATOR MATCHES "Borland|Watcom")
-      set(InterfaceBuildTargets_libname testlib.lib)
-    endif()
-    add_test(InterfaceBuildTargets ${CMAKE_CTEST_COMMAND}
-      --build-and-test
-      "${CMake_SOURCE_DIR}/Tests/InterfaceBuildTargets"
-      "${CMake_BINARY_DIR}/Tests/InterfaceBuildTargets"
-      --build-two-config
-      ${build_generator_args}
-      --build-project InterfaceBuildTargets
-      --build-options ${build_options}
-      --test-command ${CMAKE_CMAKE_COMMAND} -E touch_nocreate ${InterfaceBuildTargets_libname}
-      )
-    list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/InterfaceBuildTargets")
-  endif()
-
   list(APPEND TEST_BUILD_DIRS ${CMake_TEST_INSTALL_PREFIX})
 
   if(NOT QT4_FOUND)

+ 0 - 13
Tests/InterfaceBuildTargets/CMakeLists.txt

@@ -1,13 +0,0 @@
-project(InterfaceBuildTargets)
-
-add_library(testlib EXCLUDE_FROM_ALL testlib.cxx)
-set_property(TARGET testlib PROPERTY PREFIX "")
-if(CMAKE_GENERATOR MATCHES "Borland|Watcom")
-  # These librarians add the .lib suffix anyway.
-  set_property(TARGET testlib PROPERTY SUFFIX ".lib")
-else()
-  set_property(TARGET testlib PROPERTY SUFFIX "")
-endif()
-
-add_library(iface INTERFACE)
-target_link_libraries(iface INTERFACE testlib)

+ 0 - 5
Tests/InterfaceBuildTargets/main.cxx

@@ -1,5 +0,0 @@
-
-int main(int, char**)
-{
-  return 0;
-}

+ 0 - 5
Tests/InterfaceBuildTargets/testlib.cxx

@@ -1,5 +0,0 @@
-
-void testlib(void)
-{
-
-}

+ 14 - 0
Tests/InterfaceLibrary/CMakeLists.txt

@@ -13,3 +13,17 @@ add_subdirectory(libsdir)
 
 add_executable(sharedlibtestexe sharedlibtestexe.cpp)
 target_link_libraries(sharedlibtestexe shared_iface)
+
+add_library(broken EXCLUDE_FROM_ALL broken.cpp)
+
+add_library(iface_broken INTERFACE)
+# This is not a dependency, so broken will not be built (and the error in
+# it will not be hit)
+target_link_libraries(iface_broken INTERFACE broken)
+
+add_library(iface_whitelist INTERFACE)
+# The target property CUSTOM will never be evaluated on the INTERFACE library.
+target_link_libraries(iface_whitelist INTERFACE $<$<BOOL:$<TARGET_PROPERTY:CUSTOM>>:irrelevant>)
+
+add_executable(exec_whitelist dummy.cpp)
+target_link_libraries(exec_whitelist iface_whitelist)

+ 2 - 0
Tests/InterfaceLibrary/broken.cpp

@@ -0,0 +1,2 @@
+
+#error Broken

+ 5 - 0
Tests/InterfaceLibrary/dummy.cpp

@@ -0,0 +1,5 @@
+
+int main(int, char **)
+{
+  return 0;
+}