From f199385605b228d73060f87647922fbe4c17779c Mon Sep 17 00:00:00 2001 From: David Cole Date: Fri, 25 Sep 2009 13:23:19 -0400 Subject: [PATCH] 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... --- Source/cmLocalGenerator.cxx | 11 ++++++++--- Source/cmTarget.cxx | 24 ++++++++++++++---------- Tests/CustomCommand/CMakeLists.txt | 27 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 7589520f5..e24c52d04 100644 --- a/Source/cmLocalGenerator.cxx +++ b/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 diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index 388225334..089064417 100644 --- a/Source/cmTarget.cxx +++ b/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 diff --git a/Tests/CustomCommand/CMakeLists.txt b/Tests/CustomCommand/CMakeLists.txt index f76bbd57b..664b5073a 100644 --- a/Tests/CustomCommand/CMakeLists.txt +++ b/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) + +# +# +# 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 + ) +# +#