diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 2909b332d..84de442f0 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -1857,6 +1857,22 @@ std::string cmLocalGenerator::GetRealDependency(const char* inName, // Look for a CMake target with the given name. if(cmTarget* target = this->GlobalGenerator->FindTarget(0, name.c_str())) { + // make sure it is not just a coincidence that the target name + // found is part of the inName + if(cmSystemTools::FileIsFullPath(inName)) + { + std::string tLocation = target->GetLocation(config); + tLocation = cmSystemTools::GetFilenamePath(tLocation); + std::string depLocation = cmSystemTools::GetFilenamePath( + std::string(inName)); + if(depLocation != tLocation) + { + // it is a full path to a depend that has the same name + // as a target but is in a different location so do not use + // the target as the depend + return inName; + } + } switch (target->GetType()) { case cmTarget::EXECUTABLE: diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index e7e3b9924..0033d16c1 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -229,16 +229,42 @@ void cmTarget::TraceVSDependencies(std::string projFile, // add its dependencies to the list to check unsigned int i; for (i = 0; i < outsf->GetCustomCommand()->GetDepends().size(); ++i) - { + { std::string dep = cmSystemTools::GetFilenameName( outsf->GetCustomCommand()->GetDepends()[i]); if (cmSystemTools::GetFilenameLastExtension(dep) == ".exe") { dep = cmSystemTools::GetFilenameWithoutLastExtension(dep); } - // watch for target dependencies, - if(this->Makefile->GetLocalGenerator()-> - GetGlobalGenerator()->FindTarget(0, dep.c_str())) + bool isUtility = false; + // see if we can find a target with this name + cmTarget* t = this->Makefile->GetLocalGenerator()-> + GetGlobalGenerator()->FindTarget(0, dep.c_str()); + if(t) + { + // if we find the target and the dep was given as a full + // path, then make sure it was not a full path to something + // else, and the fact that the name matched a target was + // just a coincident + if(cmSystemTools::FileIsFullPath( + outsf->GetCustomCommand()->GetDepends()[i].c_str())) + { + std::string tLocation = t->GetLocation(0); + tLocation = cmSystemTools::GetFilenamePath(tLocation); + std::string depLocation = cmSystemTools::GetFilenamePath( + std::string(outsf->GetCustomCommand()->GetDepends()[i].c_str())); + if(depLocation == tLocation) + { + isUtility = true; + } + } + // if it was not a full path then it must be a target + else + { + isUtility = true; + } + } + if(isUtility) { // add the depend as a utility on the target this->AddUtility(dep.c_str());