Browse Source

Fix CMake Internal Error from cmTarget::GetOutputInfo - triggered by calling GetLocation on a utility target - caused by custom command output file with same name as custom target. The fix is to avoid calling GetLocation unless the target is of a type that is expected to have a location...

David Cole 16 years ago
parent
commit
f199385605
3 changed files with 49 additions and 13 deletions
  1. 8 3
      Source/cmLocalGenerator.cxx
  2. 14 10
      Source/cmTarget.cxx
  3. 27 0
      Tests/CustomCommand/CMakeLists.txt

+ 8 - 3
Source/cmLocalGenerator.cxx

@@ -1837,12 +1837,17 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName,
     // found is part of the inName
     if(cmSystemTools::FileIsFullPath(inName))
       {
-      std::string tLocation = target->GetLocation(config);
-      tLocation = cmSystemTools::GetFilenamePath(tLocation);
+      std::string tLocation;
+      if(target->GetType() >= cmTarget::EXECUTABLE && 
+         target->GetType() <= cmTarget::MODULE_LIBRARY)
+        {
+        tLocation = target->GetLocation(config);
+        tLocation = cmSystemTools::GetFilenamePath(tLocation);
+        tLocation = cmSystemTools::CollapseFullPath(tLocation.c_str());
+        }
       std::string depLocation = cmSystemTools::GetFilenamePath(
         std::string(inName));
       depLocation = cmSystemTools::CollapseFullPath(depLocation.c_str());
-      tLocation = cmSystemTools::CollapseFullPath(tLocation.c_str());
       if(depLocation != tLocation)
         {
         // it is a full path to a depend that has the same name

+ 14 - 10
Source/cmTarget.cxx

@@ -1244,17 +1244,21 @@ bool cmTargetTraceDependencies::IsUtility(std::string const& dep)
     // the fact that the name matched a target was just a coincidence.
     if(cmSystemTools::FileIsFullPath(dep.c_str()))
       {
-      // This is really only for compatibility so we do not need to
-      // worry about configuration names and output names.
-      std::string tLocation = t->GetLocation(0);
-      tLocation = cmSystemTools::GetFilenamePath(tLocation);
-      std::string depLocation = cmSystemTools::GetFilenamePath(dep);
-      depLocation = cmSystemTools::CollapseFullPath(depLocation.c_str());
-      tLocation = cmSystemTools::CollapseFullPath(tLocation.c_str());
-      if(depLocation == tLocation)
+      if(t->GetType() >= cmTarget::EXECUTABLE && 
+         t->GetType() <= cmTarget::MODULE_LIBRARY)
         {
-        this->Target->AddUtility(util.c_str());
-        return true;
+        // This is really only for compatibility so we do not need to
+        // worry about configuration names and output names.
+        std::string tLocation = t->GetLocation(0);
+        tLocation = cmSystemTools::GetFilenamePath(tLocation);
+        std::string depLocation = cmSystemTools::GetFilenamePath(dep);
+        depLocation = cmSystemTools::CollapseFullPath(depLocation.c_str());
+        tLocation = cmSystemTools::CollapseFullPath(tLocation.c_str());
+        if(depLocation == tLocation)
+          {
+          this->Target->AddUtility(util.c_str());
+          return true;
+          }
         }
       }
     else

+ 27 - 0
Tests/CustomCommand/CMakeLists.txt

@@ -386,3 +386,30 @@ ADD_CUSTOM_TARGET(pre_check_command_line
   COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_BINARY_DIR}/check_mark.txt
   )
 ADD_DEPENDENCIES(do_check_command_line pre_check_command_line)
+
+# <SameNameTest>
+#
+# Add a custom target called "SameName" -- then add a custom command in a
+# different target whose output is a full-path file called "SameName" -- then
+# add a second custom target that depends on the full-path file ".../SameName"
+#
+# At first, this reproduces a bug reported by a customer. After fixing it,
+# having this test here makes sure it stays fixed moving forward.
+#
+ADD_CUSTOM_COMMAND(
+  OUTPUT SameName1.txt
+  COMMAND ${CMAKE_COMMAND} -E touch SameName1.txt
+  )
+ADD_CUSTOM_TARGET(SameName ALL
+  DEPENDS SameName1.txt
+  )
+
+ADD_CUSTOM_COMMAND(
+  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/subdir/SameName
+  COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/subdir/SameName
+  )
+ADD_CUSTOM_TARGET(DifferentName ALL
+  DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/subdir/SameName
+  )
+#
+# </SameNameTest>